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