lm公式的可变长度不同

时间:2019-01-27 14:50:21

标签: r lm

我想为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),并且错误是相同的。 我会为任何提示而高兴,或者有人能为我指出正确的方向。

2 个答案:

答案 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创建