R中的自定义对比:对比系数矩阵或对比矩阵/编码方案?怎么去那里?

tim*_*tim 11 r matrix anova

自定义对比在分析中被广泛使用,例如:"这三级因子的1级和3级DV值是否显着不同?"

直观地说,这种对比用细胞方式表示为:

c(1,0,-1)
Run Code Online (Sandbox Code Playgroud)

这些对比中的一个或多个(作为列绑定)形成对比系数矩阵,例如

mat = matrix(ncol = 2, byrow = TRUE, data = c(
    1,  0,
    0,  1,
   -1, -1)
)
     [,1] [,2]
[1,]    1    0
[2,]    0    1
[3,]   -1   -1
Run Code Online (Sandbox Code Playgroud)

然而,当涉及运行系数矩阵指定的这些对比时,在网络和书籍中存在许多(显然是矛盾的)信息.我的问题是哪些信息是正确的?

权利要求1:对比(因子)采用系数矩阵

在一些示例中,示出了用户可以通过一个contrasts()或多个C()函数直接使用直观对比度系数矩阵.所以它很简单:

contrasts(myFactor) <- mat
Run Code Online (Sandbox Code Playgroud)

权利要求2:变换系数以创建编码方案

在其他地方(例如UCLA统计数据),我们被告知系数矩阵(或基础矩阵)必须在使用前从系数矩阵转换为对比矩阵.这包括采用系数矩阵变换的逆:(mat')?¹或者,在Rish中:

contrasts(myFactor) = solve(t(mat))
Run Code Online (Sandbox Code Playgroud)

该方法需要用矩阵填充矩阵,用于截距.为了避免这种情况,一些网站建议使用可以处理非方形矩阵的广义逆函数,即MASS::ginv()

contrasts(myFactor) = ginv(t(mat))
Run Code Online (Sandbox Code Playgroud)

第三种选择:通过变换预乘,取逆,并乘以变换后乘

在其他地方(例如来自SPSS支持的说明),我们学习正确的代数是:(mat'mat)-¹ mat'

告诉我,创建对比矩阵的正确方法应该是:

x = solve(t(mat)%*% mat)%*% t(mat)
     [,1] [,2] [,3]
[1,]    0    0    1
[2,]    1    0   -1
[3,]    0    1   -1

contrasts(myFactor) = x
Run Code Online (Sandbox Code Playgroud)

我的问题是,哪个是对的?(如果我准确地解释和描述每条建议).一个人如何指定自定义中的R对比的lm,lme等等?

参考文献

sta*_*kur 2

主张 2 是正确的(请参阅此处此处的答案),有时主张 1 也是正确的。这是因为在某些情况下,(转置的)系数矩阵的广义逆等于矩阵本身。