R model.tables() 不正确的意思——可能的错误?

机器算法验证 r 方差分析
2022-03-24 22:38:07

我在 SPSS 和 R 中进行方差分析,令我惊讶的是,最新版本的 R 的结果不正确。

当我使用该函数model.tables(x,"means")获取描述性统计数据时,第二个依赖项的自变量均值略有不正确(例如,129 而不是 130.27)。

我的问题是什么可能导致问题?我是 R 的新手,但使用相同的数据,SPSS 正确地得到了结果,所以显然有问题。

head(data)

  skupina pohlavie zodpovedny
1       1        1        152
2       1        1        118
3       2        2         88
4       2        1        140

代码:

x <- aov(zodpovedny ~ pohlavie*skupina,data=data)
model.tables(x,"means")

问题说明:

这是不幸的。

3个回答

正如您所指出的,单个单元格意味着匹配,但是您看到问题的地方在于边际均值。有多种计算边际均值的方法。假设数据有关于性别(男性/女性)和年龄(老/年轻)的信息,我们想要计算性别的边际。一种方法是忽略年龄变量,只取所有男性的平均值和所有女性的平均值。另一种方法是通过平均老年男性的平均值和年轻男性的平均值来找到男性的平均值(将 2 个平均值相加并除以 2)。在平衡设计中,这两种方法将给出相同的答案(可以用简单的代数表示),但在不平衡的情况下,它们通常会给出不同的答案,因为每个数据点对整体平均值的权重不同。使用基于模型的手段,您可以从我提到的 2 中获得不同的权重(我将它们用作示例作为简单的理解方式)。我希望在您的情况下,R 和 SPSS 可能使用不同的方法。

@mnel 是正确的,因为设计不平衡,术语的顺序在model.tables.

补充:在 的帮助文件中aov,我们读到它“专为平衡设计而设计,如果没有平衡,结果可能难以解释。” 因此,如果您想要简单的描述性统计数据,最好直接询问它们。

现在,如果您自己发布了一个完整的数据集会更好,即使您必须制作一个显示相同问题的备用数据集。但是你很幸运,一个好奇的读者想知道发生了什么,所以我为你做了那个。这是一个示例数据集:

library(reshape2)
set.seed(5)
d <- expand.grid(a=factor(LETTERS[1:2]), b=factor(letters[1:2]))
d <- d[rep(1:4, c(15,9,11,10)),]
d$y <- round(rnorm(nrow(d), mean=10, sd=2),1)

我们看到模型中项的顺序很重要(输出截断):

> model.tables(aov(y ~ a*b, data=d), "means")
 a      A      B
    10.43  9.921
 b      a      b
    9.843  10.64

> model.tables(aov(y ~ b*a, data=d), "means")
 b       a      b
     9.867  10.61
 a       A      B
     10.46  9.877

模型中的第一项与实际均值一致,另一项不同。

> tapply(d$y, d$a, mean)
        A         B 
10.426923  9.921053 
> tapply(d$y, d$b, mean)
        a         b 
 9.866667 10.609524 

注意我说的不同,没有错。它告诉您有关模型的正确信息。实际上,我不确定是什么,但我很好奇,我可能会查看代码model.tables以查看什么。(也许不是,已经很晚了。)

注意:该model.tables()功能仅适用于平衡设计。如果您想为不平衡设计提供边际手段,您应该使用该popMeans()功能。假设您有以下模型:

Check.Model <- aov(dependent ~ factor1 + factor2, data=data.data)

如果您希望在不平衡设计中 的水平factor1(即平均水平)的边际均值,您应该使用包中的函数factor2popMeans()doBy

popMeans(Check.Model, eff=c("factor1"))