自定义对比在分析中被广泛使用,例如:“这三级因子的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
然而,当涉及运行系数矩阵指定的这些对比时,网上和书中有很多(显然是矛盾的)信息。我的问题是哪些信息是正确的?
在一些示例中,向用户示出直观对比度系数矩阵可以通过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中为lm
,lme
等指定自定义对比?
参考文献
答案 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]
如果您创建了两个虚拟变量(例如:
),那么结果就是IDENTICALDummy1<- ifelse(Variable=="A", 1, ifelse(Variable=="B", -1, 0))
Dummy2<- ifelse(Variable=="A", .5, ifelse(Variable=="B", .5, -1))
并将它们输入回归方程而不是你的因子,这使我倾向于认为这是正确的方法。
PS我不会写出最优雅的R代码,但它可以完成工作。对不起,我确定有更简单的方法来重新编码变量,但是你得到了要点。
答案 1 :(得分: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
。