Как применить функцию, которая содержит множественную регрессию на 2 на 2 переменные в df по категориям в R? - PullRequest
2 голосов
/ 08 июня 2019

Мой df примерно такой:

ind1 <- rnorm(99)
ind2 <- rnorm(99)
ind3 <- rnorm(99)
ind4 <- rnorm(99)
ind5 <- rnorm(99)
dep <- rnorm(99, mean=ind1)
group <- rep(c("A", "B", "C"), each=33)
df <- data.frame(dep, group, ind1, ind2, ind3, ind4, ind5)

Это функция, которая объединяет различные типы уравнений регрессии.

functions <- function(x, y) {
  eq1 <- lm(dep ~ x + y)
  eq2 <- lm(dep ~ I(x*y))
  eq3 <- lm(log(dep) ~ I(log(x+1)^2) + I(log(y+1)^2))
  list <- list(eq1, eq2, eq3)
  names(list) <- paste0("mod", 1:3)
  return(list)
}

Затем я применил эту функцию к переменным ind1 и ind2 по группам, как показано ниже.

out <- lapply(split(df, df$group), function(x) functions(x$ind1, x$ind2))
lapply(out, summary)

Но есть ошибка, говорящая, что переменные длины различаются (найдено для 'x')?Так как я могу исправить эту ошибку?

Заранее спасибо!

1 Ответ

2 голосов
/ 08 июня 2019

Здесь проблема в том, что формуле нужны имена столбцов, а не значения

functions <- function(dat, x, y) {

   form1 <- paste0("dep ~ ", x, " + ", y)
   form2 <- paste0("dep ~ ", "I(", x, "*", y, ")")
   form3 <- paste0("log(dep) ~", "I(log(", x, "+1)^2) + I(log(", y, "+1)^2)")
    eq1 <- lm(form1, data = dat)
    eq2 <-  lm(form2, data = dat)
    eq3 <- lm(form3, data = dat)
    list1 <- list(eq1, eq2, eq3)
    names(list1) <- paste0("mod", 1:3)
    return(list1)

}



out <- lapply(split(df, df$group), function(x) functions(x,  "ind1",  "ind2"))

Кроме того, поскольку выходные данные являются вложенными list, нам может потребоваться попасть внутрь внутреннего list чтобы извлечь summary

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