将指示符矩阵与R中的列名对应

将指示符矩阵与R中的列名对应,r,for-loop,if-statement,cross-validation,R,For Loop,If Statement,Cross Validation,我试图解决的问题是“如何创建一系列自动化的代码,从数据集中提取所需的列标题名称,以适应通用线性化模型(glm)”,我有一个包含8个变量的数据集;然而,我只想使用其中的3个来交叉验证并找到“最佳”模型。以下是我的想法: library(boot) 名称(model.spec.matrix)这里似乎发生了一些事情 您已经在第二行到最后一行("LogACG ~,但它也是最终进入模型的变量之一。变量因为vars是的,我同意你的观点,并看到了它是如何工作的。然而,我必须能够自动执行代码,这样,如果我拉入

我试图解决的问题是“如何创建一系列自动化的代码,从数据集中提取所需的列标题名称,以适应通用线性化模型(glm)”,我有一个包含8个变量的数据集;然而,我只想使用其中的3个来交叉验证并找到“最佳”模型。以下是我的想法:

library(boot)

名称(model.spec.matrix)这里似乎发生了一些事情


您已经在第二行到最后一行(
"LogACG ~
,但它也是最终进入
模型的
变量之一。变量
因为
vars是的,我同意你的观点,并看到了它是如何工作的。然而,我必须能够自动执行代码,这样,如果我拉入一个包含100个变量的数据集,我就可以轻松地拉入我想要使用的变量并将它们粘贴到glm.Th中提供的e glm函数要求我每次都重写它,这是我试图避免的。谢谢。我用您在响应中创建的cn变量替换了model.vars变量。但是,当我运行for循环时,cn变量返回字符(0)当我打印它时。请参阅问题中上面我编辑的代码。谢谢。谢谢!因此,如果我想显示来自上述代码中每个可能模型的错误项的绘图,我该怎么做?我想确定所有模型中只有主效应的最小错误(根据model.spec.matrix行1和0,包括和排除变量)。太好了。谢谢你的帮助,我无法告诉你我有多感激。还有一件事:那么我如何从glm.out到cv.glm运行这些模型并将错误存储在向量中?我会删除我在答案中给你的代码,这样问题和答案仍然有意义。你得到
字符(0)的原因是什么
第一行是指矩阵的第一行没有指定的列(
0
),因此我在它后面有一行(
if(length(cn)==0){cn
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]
# Since you can't use LogACG to explain itself, 
#    suppose you meant to use Engineering as a candidate X
vars <- colnames(salary[c(2,3,8)])

# Make your grid
model.spec.matrix        <- expand.grid(list.to.expand)
names(model.spec.matrix) <- vars

glm.out <- list(rep(NA, nrow(model.spec.matrix)))
cv.err  <- list(rep(NA, nrow(model.spec.matrix)))

for(i in 1:nrow(model.spec.matrix)){
  cn <- colnames(model.spec.matrix[sapply(model.spec.matrix[i,], function(x) x > 0)])
  if(length(cn) == 0){cn <- "."}  
  tmp        <- glm(as.formula(paste("LogACG~",paste(cn,collapse = "+"),sep = "")), family = gaussian, data = salary)
  glm.out[i] <- capture.output(tmp$formula)
}
# > glm.out
# [[1]]
# [1] "LogACG ~ ."
# 
# [[2]]
# [1] "LogACG ~ Rank_Code"
# 
# [[3]]
# [1] "LogACG ~ Gender"
# 
# [[4]]
# [1] "LogACG ~ Rank_Code + Gender"
# 
# [[5]]
# [1] "LogACG ~ Engineering"
# 
# [[6]]
# [1] "LogACG ~ Rank_Code + Engineering"
# 
# [[7]]
# [1] "LogACG ~ Gender + Engineering"
# 
# [[8]]
# [1] "LogACG ~ Rank_Code + Gender + Engineering"
glm.out[i] <- capture.output(tmp$formula)
glm.out    <- append(glm.out, tmp)
for(i in 1:nrow(model.spec.matrix)){
  cn <- colnames(model.spec.matrix[sapply(model.spec.matrix[i,], function(x) x > 0)])
  if(length(cn) == 0){cn <- "."}  
  tmp        <- glm(as.formula(paste("LogACG~",paste(cn,collapse = "+"),sep = "")), family = gaussian, data = salary)
  tmp1       <- cv.glm(salary, tmp, K = 10)$delta[1]
  glm.out    <- append(glm.out, tmp)
  cv.err     <- append(cv.err, tmp1)
}

> tail(cv.err)
[[1]]
[1] 2.751025

[[2]]
[1] 2.758954

[[3]]
[1] 2.735063

[[4]]
[1] 2.768075

[[5]]
[1] 2.774433

[[6]]
[1] 2.748291