2014-02-14 154 views
1

R_blogger提供了以下代碼,其中我的添加因爲不起作用而被註釋掉;我正在尋找一種方法來保存來自迭代logistic迴歸的係數向量和p值,這樣我就可以修剪始終得分不佳的變量。套袋logistic迴歸r

predictions <- foreach(m=1:iterations,.combine=cbind) %do% { 
    training_positions <- sample(nrow(training2), size=floor((nrow(training2)/length_divisor))) 
    train_pos<-1:nrow(training2) %in% training_positions 
    glm_fit <- glm(default~. ,data=training2[train_pos,],family=binomial(logit), 
       type=response, control = list(maxit = 25)) 
    predict(glm_fit,newdata=testing) 
    #pvalues <- summary(glm_fit)$coeff[-1,4] < 0.0001 
    #coeffs <- summary(glm_fit)$coeff[-1,3] 
    } 
probs <- rowMeans(predictions) 

我希望能夠做檢索與此類似反應是基於在評論交流返工預測

+0

將您感興趣的所有內容返回到'list'並更改'.combine'參數。 – Roland

+0

爲什麼你想要p值?通常,我們通過查看可變重要性統計數據來確定哪些變量在預測響應方面看起來最重要。在** caret包中已經有了這個罐頭函數,我建議你看一看;它可以與袋裝模型一起使用,如: –

+0

@Roland如何更改組合參數? Doc的文件很粗略。 Thx – Elliott

回答

1

NB係數和P值的對象。

所以有幾件事情在這裏。

  1. 我假定您提供的數據集training應該與您的代碼中的training2相同。這個數據集中的第一列是一個id,你的代碼將把它作爲fit中的一個參數。那是你想要的?
  2. 用於提取行樣本的代碼不必要的複雜。您生成一個介於1和nrow(training2)之間的整數樣本,並從中生成一個邏輯向量length=nrow(training2)。你不需要這樣做:只需使用整數向量來指示訓練2。這是很多更快,尤其是對於如此大的數據集。
  3. 當嘗試使用如此大量的參數(> 1400)擬合時,glm(...)似乎想要初始估算平均值。我沒有花費時間,只是將模型限制在前9個參數(列2:10)。
  4. 在調用glm(..)時使用type=predict影響如何使用權重。你沒有使用權重,所以這個參數什麼都不做。
  5. 但是,在致predict(...)需要指定type="predict"
  6. 使用maxit = 25通常意味着擬合沒有收斂,所以你需要嘗試一下。
  7. 在我嘗試過的一小組迭代中,沒有一個係數具有p<0.0001,所以爲了示例的緣故,我將截斷值更改爲0.1。
  8. 最後,使用return(list(...))如在下面的代碼,以及改變.combine=cbind.combine=rbind返回列表對象的數組,其中每個對應於迭代,且將列1具有預測對於該次迭代,第2列的矢量具有該迭代的p值向量,並且第3列具有該迭代的係數向量。

下面的代碼:

library(foreach) 
set.seed(1) 
training2  <- training 
length_divisor <- 1000 
iterations  <- 5 
predictions <- foreach(m=1:iterations,.combine=rbind) %do% { 
    training_positions <- sample(nrow(training2), 
           size=floor((nrow(training2)/length_divisor))) 
# train_pos<-1:nrow(training2) %in% training_positions 
    glm_fit <- glm(default~ . , 
       data=training2[training_positions,c(2:10,ncol(training2))], 
       family=binomial(logit), 
       control = list(maxit = 25)) 
    pr <- predict(glm_fit, 
       newdata=training2[sample(1:nrow(training2),10),], 
       type="response") 
    s <- summary(glm_fit) 
    p <- s$coeff[,4] 
    c <- s$coeff[,1] 
    pvalues <- p[p<0.1] 
    coeffs <- c[p<0.1] 
    return(list(pr,pvalues,coeffs)) 
} 
predictions 
#   [,1]  [,2]  [,3]  
# result.1 Numeric,10 Numeric,0 Numeric,0 
# result.2 Numeric,10 Numeric,0 Numeric,0 
# result.3 Numeric,10 Numeric,2 Numeric,2 
# result.4 Numeric,10 Numeric,0 Numeric,0 
# result.5 Numeric,10 Numeric,0 Numeric,0 
在該佈置

所以,predictions[,1]是所有的預測向量的列表,prediction[,2]是所有p值< 0.1對於每次迭代的列表,和prediction[,3]是每個迭代的p值爲< 0.1的所有係數的列表。

+0

這不會每次都覆蓋嗎?我想我需要一些方法讓他們結合起來。看到@Roland的評論 – Elliott

+0

好吧,既然你沒有提供一個可重複的例子,我不確定你想要做什麼。這段代碼將提取p <0.0001(換句話說,高精度係數)的每個擬合的p值和係數。爲了迴應這個,連同預測,試着:'c(預測(glm_fit,newdata = testing),pvalues,coeffs)'作爲功能塊中的最後一個語句。我實際上不能測試任何東西,因爲你沒有提供數據,你的代碼也不能按原樣運行。 – jlhoward

+0

thx,我已經嘗試加入 list <-c(預測循環和添加.multicombine = TRUE在選項,但名單沒有彙總 – Elliott