【问题标题】:Custom contrasts in R: contrast coefficient matrix or contrast matrix / coding scheme? And how to get there?R中的自定义对比:对比系数矩阵或对比矩阵/编码方案?以及如何到达那里?
【发布时间】:2015-10-27 09:11:35
【问题描述】:

自定义对比在分析中应用非常广泛,例如:“这个三水平因子的水平 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(factor) 采用系数矩阵

在一些示例中,向用户展示了直观的对比度系数矩阵可以通过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 等指定自定义对比?

参考文献

【问题讨论】:

  • 应该是 matrix(ncol=2, ...) 而不是 matrix(col=2, ...)

标签: r matrix anova


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    为了它的价值......

    如果您有一个具有 3 个级别(级别 A、B 和 C)的因子,并且您想要测试以下正交对比:A 与 B,以及 avg. A 和 B vs 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 代码,但它可以完成工作。抱歉,我确信有更简单的方法来重新编码变量,但你明白了要点。

    【讨论】:

      【解决方案3】:

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

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

      唯一不同的是x 的值。

      以 UCLA 网站的数据为例

      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

      【讨论】:

      • 谢谢@csgillespie。抱歉,如果不清楚:问题是如何指定自定义对比矩阵(而不是如何获得内置对比)。因此,就您的回答而言,问题是“关于指定定制对比度矩阵的建议相互矛盾——这是对的吗?”
      • 但是在你的三个例子中,你得到一个定制矩阵m,然后使用contrasts(...) = m 来设置。
      • 三个例子给出了不同的结果:1 将定制系数矩阵插入contrasts(myFactor)&lt;-m,下一个插入solve(t(m)),最后一个插入x = solve(t(m)%*% m)%*% t(m)。您是说解决方案 1 是正确的,并且只需将 contrasts() 设置为系数矩阵吗?
      • 我明白你的意思。我得再考虑一下。同时我会删除我的答案,因为你更有可能得到另一个答案
      猜你喜欢
      • 1970-01-01
      • 2012-09-22
      • 2013-11-24
      • 1970-01-01
      • 2011-08-01
      • 2014-04-22
      • 1970-01-01
      • 2020-01-07
      • 2023-02-16
      相关资源
      最近更新 更多