R中的双向ANOVA与ANCOVA

机器算法验证 r 方差分析 安乔娃
2022-04-02 03:50:03

遵循有关如何在 R 中执行 ANOVA 和 ANCOVA 的信息和其他信息来源,我对两者之间在如何计算这种差异方面的差异感到非常困惑。请考虑以下两个示例

方差分析

require(ggplot2)


> anova(lm(price~table+depth, data = diamonds))  
Response: price
             Df     Sum Sq    Mean Sq  F value  Pr(>F)    
depth         1 9.7323e+07 9.7323e+07   6.2202 0.01263 *  
table         1 1.4462e+10 1.4462e+10 924.2957 < 2e-16 ***
Residuals 53937 8.4391e+11 1.5646e+07                     

> anova(lm(price~depth+table, data = diamonds))  
Response: price
             Df     Sum Sq    Mean Sq F value    Pr(>F)    
table         1 1.3876e+10 1.3876e+10 886.825 < 2.2e-16 ***
depth         1 6.8360e+08 6.8360e+08  43.691 3.882e-11 ***
Residuals 53937 8.4391e+11 1.5646e+07                      

平方和、pvalues 和其他值都根据顺序而变化。这使我认为我刚刚进行了 ANCOVA。

方差分析

这个例子来自这里

delivery.df = data.frame(
  Service = c(rep("Carrier 1", 15), rep("Carrier 2", 15),
    rep("Carrier 3", 15)),
  Destination = c(rep(c("Office 1", "Office 2", "Office 3",
    "Office 4", "Office 5"), 9)),
  Time = c(15.23, 14.32, 14.77, 15.12, 14.05,
  15.48, 14.13, 14.46, 15.62, 14.23, 15.19, 14.67, 14.48, 15.34, 14.22,
  16.66, 16.27, 16.35, 16.93, 15.05, 16.98, 16.43, 15.95, 16.73, 15.62,
  16.53, 16.26, 15.69, 16.97, 15.37, 17.12, 16.65, 15.73, 17.77, 15.52,
  16.15, 16.86, 15.18, 17.96, 15.26, 16.36, 16.44, 14.82, 17.62, 15.04)
)


> anova(lm(Time ~ Service*Destination, data = delivery.df))
Response: Time
                    Df  Sum Sq Mean Sq  F value    Pr(>F)    
Service              2 23.1706 11.5853 161.5599 < 2.2e-16 ***
Destination          4 17.5415  4.3854  61.1553 5.408e-14 ***
Service:Destination  8  4.1888  0.5236   7.3018 2.360e-05 ***
Residuals           30  2.1513  0.0717                       

> anova(lm(Time ~Destination*Service, data = delivery.df))
Response: Time
                    Df  Sum Sq Mean Sq  F value    Pr(>F)    
Destination          4 17.5415  4.3854  61.1553 5.408e-14 ***
Service              2 23.1706 11.5853 161.5599 < 2.2e-16 ***
Destination:Service  8  4.1888  0.5236   7.3018 2.360e-05 ***
Residuals           30  2.1513  0.0717                       

这里的值不取决于表明我做了方差分析的顺序

问题

  • 我认为我首先做了 ANCOVA 然后是 ANOVA 是否正确?
  • 代码在哪里不同导致一个分析是 ANOVA 而另一个是 ANCOVA?
  • 因为,在 ANCOVA 中顺序很重要,如果我愿意,我会认为我可以在主效应之前计算交互作用。我试过anova(lm(Time ~ Destination:Service+Destination+Service, data = delivery.df))了,但互动仍然在最后。
2个回答

只要预测变量不独立,顺序就很重要。它们在您的第一个示例中是相关的,因为它们是对每颗钻石的连续测量,但在第二个示例中不是,因为它们是以平衡的方式分配的。

ANOVA/ANCOVA/regression 都是线性模型的名称;他们在数学上做同样的事情。当预测变量是分类变量时,通常使用名称 ANOVA,而当预测变量是连续变量时,通常使用名称回归。当同时存在连续和分类预测变量时,通常使用 ANCOVA 和“具有不同斜率的回归”。

有一种方法可以强制交互首先使用terms,但这几乎没有意义。

在这个问题发布几年后偶然发现了这个问题,同时用 R 寻找一些关于 ANCOVA 的信息。最后用钻石数据集写了一个更长的例子,我不会尝试把它塞在这里,但对于未来的搜索者来说,它位于这里: https ://ibecav.github.io/ancova_example/ 。

我会以这种方式回答您的 3 个原始问题:

  1. 从技术上讲,您的第一个示例既不是 ANOVA 也不是 ANCOVA。 price, table并且depth都是数值变量。你只是在倒退。ANOVA 和 ANCOVA 始终涉及至少一个本质上是序数或名义的预测变量。
  2. 正如其他人所指出的,您得到了不同的答案,因为默认情况下aov使用类型 I 的平方和,并且该类型的顺序很重要。
  3. 正如其他人所指出的那样,*无论+您是使用lm还是aov

正如我所说,我不想尝试完整地复制我的示例,但这是一个简单的示例priceby cutandcolor

noCOVmodel <- aov(price ~ cut * color, diamonds2) car::Anova(noCOVmodel, type = 2)

pricebycutcolorwithcarat作为协变量

COVmodel <- aov(price ~ cut * color + carat, diamonds2) car::Anova(COVmodel, type = 2)