Как я могу сделать 3064 регрессии с помощью функции lapply - PullRequest
1 голос
/ 23 марта 2020

Привет, я начинаю использовать r и застреваю при анализе своих данных. У меня есть датафрейм, который имеет 157 столбцов. Столбец 1 является зависимой переменной, а от столбца 2 до 157 они являются независимыми переменными, но от столбца 2 до столбца 79 это тип независимой переменной (n = 78) и от 80 до 157 другого типа (n = 78). Я хочу выполнить (78 x 78 = 6084) несколько линейных регрессий, оставляя первую независимую переменную модели фиксированной по одной, от столбцов 2 до 79. Я могу исправить независимую переменную и сделать регрессии отдельно, как это

lm(Grassland$column1 ~ Grassland$column2 +  x)
lm(Grassland$column1 ~ Grassland$column3 +  x)

lm(Grassland$column1 ~ Grassland$column79 +  x)

Мой вопрос: как я могу сделать регрессии 3064, написать один код и извлечь только те регрессии, чье значение p <0,05, исключив незначимые регрессии? </p>

Вот мой код

library(data.table)

Regressions <- 
data.table(Grassland)[, 
                      .(Lm = lapply(.SD, function(x) summary(lm(Grassland$column1 ~ Grassland$column2 + x)))), .SDcols = 80:157]

Regressions[, lapply(Lm, function(x) coef(x)[, "Pr(>|t|)"])] [2:3] < 0.05       

Ответы [ 2 ]

1 голос
/ 23 марта 2020

Мы также можем использовать reformulate для создания формулы, а затем применить lm

lapply(setdiff(names(mtcars), "mpg"), function(x) 
        lm(reformulate(x, "mpg"), data = mtcars))
0 голосов
/ 23 марта 2020

Один, data.table не обязательно поможет вам здесь, он отлично работает во внешнем lapply. Сначала мы генерируем формулы программно (здесь я буду использовать большую часть mtcars), затем мы применяем формулу к данным.

paste("mpg ~", setdiff(names(mtcars), "mpg"))
#  [1] "mpg ~ cyl"  "mpg ~ disp" "mpg ~ hp"   "mpg ~ drat" "mpg ~ wt"   "mpg ~ qsec" "mpg ~ vs"  
#  [8] "mpg ~ am"   "mpg ~ gear" "mpg ~ carb"

regressions <- lapply(paste("mpg ~", setdiff(names(mtcars), "mpg")),
                      function(frm) lm(as.formula(frm), data=mtcars))

regressions[1:2]
# [[1]]
# Call:
# lm(formula = as.formula(frm), data = mtcars)
# Coefficients:
# (Intercept)          cyl  
#      37.885       -2.876  
# [[2]]
# Call:
# lm(formula = as.formula(frm), data = mtcars)
# Coefficients:
# (Intercept)         disp  
#    29.59985     -0.04122  
...