R中的自定义对比:对比系数矩阵或对比矩阵/编码方案?以及如何到达那里?

时间:2015-08-04 19:57:57

标签: r matrix anova

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

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

c(1,0,-1)

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

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

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

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

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

contrasts(myFactor) <- mat
权利要求2:变换系数以创建编码方案

在其他地方(例如UCLA stats)我们被告知系数矩阵(或基础矩阵)必须在使用前从系数矩阵转换为对比矩阵。这包括取系数矩阵的变换的倒数:(mat')⁻¹,或者,在Rish中:

contrasts(myFactor) = solve(t(mat))

此方法需要使用初始的截距列填充矩阵。为避免这种情况,一些网站建议使用可以处理非平方矩阵的广义逆函数,即MASS::ginv()

contrasts(myFactor) = ginv(t(mat))

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

在其他地方(例如来自SPSS support的注释),我们了解到正确的代数是:(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

我的问题是,哪个是对的? (如果我准确地解释和描述每条建议)。如何在R中为lmlme等指定自定义对比?

参考文献

3 个答案:

答案 0 :(得分:1)

它的价值......

如果您有3个等级的因子(等级A,B和C)并且您想要测试以下正交对比:A对B和平均值。对于A和B对C,你的对比代码将是:

Cont1<- c(1,-1, 0)
Cont2<- c(.5,.5, -1)

如果您按照UCLA网站的指示(转换系数来制作编码方案),那么:

Contrasts(Variable)<- solve(t(cbind(c(1,1,1), Cont1, Cont2)))[,2:3]

如果您创建了两个虚拟变量(例如:

),那么结果就是IDENTICAL
Dummy1<- ifelse(Variable=="A", 1, ifelse(Variable=="B", -1, 0))
Dummy2<- ifelse(Variable=="A", .5, ifelse(Variable=="B", .5, -1))

并将它们输入回归方程而不是你的因子,这使我倾向于认为这是正确的方法。

PS我不会写出最优雅的R代码,但它可以完成工作。对不起,我确定有更简单的方法来重新编码变量,但是你得到了要点。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

我可能遗漏了一些东西,但在你的三个例子中,你都以相同的方式指定对比矩阵,即

## Note it should plural of contrast
contrasts(myFactor) = x

唯一不同的是x的价值。

以加州大学洛杉矶分校网站上的数据为例

hsb2 = read.table('http://www.ats.ucla.edu/stat/data/hsb2.csv', header=T, sep=",")

#creating the factor variable race.f
hsb2$race.f = factor(hsb2$race, labels=c("Hispanic", "Asian", "African-Am", "Caucasian"))

我们可以指定对比的treatment版本

contrasts(hsb2$race.f) = contr.treatment(4)
summary(lm(write ~ race.f, hsb2))

sum

contrasts(hsb2$race.f) = contr.sum(4)
summary(lm(write ~ race.f, hsb2))

或者,我们可以指定一个定制的对比矩阵。

有关其他标准对比,请参阅?contr.sum