2016-01-11 2 views
2

Это является частью набора данных (названного «МЕ1») Я использую (все переменные являются числовыми):Петля линейной регрессии и сохранение коэффициенты

Year AgeR rateM 
1 1751 -1.0 0.241104596 
2 1751 -0.9 0.036093609 
3 1751 -0.8 0.011623734 
4 1751 -0.7 0.006670552 
5 1751 -0.6 0.006610552 
6 1751 -0.5 0.008510828 
7 1751 -0.4 0.009344041 
8 1751 -0.3 0.011729740 
9 1751 -0.2 0.010988005 
10 1751 -0.1 0.015896107 
11 1751 0.0 0.018190140 
12 1751 0.1 0.024588340 
13 1751 0.2 0.029801362 
14 1751 0.3 0.044515912 
15 1751 0.4 0.055240354 
16 1751 0.5 0.088476758 
17 1751 0.6 0.119045309 
18 1751 0.7 0.167866571 
19 1751 0.8 0.239244825 
20 1751 0.9 0.329683010 
21 1751 1.0 0.472448318 

Я хочу использовать линейную модель и сохранить коэффициенты как следовать:

male<-lm(ME1$rateM~exp(AgeR)) 
summary(male) 
coeff <- summary(male)$coefficients[2] 

проблема заключается в том, что мне нужно повторить эту процедуру для каждого года (с 1751 до 2014 года), и я хочу, чтобы сохранить все коэффициенты в одном наборе данных, как это:

Year coeff 
1751 0.1556977 
1752 0.0966664 
... 
2014 0.0420914 

Я не знаю, должен ли я использовать for-loop, lapply или что-то еще. Кто-нибудь может мне помочь?

ответ

6

Существует несколько способов сделать это. Во-первых, мы создаем некоторые сгенерированные данные для иллюстративных целей:

set.seed(123) 
dat <- expand.grid(year=2000:2010, AgeR=seq(-1,1,0.1)) 
dat$value <- rnorm(nrow(dat)) 

Мы можем начать с базы-R. Мы разделяем наши данные по годам, подходим к модели и извлекаем наш коэффициент. Затем мы связываем все вместе.

res <- do.call(rbind,lapply(split(dat, dat$year),function(x){ 
    fit <- lm(value~exp(AgeR), data=x) 
    res <- data.frame(year=unique(x$year),coeff=coef(fit)[2]) 
    res 
})) 

Мы можем сделать то же самое с помощью data.table:

library(data.table) 


res2 <- setDT(dat)[,.(coeff=coef(lm(value~exp(AgeR)))[2]),year] 
res2 
+0

совершенны, спасибо за вашу помощь! – DanielUp

+0

Добро пожаловать. Это легко расширить с помощью специальной функции для извлечения большего количества или разных данных из каждой модели. – Heroka

3

Пакет broom может быть очень полезным и здесь.

library(dplyr) 
library(broom) 

mtcars %>% 
    group_by(gear) %>% 
    do(tidy(lm(mpg ~ am + cyl, data = .))) 
1

Пакет nlme предлагает удобную функцию для этого:

library(nlme) 
coef(lmList(value ~ exp(AgeR)| year, data=dat))[,2, drop = FALSE] 
Смежные вопросы