我使用R键评估气候数据,我有一个数据集看起来像下面的微型版本......请原谅我的粗发布礼仪,我希望这篇文章是可以理解的。
[0][STA.NAME] [YEAR] [SUM.CDD]
1 NAME1 1967 760
2 NAME1 1985 800
3 NAME1 1996 740
4 NAME1 2003 810
5 NAME1 2011 790
6 NAME2 1967 700
7 NAME2 1985 690
8 NAME2 1996 850
9 NAME2 2003 790
10 NAME3 1967 760
11 NAME3 1985 800
12 NAME3 1990 740
13 NAME3 1996 810
14 NAME3 2003 790
15 NAME3 2011 800
我想这个返回一个新的DF
[STA.NAME] [Eq'n of trend]
NAME1 (y = mx + b)
NAME2 (y = mx + b)
等等...
最后,我需要计算的趋势变化,以及数据的总方差并希望最终追加那些由此产生的数据集这样的事情...
[STA.NAME] [TREND] [VAR.TREND] [VAR.DATA]
with values in rows, 1 for each STA.NAME...
任何帮助是极大的赞赏,如果有一个以上流明更好的方法(),与我目前难倒,我有兴趣为好。
非常感谢你,
杰西
下面是使用一个简单的解决ddply()
从plyr
返回的系数为每个组:
首先复制数据:
x <- read.table(text="
STA.NAME YEAR SUM.CDD
1 NAME1 1967 760
2 NAME1 1985 800
3 NAME1 1996 740
4 NAME1 2003 810
5 NAME1 2011 790
6 NAME2 1967 700
7 NAME2 1985 690
8 NAME2 1996 850
9 NAME2 2003 790
10 NAME3 1967 760
11 NAME3 1985 800
12 NAME3 1990 740
13 NAME3 1996 810
14 NAME3 2003 790
15 NAME3 2011 800 ", header=TRUE)
现在做的造型:
library(plyr)
ddply(x, .(STA.NAME), function(z)coef(lm(SUM.CDD ~ YEAR, data=z)))
STA.NAME (Intercept) YEAR
1 NAME1 -444.8361 0.6147541
2 NAME2 -6339.2047 3.5702200
3 NAME3 -995.2381 0.8928571
现在,这取决于你想要做什么,它可能是简单的(也许更有意义),以创建单个数据模型:
fit <- lm(SUM.CDD ~ YEAR + STA.NAME, data=x)
找一个总结:
summary(fit)
Call:
lm(formula = SUM.CDD ~ YEAR + STA.NAME, data = x)
Residuals:
Min 1Q Median 3Q Max
-63.57 -22.21 10.72 18.62 80.72
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -2065.6401 1463.5353 -1.411 0.1858
YEAR 1.4282 0.7345 1.945 0.0778 .
STA.NAMENAME2 -15.8586 27.5835 -0.575 0.5769
STA.NAMENAME3 3.9046 24.7089 0.158 0.8773
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 40.8 on 11 degrees of freedom
Multiple R-squared: 0.3056, Adjusted R-squared: 0.1162
F-statistic: 1.614 on 3 and 11 DF, p-value: 0.2424
只提取系数:
coef(fit)
(Intercept) YEAR STA.NAMENAME2 STA.NAMENAME3
-2065.640078 1.428247 -15.858650 3.904632
最后,你也许想以配合交互项的模型。 这种模式使您有效地相同的结果与原始plyr
解决方案。 根据您的数据和目标,这可能是做到这一点的方式:
fit <- lm(SUM.CDD ~ YEAR * STA.NAME, data=x)
summary(fit)
Call:
lm(formula = SUM.CDD ~ YEAR * STA.NAME, data = x)
Residuals:
Min 1Q Median 3Q Max
-57.682 -13.166 -1.012 23.006 63.046
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -444.8361 2280.7464 -0.195 0.850
YEAR 0.6148 1.1447 0.537 0.604
STA.NAMENAME2 -5894.3687 3661.9795 -1.610 0.142
STA.NAMENAME3 -550.4020 3221.8390 -0.171 0.868
YEAR:STA.NAMENAME2 2.9555 1.8406 1.606 0.143
YEAR:STA.NAMENAME3 0.2781 1.6172 0.172 0.867
Residual standard error: 39.17 on 9 degrees of freedom
Multiple R-squared: 0.4763, Adjusted R-squared: 0.1854
F-statistic: 1.637 on 5 and 9 DF, p-value: 0.2451