LM формула переменной длины отличается - PullRequest
0 голосов
/ 27 января 2019

Я хотел бы рассчитать квадратный коэффициент r для каждого ggplot в facetwrap.Я подумал о решении с использованием цикла for и сохранить коэффициенты в списке, а затем назначить элементы списка для каждого аспекта.Однако я не могу рассчитать коэффициенты в цикле for.Я получаю сообщение об ошибке:

Ошибка в model.frame.default (формула = H60percent ~ выбор, данные = ДАННЫЕ50,: переменные длины различаются (найдено для «выбора»)

Вот мой код:

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 голосов
/ 27 января 2019

Ваш вопрос не воспроизводим, но я думаю, вам повезет, создав объект 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"

Создано в 2019-01-27 с помощью пакета Представить (v0.2.1)

0 голосов
/ 27 января 2019

Ваши переменные - это отдельные значения предикторов или значения группирующей переменной?Ответ ниже предполагает первый;если это последнее, используйте 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)) после запуска цикла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...