【问题标题】:Linear Regression calculation several times in one dataframe在一个数据帧中进行多次线性回归计算
【发布时间】:2013-01-17 12:18:29
【问题描述】:

我正在使用 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...

非常感谢任何帮助,如果有比 lm() 更好的方法,我目前对此感到困惑,我也会感兴趣。

非常感谢,

杰西

【问题讨论】:

    标签: r statistics linear-regression


    【解决方案1】:

    这是一个简单的解决方案,使用来自plyrddply() 返回每​​个组的系数:

    首先复制数据:

    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 
    

    【讨论】:

    • 非常漂亮的布局,即使按照您的高标准 :-) 。在ddply 调用中粘贴lm 不仅很酷,而且总体上突出了plyr 工具的强大功能。
    • 再次,非常感谢。非常干净,我不太了解 ~ 建模语法,但是您的代码使它很容易理解。再次感谢,杰西
    • @user1680636 如果这个答案有帮助,请考虑点击绿色勾号接受它。这向其他人表明该问题已得到回答。
    • @Andrie @user1680636 这是一个很好的答案。我还可以补充一点,使用coef(lm(SUM.CDD ~ STA.NAME + YEAR:STA.NAME, data=x)) 可以直接获得与ddply() 调用相同的分层系数。
    • @TheodoreLytras 是的,a*ba + a:b 相同
    猜你喜欢
    • 2016-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-20
    • 2020-01-26
    • 2021-09-11
    • 1970-01-01
    • 2017-07-04
    相关资源
    最近更新 更多