R - Использование применяется только на определенных столбцах - PullRequest
0 голосов
/ 06 сентября 2018

Я использую пакет в R, который соответствует определенной форме регрессионной модели. Однако, в отличие от базовой функции lm (), которая позволяет x и y быть отдельными объектами, используемая мной функция требует, чтобы они находились в одном и том же фрейме данных.

Моя проблема возникает из-за того, что у меня много переменных, которые я хочу регрессировать на y независимо. Поэтому у меня есть фрейм данных с 10 переменными предиктора (x1, x2 ... x10) и одной переменной критерия (y), всего 11 столбцов. Я мог бы использовать цикл for для запуска десяти отдельных регрессий, но я хочу избежать этого и использовать вместо этого функцию apply. Однако если я вызову apply на моем фрейме данных, на последнем шаге он будет регрессировать y на y, и я хочу избежать этого. Существует ли аналогичная функция, которую можно применить, и которую я могу запустить и указать, что я хочу, чтобы она выполнялась только 10 раз, а не 11, или есть другой способ решения этой проблемы?

Ответы [ 2 ]

0 голосов
/ 07 сентября 2018

Вот решение tidyverse:

library( tidyverse )

xx <- c("disp", "hp", "drat", "wt")   # Names of predictor variables
y <- "mpg"                            # Name of response

str_c( y, xx, sep="~" ) %>%
  map( as.formula ) %>%               # Optional (see below)
  map( lm, data = mtcars )

str_c просто строит формулы в виде строк (например, "mpg~disp"). В то время как lm принимает строки напрямую, ваша конкретная модель регрессии не может. Если требуется фактическая формула, вы можете преобразовать строки в формулы, используя as.formula (Спасибо за предложение, @ J.Doe!). Кроме этого, просто замените lm на вашу конкретную модель и mtcars на ваш фрейм данных.


Вот то же решение, использующее базу R без каких-либо дополнительных пакетов:

strs <- paste( y, xx, sep="~" )
strs <- lapply( strs, as.formula )    # Optional
lapply( strs, lm, data=mtcars )
0 голосов
/ 07 сентября 2018

Используя встроенный anscombe фрейм данных, имеющий столбцы x1, x2, x3, x4, y1, y2, y3, y4, предположим, что мы хотим регрессировать y1 по каждому из x1, x2, x3, x4 по отдельности.

Сначала создайте символьный вектор из имен независимых переменных xnames и используйте lapply для запуска указанного run_lm над ним. Эта функция вставляет необходимую формулу и выполняет lm, возвращая объект класса "lm". L, результат - список таких объектов, по одному для каждой регрессии.

Пакеты не используются.

xnames <- names(anscombe)[1:4]
run_lm <- function(nm) lm(paste("y1 ~", nm), anscombe)
L <- lapply(xnames, run_lm)

Альтернативно, эта более короткая версия run_lm также будет работать с вышеуказанным lapply, но строка вывода Call: не так хороша:

run_lm <- function(nm) lm(anscombe[c("y1", nm)])
...