【问题标题】:Fitting linear model / ANOVA by group [duplicate]按组拟合线性模型/方差分析[重复]
【发布时间】:2017-02-07 17:23:45
【问题描述】:

我正在尝试在 R 中运行 anova() 并遇到了一些困难。这是我到目前为止所做的,以帮助阐明我的问题。

这是我目前数据的str()

 str(mhw)
'data.frame':   500 obs. of  5 variables:
$ r    : int  1 2 3 4 5 6 7 8 9 10 ...
$ c    : int  1 1 1 1 1 1 1 1 1 1 ...
$ grain: num  3.63 4.07 4.51 3.9 3.63 3.16 3.18 3.42 3.97 3.4 ...
$ straw: num  6.37 6.24 7.05 6.91 5.93 5.59 5.32 5.52 6.03 5.66 ...
$ Quad : Factor w/ 4 levels "NE","NW","SE",..: 2 2 2 2 2 2 2 2 2 2 ...

列 r 是一个数值,指示单个图所在字段中的哪一行 c 列是一个数值,指示单个图所在的列
列 Quad 对应于每个地块所在的字段中的地理位置

Quad <- ifelse(mhw$c > 13 & mhw$r < 11, "NE",ifelse(mhw$c < 13 & mhw$r < 11,"NW", ifelse(mhw$c < 13 & mhw$r >= 11, "SW","SE")))
mhw <- cbind(mhw, Quad)

我有一个lm(),如下所示

nov.model <-lm(mhw$grain ~ mhw$straw)
anova(nov.model)

这是整个田地的anova(),它正在测试数据集中每个地块的谷物产量和稻草产量。

我的麻烦是我想为我的数据的 Quad 列运行一个单独的 anova() 来测试每个象限中的谷物产量和秸秆产量。

也许with() 可能会解决这个问题。我以前从未使用过它,目前我正在学习 R。任何帮助将不胜感激。

【问题讨论】:

    标签: r regression linear-regression lm anova


    【解决方案1】:

    我认为您正在寻找 R 中的 by 设施。

    fit <- with(mhw, by(mhw, Quad, function (dat) lm(grain ~ straw, data = dat)))
    

    由于您在Quad 中有4 个级别,因此您最终在fit 中有4 个线性模型,即fit 是长度为4 的“by”类对象(一种“list”类型)。

    要获取每个模型的系数,您可以使用

    sapply(fit, coef)
    

    要生成模型摘要,请使用

    lapply(fit, summary)
    

    要导出方差分析表,请使用

    lapply(fit, anova)
    

    作为一个可复现的例子,我从?by 中提取例子:

    tmp <- with(warpbreaks,
                by(warpbreaks, tension,
                   function(x) lm(breaks ~ wool, data = x)))
    
    class(tmp)
    # [1] "by"
    
    mode(tmp)
    # [1] "list"
    
    sapply(tmp, coef)
    
    #                    L         M         H
    #(Intercept)  44.55556 24.000000 24.555556
    #woolB       -16.33333  4.777778 -5.777778
    
    lapply(tmp, anova)
    
    #$L
    #Analysis of Variance Table
    #
    #Response: breaks
    #          Df Sum Sq Mean Sq F value  Pr(>F)  
    #wool       1 1200.5 1200.50  5.6531 0.03023 *
    #Residuals 16 3397.8  212.36                  
    #---
    #Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
    #
    #$M
    #Analysis of Variance Table
    #
    #Response: breaks
    #          Df  Sum Sq Mean Sq F value Pr(>F)
    #wool       1  102.72 102.722  1.2531 0.2795
    #Residuals 16 1311.56  81.972               
    #
    #$H
    #Analysis of Variance Table
    #
    #Response: breaks
    #          Df  Sum Sq Mean Sq F value Pr(>F)
    #wool       1  150.22 150.222  2.3205 0.1472
    #Residuals 16 1035.78  64.736
    

    我知道这个选项,但不熟悉。感谢@Roland 为上述可重现示例提供代码:

    library(nlme)
    lapply(lmList(breaks ~ wool | tension, data = warpbreaks), anova)
    

    对于您的数据,我认为会是

    fit <- lmList(grain ~ straw | Quad, data = mhw)
    lapply(fit, anova)
    

    你不需要安装nlme;它带有 R 作为推荐的软件包之一。

    【讨论】:

    • 谢谢。这提供了数据的coef。如果我想生成完整的方差分析摘要来检验假设,“东象限与西象限的粮食产量是否不同”。我怎样才能用fit 制作它
    • 工作完美。非常感谢你的帮助。对于这些问题的简单性质,我深表歉意。正如我所说,我正在学习 R 并且有点转身,我的语法。
    • 那个链接很有帮助。这解决了我在与 R 合作时提出的许多附带问题。
    • 或者使用lmList:library(nlme); lapply(lmList(breaks ~ wool | tension, data = warpbreaks), anova)
    猜你喜欢
    • 2015-10-28
    • 2015-02-19
    • 2018-10-13
    • 2015-12-28
    • 2020-06-04
    • 2023-02-12
    • 2017-01-24
    • 2020-09-04
    • 2017-12-18
    相关资源
    最近更新 更多