我想为facetwrap中的每个ggplot计算一个r平方系数。我想到了一个使用for循环的解决方案,并将系数保存在列表中,然后将列表的项目分配给每个方面。但是,我无法计算for循环中的系数。我收到一条错误消息:
model.frame.default中的错误(公式= H60%〜选择,数据= DATA50,: 可变长度不同(找到“选择”)
这是我的代码:
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)
,并且错误是相同的。
我会为任何提示而高兴,或者有人能为我指出正确的方向。
答案 0 :(得分:2)
您的变量是分开预测变量值还是分组变量的值?下面的答案假定为前者;如果是后者,请使用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))
。
答案 1 :(得分:0)
您的问题不可重复,但是我认为您最好创建一个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创建