循环变量名以运行线性回归模型

3

首先,我对这个很新,所以我的方法/思路可能是错误的。我已经使用R和R Studio将xlsx数据集导入到数据框中。我希望能够循环遍历列名,以获取所有变量中确切包含 "10" 的变量,以便运行简单的线性回归。下面是我的代码:

indx <- grepl('_10_', colnames(data)) #list returns all of the true values in the data set
col10 <- names(data[indx]) #this gives me the names of the columns I want

这是我的for循环,它返回一个错误:
temp <- c()
for(i in 1:length(col10)){
   temp = col10[[i]]
  lm.test <- lm(Total_Transactions ~ temp[[i]], data = data)
  print(temp) #actually prints out the right column names
  i + 1
}

是否有可能运行一个循环将这些变量放入线性回归模型中?我得到的错误是:"model.frame.default(formula = Total_Transactions ~ temp[[i]], : variable lengths differ (found for 'temp[[i]]')"。如果有人能指导我正确的方向,我将非常感激。谢谢。


看一下这个问题。如果你还需要帮助,请告诉我。 - Rui Barradas
@RuiBarradas 我尝试了那段代码,但是在最后一行 res.models[["mpg~disp"]],我希望它能够添加所有变量的名称,例如 [[mpg~disp+x2+x3+....x18]。 - Stick
2个回答

7

好的,我将发布一篇答案。我会以数据集mtcars为例进行说明。我相信它适用于你的数据集。
首先,我创建了一个存储器,lm.test,这是一个类list的对象。在你的代码中,你每次通过循环给lm(.)分配输出,并且最终你只会得到最后一个,其他所有的都被新的覆盖了。
然后,在循环内部,我使用函数reformulate来组合回归公式。还有其他的做法,但这个比较简单。

# Use just some columns
data <- mtcars[, c("mpg", "cyl", "disp", "hp", "drat", "wt")]
col10 <- names(data)[-1]

lm.test <- vector("list", length(col10))

for(i in seq_along(col10)){
    lm.test[[i]] <- lm(reformulate(col10[i], "mpg"), data = data)
}

lm.test

现在你可以使用结果列表进行各种操作。我建议你开始使用 lapply 和相关函数。
例如,提取系数:
cfs <- lapply(lm.test, coef)

为了获取摘要信息:
smry <- lapply(lm.test, summary)

一旦您熟悉了*apply函数,这个问题就变得非常简单了。

谢谢!我将这个实现到我的代码中,效果非常好!我使用了自己的前两行代替你的来获取所有列,但它仍然有效。 - Stick
能否将摘要合并呢?如果不行也没关系。 - Stick
1
尝试一下 do.call(rbind, lapply(smry, [[, "coefficients")) - Rui Barradas

2

您可以创建一个临时子集,仅选择回归中使用的列。这样,您就不需要在公式中注入临时名称。

按照您的代码,应该可以解决问题。

for(i in 1:length(col10)){
 tempSubset <- data[,c("Total_Transactions", col10[i]]
 lm.test <- lm(Total_Transactions ~ ., data = tempSubset)
 i + 1
}

这创建的子集仅为“Total_Transactions”和“col10”中的最后一个变量。 - Stick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接