【发布时间】:2020-04-20 20:33:51
【问题描述】:
我要解决的问题是“如何创建一系列自动化代码,从数据集中提取所需的列标题名称以适应一般线性化模型 (glm)?”我有一个包含 8 个变量的数据集;但是,我只想使用其中的 3 个来交叉验证并找到“最佳”模型。这是我想出的:
library(boot)
salary <- read.csv("salary_data.csv")
vars <- colnames(salary[c(2,3,7)])
nvars <- length(vars)
list.to.expand = vector(mode = "list", length = nvars)
for (i in 1:nvars){
list.to.expand[[i]]=c(0,1)
}
model.spec.matrix <- expand.grid(list.to.expand)
vars
model.spec.matrix
names(model.spec.matrix) <- vars
vars.to.use <- model.spec.matrix[2,]
vars.to.use <- as.numeric(vars.to.use)
cn <- c()
for (i in 1:nrow(model.spec.matrix)){
if(i==1){cn <- colnames(model.spec.matrix[sapply(model.spec.matrix[i,], function(x) x > 0)])
}
}
print(cn)
paste(cn, collapse = "+")
glm.out = glm(paste("LogACG~",paste(cn,collapse = "+"),sep = ""), family = gaussian, data = salary)
cv.err = cv.glm(salary, glm.out, K = 10)$delta[1]
我的问题在于 for 循环。我试图构建一个循环,它将“vars”中的值附加到“model.use”中,但我似乎无法让它读取矩阵中的第二行。有什么建议么?谢谢
【问题讨论】:
-
我会删除我在答案中给你的代码,以便问题和答案仍然有意义。你在第一行得到
character(0)的原因是矩阵的第一行没有指定的列(0 0 0)所以这就是为什么我在它后面加上一行(if(length(cn) == 0){cn <- "."})
标签: r for-loop if-statement cross-validation