按组拟合线性模型/ ANOVA

pc8*_*807 2 regression r linear-regression anova lm

我正试图anova()在R中运行并遇到一些困难.这就是我现在所做的,以帮助阐明我的问题.

这是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 ...
Run Code Online (Sandbox Code Playgroud)

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

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)
Run Code Online (Sandbox Code Playgroud)

我适合lm()如下

nov.model <-lm(mhw$grain ~ mhw$straw)
anova(nov.model)
Run Code Online (Sandbox Code Playgroud)

这是anova()整个油田的一个项目,它正在测试数据集中每个地块的秸秆产量的粮食产量.

我的麻烦在于我想为anova()我的数据的Quad列运行一个人来测试每个象限中的谷物产量和秸秆产量.

或许with()可以解决这个问题.我以前从未使用它,而且我目前正在学习R.任何帮助将不胜感激.

李哲源*_*李哲源 5

我想你正在寻找byR的设施.

fit <- with(mhw, by(mhw, Quad, function (dat) lm(grain ~ straw, data = dat)))
Run Code Online (Sandbox Code Playgroud)

由于你有4个等级Quad,你最终得到4个线性模型fit,即fit长度为4的"by"类对象(一种"列表").

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

sapply(fit, coef)
Run Code Online (Sandbox Code Playgroud)

要生成模型摘要,请使用

lapply(fit, summary)
Run Code Online (Sandbox Code Playgroud)

要导出ANOVA表,请使用

lapply(fit, anova)
Run Code Online (Sandbox Code Playgroud)

作为一个可重复的例子,我将举例来自?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
Run Code Online (Sandbox Code Playgroud)

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

library(nlme)
lapply(lmList(breaks ~ wool | tension, data = warpbreaks), anova)
Run Code Online (Sandbox Code Playgroud)

对于您的数据我认为会是

fit <- lmList(grain ~ straw | Quad, data = mhw)
lapply(fit, anova)
Run Code Online (Sandbox Code Playgroud)

你不需要安装nlme; 它附带R作为推荐的包之一.