Использование цикла for для запуска ряда линейных регрессий в R - PullRequest
0 голосов
/ 22 февраля 2019

У меня есть фрейм данных, который состоит из 2000 строк и трех столбцов.Столбцы предназначены для Subject ID #, IV и DV.В данных содержится 50 участников (субъект № 1:50), каждый из которых имеет 40 отдельных наблюдений (по 40 строк на участника).

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

Для простоты, вот сжатая версия данных (я просто делаю 5 строк для 3 участников, а не производю полные 2000 строк).

Понятия не имею, что я делаю, когда дело доходит до циклов, это последнее, что я попробовал.

Примечание: Я пересоздал уменьшенную версиюиз данных ниже.По сути, я хотел бы создать цикл for, который запускает lm dv на iv для каждого из четырех участников примерного фрейма данных, чтобы я мог найти точку пересечения и наклон для каждого отдельного участника (а не агрегировать все).

df <- data.frame(
  id = rep(1:4, each=5),
  iv = c(5.0, 3.6, 3.4, 4.5, 4.6, 7.8, 7.2, 10.8, 7.7, 8.7, 7.6, 6.8, 
         6.2, 5.6, 4.6, 6.7, 6.6, 6.3, 7.0, 5.1),
  dv = c(6.50, 8.50, 8.00, 10.00, 10.00, 3.50, 10.00, 7.25, 2.50, 6.50,
         10.00, 8.75, 10.00, 9.75, 10.00, 7.75, 7.75, 7.50, 8.75, 5.75)  
)


for (i in 1:4)
{
  m3 <- lm(df$dv ~ df$iv, data=df$id[[i]])
}

Ответы [ 2 ]

0 голосов
/ 22 февраля 2019

Я подхожу к этому виду групповой регрессии, комбинируя group_by() и do().

Хотя @dylanjm предоставил хороший лаконичный метод, использующий map() и broom() для создания списка элементов, содержащих выходные данные модели, этот вариант может быть полезен, если вам нужен один df с двумя столбцами, перечисляющими всеваши перехваты и уклоны.

library(dplyr)
df <- data.frame(id = rep(1:4, each=5),
             iv = c(5.0, 3.6, 3.4, 4.5, 4.6, 7.8, 7.2, 10.8, 7.7, 8.7, 7.6, 6.8, 
                    6.2, 5.6, 4.6, 6.7, 6.6, 6.3, 7.0, 5.1),
             dv = c(6.50, 8.50, 8.00, 10.00, 10.00, 3.50, 10.00, 7.25, 2.50, 6.50,
                    10.00, 8.75, 10.00, 9.75, 10.00, 7.75, 7.75, 7.50, 8.75, 5.75)) 

#This will segment obs by the `id` variable, & run a separate lm for each of the segments.
df_lms<- df %>% 
         group_by(id)%>% 
         do(mod = lm(dv ~ iv, data=.))

#This will give you a dataframe with a column for intercepts, and a column for slopes.
cbind(df_lms %>% do(data.frame(intc = coef(.$mod)[1])),
      df_lms %>% do(data.frame(slope = coef(.$mod)[2])))
0 голосов
/ 22 февраля 2019

Не для цикла, но определенно более лаконичный R-центричный подход к вещам.broom::tidy() просто берет вывод из lm() и помещает его в простой для обработки фрейм данных.

РЕДАКТИРОВАТЬ: если вы хотите, чтобы это было в одном data.frame и иметь возможность различать идентификаторы, вы можете использовать обновленный код ниже.Я считаю, что do() устарел или больше не поддерживается поддерживаемым методом для манипулирования функциями.

library(tidyverse)
library(broom)

df <- data.frame(
  id = rep(1:4, each=5),
  iv = c(5.0, 3.6, 3.4, 4.5, 4.6, 7.8, 7.2, 10.8, 7.7, 8.7, 7.6, 6.8, 
         6.2, 5.6, 4.6, 6.7, 6.6, 6.3, 7.0, 5.1),
  dv = c(6.50, 8.50, 8.00, 10.00, 10.00, 3.50, 10.00, 7.25, 2.50, 6.50,
         10.00, 8.75, 10.00, 9.75, 10.00, 7.75, 7.75, 7.50, 8.75, 5.75)  
)

df %>% 
  group_split(id) %>% 
  map_df(~ lm(dv ~ iv, data = .) %>% 
           tidy() %>% 
           mutate(id = unique(.x$id))
         )
#> # A tibble: 8 x 6
#>   term        estimate std.error statistic p.value    id
#>   <chr>          <dbl>     <dbl>     <dbl>   <dbl> <int>
#> 1 (Intercept)   8.96       5.28     1.70   0.188       1
#> 2 iv           -0.0847     1.24    -0.0684 0.950       1
#> 3 (Intercept)   3.55      10.3      0.344  0.753       2
#> 4 iv            0.284      1.21     0.235  0.829       2
#> 5 (Intercept)  10.5        1.65     6.36   0.00786     3
#> 6 iv           -0.126      0.264   -0.478  0.665       3
#> 7 (Intercept)  -1.69       1.06    -1.59   0.210       4
#> 8 iv            1.45       0.167    8.69   0.00321     4

Создан в 2019-02-22 с помощью пакета prex (v0.2.1)

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