按组拟合线性模型/方差分析[重复]
Posted
技术标签:
【中文标题】按组拟合线性模型/方差分析[重复]【英文标题】: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。任何帮助将不胜感激。
【问题讨论】:
【参考方案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)
以上是关于按组拟合线性模型/方差分析[重复]的主要内容,如果未能解决你的问题,请参考以下文章
R语言协方差分析(analysis of covariance)实战:协方差分析ANCOVA(analysis of covariance)(检查模型假设)拟合协方差分析ANCOVA模型事后分析
R语言多因素有交互方差分析(Two-Way ANOVA)实战:拟合多因素有交互方差分析模型分析不同分组的差异TukeyHSD多因素有交互方差分析的结果总结
R语言Eta squared计算实战:Eta squared表示可以用模型中给定的变量解释的方差的比例拟合方差分析模型(two-way ANOVA)计算Eta Squared
R语言使用回归模型解决单因素方差分析问题(ANOVA as regression)方差分析和回归都是同广义线性模型的特例因子转化为数值的过程中(分类变量编码为连续变量自定义设置contrast)