1

R_blogger 提供了以下代码,其中我的添加被注释掉了,因为它们不起作用;我正在寻找一种从迭代逻辑回归中保存系数向量和 p 值的方法,这样我就可以修剪那些一直得分不佳的变量。

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)

我希望能够检索类似于预测的系数和 p 值的对象

4

1 回答 1

1

注意此响应已根据评论中的交流进行了重新设计。

所以这里发生了几件事。

  1. 我假设training您提供的数据集应该与training2您的代码中的相同。此数据集中的第一列是一个 id,您的代码会将其作为参数包含在拟合中。那是你想要的吗??
  2. 您用于提取行样本的代码过于复杂。您生成一个介于 1 和 之间的整数样本nrow(training2),并从中生成一个带有 的逻辑向量length=nrow(training2)。您不需要这样做:只需使用整数向量来索引 training2。它快得多,尤其是对于如此大的数据集。
  3. 当尝试使用如此大量的参数(> 1400)进行拟合时,glm(...)似乎需要对均值进行初始估计。我没有花时间在上面,而是将模型限制为前 9 个参数(第 2:10 列)。
  4. type=predict在调用中使用glm(..)会影响权重的使用方式。你没有使用权重,所以这个参数什么都不做。
  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 的所有系数的列表。

于 2014-02-14T17:58:59.323 回答