2016-01-11 53 views
2

這是數據集(名爲「ME1」),我使用的一部分(所有變量的數值):環線性迴歸和節能係數

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)) 

我們可以從base-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]