在 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)
我正在尝试将列(或特定向量元素)的名称设置为 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)