1

我试图在 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

预先感谢您的协助。

4

1 回答 1

1

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

fm <- lm(M.compsexitems)

给予:

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

Coefficients:
(Intercept)       ITEM27  
         -2            1 

如果您需要明确获取公式:

fo <- formula(fm)

给予:

> fo
ITEM26 ~ ITEM27
<environment: 0x000000000e2f2b50>

如果您希望上述公式明确出现在lmthen 的输出中:

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)
于 2018-04-15T16:41:03.427 回答