【问题标题】:bagging logistic regression in rr中的装袋逻辑回归
【发布时间】:2017-08-09 22:19:18
【问题描述】:

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 值检索对象

【问题讨论】:

  • list 中返回您感兴趣的所有内容并更改.combine 参数。
  • 为什么需要 p 值?通常,人们会查看变量重要性统计数据,以确定哪些变量在预测响应方面看起来最重要。 caret 包中已经有为此的罐头功能,我建议您看一下;它可以与诸如此类的袋装模型一起使用...
  • @Roland 如何更改组合参数?上面的文档是粗略的。谢谢

标签: r logistic-regression


【解决方案1】:

注意此响应已根据 cmets 中的交换进行了修改。

所以这里发生了几件事。

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

【讨论】:

  • 这不是每次都会覆盖吗?我想我需要一些方法让它们结合起来。请参阅上面的评论@Roland
  • 好吧,由于您没有提供可重现的示例,我不确定您要做什么。此代码将提取 pc(predict(glm_fit,newdata=testing),pvalues, coeffs) 作为功能块中的最后一条语句。我实际上无法测试任何东西,因为您没有提供数据并且您的代码没有按原样运行。
  • thx,我已经尝试添加列表
  • “聚合”是什么意思?此代码应生成一个列表列表 (predications),其中每个元素都有该迭代的预测、p 值和系数。没有“聚合”。您稍后需要这样做。如果这是为了弄清楚要保留哪些参数,您应该使用stepAIC(...)
  • 数据:dropbox.com/s/brcwxvs9oodrdtj/training.RData 原始代码生成nxm的数据框,其中n是被预测的(行)数,m=迭代。当我使用 list 语句运行时,结果列表是 nx1,所以它不是 combining (聚合错误的单词)。您将需要从上面创建训练和测试数据集。如果您修复,请提前感谢
猜你喜欢
  • 2021-05-20
  • 2014-03-12
  • 2018-01-26
  • 2018-02-12
  • 2014-06-20
  • 2021-11-13
  • 1970-01-01
  • 2014-06-26
  • 2019-08-20
相关资源
最近更新 更多