习惯对比在分析中被广泛使用,例如:“在这个三级因子的第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:转换系数以创建编码方案
在其他地方(如加州大学洛杉矶分校统计),我们被告知系数矩阵(或基矩阵)在使用前必须从系数矩阵转换为对比矩阵。这涉及到系数矩阵的变换的逆:(mat')⁻¹,或者,在Rish中:
contrasts(myFactor) = solve(t(mat))此方法需要在矩阵中填充一列用于拦截的初始设备。为了避免这种情况,一些站点建议使用一个可以处理非平方矩阵的广义逆函数,即MASS::ginv()。
contrasts(myFactor) = ginv(t(mat))第三种选择:乘积为变换,取逆运算,后乘为变换。
在其他地方(例如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我的问题是,哪个是对的?(如果我正在准确地解释和描述每一条建议)。如何为lm、lme等指定R中的自定义对比?
参
发布于 2019-01-02 17:44:58
发布于 2016-06-09 21:09:15
不管它值多少钱..。
如果你有一个3级的因子( A,B和C级),并且你想测试以下的正交对比:a和B,以及avg。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]那么,如果您创建了两个虚拟变量(例如:
Dummy1<- ifelse(Variable=="A", 1, ifelse(Variable=="B", -1, 0))
Dummy2<- ifelse(Variable=="A", .5, ifelse(Variable=="B", .5, -1))把它们都输入回归方程,而不是你的因素,这让我倾向于认为这是正确的方法。
PS我不写最优雅的R代码,但它完成了工作。抱歉,我肯定还有更简单的方法来记录变量,但是你得到了要点。
发布于 2015-08-04 22:01:15
我可能遗漏了什么,但是在三个例子中,您都以相同的方式指定了对比度矩阵,即
## 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。
https://stackoverflow.com/questions/31818174
复制相似问题