在 R 的线性模型中通过数字索引设置因变量

Setting dependent variable via numeric indexing in linear model in R

我正在尝试将列(或特定向量元素)的名称设置为 R 线性模型中的因变量 (DV)。

当我通过键入 "ITEM26" 手动执行此操作时,没有任何错误。 DV (y) 是 ITEM26,预测变量是数据框中的所有其他变量。

> lm(ITEM26 ~ ., data = M.compsexitems)

我现在想使用 colnames 函数和数字索引在线性模型中设置 DV,当我引用第一个元素时它提供 "ITEM26" 的输出。 (我的最终目标是设置一个for循环,这样我可以快速将所有列名设置为单独线性模型的DV。)

> colnames(M.compsexitems)[1]
[1] "ITEM26"

但是,当我尝试使用 colnames 函数和数字索引建立线性模型时,出现错误。

> lm(colnames(M.compsexitems)[1] ~ ., data = M.compsexitems)
Error in model.frame.default(formula = colnames(M.compsexitems)[1] ~ ., : 
  variable lengths differ (found for 'ITEM26')

如果我手动创建项目名称向量 (sexitems),并通过索引引用向量中的特定元素,我会得到同样的错误。

> sexitems
 [1] "ITEM26" "ITEM27" 

> summary(lm(sexitems[1] ~ ., data = M.compsexitems))$r.squared 
Error in model.frame.default(formula = sexitems[1] ~ ., data = M.compsexitems,  : 
  variable lengths differ (found for 'ITEM26')

有谁知道为什么会出现这个错误,或者如何克服这个错误?我感觉 lm 函数没有像对待数据框中的变量一样对待索引向量元素,但我不确定为什么。

上述问题成立的示例虚拟数据框:

> M.compsexitems
  ITEM26         ITEM27
1          2          4
2          3          5

提前感谢您的帮助。

运行 lm 使用第一列作为因变量,所有其他列作为自变量可以这样做:

fm <- lm(M.compsexitems)

给予:

> fm
Call:
lm(formula = M.compsexitems)

Coefficients:
(Intercept)       ITEM27  
         -2            1 

如果需要显式获取公式:

fo <- formula(fm)

给予:

> fo
ITEM26 ~ ITEM27
<environment: 0x000000000e2f2b50>

如果你想让上面的公式明确出现在lm的输出中,那么:

do.call("lm", list(fo, quote(M.compsexitems)))

给予:

Call:
lm(formula = ITEM26 ~ ITEM27, data = M.compsexitems)

Coefficients:
(Intercept)       ITEM27  
         -2            1  

如果这是一个巨大的回归,并且您不想 运行 两次大型计算,那么 运行 第一次使用 head(M.compsexitems) 或从字符串构造公式:

fo <- formula(paste(names(M.compsexitems)[1], "~."))
do.call("lm", list(fo, quote(M.compsexitems)))

给予:

Call:
lm(formula = ITEM26 ~ ., data = M.compsexitems)

Coefficients:
(Intercept)       ITEM27  
         -2            1  

备注

使用的可重现形式的输入 M.compsexitems 是:

Lines <- "
  ITEM26         ITEM27
1          2          4
2          3          5"
M.compsexitems <- read.table(text = Lines)