lm 公式变量长度不同
lm formula variable lengths differ
我想为 facetwrap 中的每个 ggplot 计算一个 r 平方系数。我想到了一个使用 for 循环的解决方案,并将系数保存在列表中,然后将列表的项目分配给每个方面。但是,我无法计算 for 循环中的系数。我收到一条错误消息:
Error in model.frame.default(formula = H60percent ~ choice, data = DATA50, :
variable lengths differ (found for 'choice')
这是我的代码:
xvalue <- c("Jnr3250","Jnr6450","Jnr12850","Jnr25650")
Rcoef_list <- list()
for (i in 1:length(xvalue)) {
#print i as a number
print(i)
#choose elemnt from from xvalue according to the i (number)
choice <- noquote(xvalue[i], right = FALSE)
print(choice)
# counts R2
LM1 = lm(formula = H60percent ~ choice, data = DATA50)
Rvalue <-round(as.numeric(summary(LM1)$r.squared[1]),2)
R2 <- paste("r^2 == ", Rvalue)
print(R2)
#put each R2 in a list
Rcoef_list[[i]] <- R2
}
如果我写一个列的实际名称(例如 Jnr3250)而不是在 lm 函数中选择,它就可以工作(但显然只针对一个值)。我试过paste0(choice)
,错误是一样的。
我会很高兴收到任何提示,或者如果有人能指出我正确的方向。
您的变量是单独的预测变量值还是分组变量的值?下面的答案假设是前者;如果是后者,请使用 lme4::lmList()
或 nlme::lmList()
...
这几乎是重复的……我没有剖析您的示例以确切了解您遇到麻烦的地方,但通常最好使用 reformulate()
解决此类问题。精简后,您的列表将如下所示:
xvalue <- c("Jnr3250","Jnr6450","Jnr12850","Jnr25650")
Rcoef_list <- list()
for (x in xvalue) {
form <- reformulate(x, response="H60percent")
LM1 <- lm(form, data=DATA50)
Rcoef_list[[x]] <- summary(LM1)$r.squared[1]
}
如果你想要 r^2 ==
东西,你可以在 运行 循环之后使用 sprintf("r^2 == %1.1f", unlist(Rcoef_list))
。
您的问题不可重现,但我认为您创建一个 formula()
对象以传递给 lm()
会更好一些。这是 mtcars 数据的示例,针对数据集中的其他三个变量回归 mpg
:
xcols <- c("disp", "hp", "qsec")
Rcoef_list <- list()
for (i in 1:length(xcols)){
f <- as.formula(paste0("mpg ~", xcols[i]))
LM1 <- lm(formula = f, data = mtcars)
Rvalue <-round(as.numeric(summary(LM1)$r.squared[1]),2)
R2 <- paste("r^2 == ", Rvalue)
Rcoef_list[[i]] <- R2
}
Rcoef_list
#> [[1]]
#> [1] "r^2 == 0.72"
#>
#> [[2]]
#> [1] "r^2 == 0.6"
#>
#> [[3]]
#> [1] "r^2 == 0.18"
由 reprex package (v0.2.1)
于 2019-01-27 创建
我想为 facetwrap 中的每个 ggplot 计算一个 r 平方系数。我想到了一个使用 for 循环的解决方案,并将系数保存在列表中,然后将列表的项目分配给每个方面。但是,我无法计算 for 循环中的系数。我收到一条错误消息:
Error in model.frame.default(formula = H60percent ~ choice, data = DATA50, : variable lengths differ (found for 'choice')
这是我的代码:
xvalue <- c("Jnr3250","Jnr6450","Jnr12850","Jnr25650")
Rcoef_list <- list()
for (i in 1:length(xvalue)) {
#print i as a number
print(i)
#choose elemnt from from xvalue according to the i (number)
choice <- noquote(xvalue[i], right = FALSE)
print(choice)
# counts R2
LM1 = lm(formula = H60percent ~ choice, data = DATA50)
Rvalue <-round(as.numeric(summary(LM1)$r.squared[1]),2)
R2 <- paste("r^2 == ", Rvalue)
print(R2)
#put each R2 in a list
Rcoef_list[[i]] <- R2
}
如果我写一个列的实际名称(例如 Jnr3250)而不是在 lm 函数中选择,它就可以工作(但显然只针对一个值)。我试过paste0(choice)
,错误是一样的。
我会很高兴收到任何提示,或者如果有人能指出我正确的方向。
您的变量是单独的预测变量值还是分组变量的值?下面的答案假设是前者;如果是后者,请使用 lme4::lmList()
或 nlme::lmList()
...
这几乎是重复的……我没有剖析您的示例以确切了解您遇到麻烦的地方,但通常最好使用 reformulate()
解决此类问题。精简后,您的列表将如下所示:
xvalue <- c("Jnr3250","Jnr6450","Jnr12850","Jnr25650")
Rcoef_list <- list()
for (x in xvalue) {
form <- reformulate(x, response="H60percent")
LM1 <- lm(form, data=DATA50)
Rcoef_list[[x]] <- summary(LM1)$r.squared[1]
}
如果你想要 r^2 ==
东西,你可以在 运行 循环之后使用 sprintf("r^2 == %1.1f", unlist(Rcoef_list))
。
您的问题不可重现,但我认为您创建一个 formula()
对象以传递给 lm()
会更好一些。这是 mtcars 数据的示例,针对数据集中的其他三个变量回归 mpg
:
xcols <- c("disp", "hp", "qsec")
Rcoef_list <- list()
for (i in 1:length(xcols)){
f <- as.formula(paste0("mpg ~", xcols[i]))
LM1 <- lm(formula = f, data = mtcars)
Rvalue <-round(as.numeric(summary(LM1)$r.squared[1]),2)
R2 <- paste("r^2 == ", Rvalue)
Rcoef_list[[i]] <- R2
}
Rcoef_list
#> [[1]]
#> [1] "r^2 == 0.72"
#>
#> [[2]]
#> [1] "r^2 == 0.6"
#>
#> [[3]]
#> [1] "r^2 == 0.18"
由 reprex package (v0.2.1)
于 2019-01-27 创建