R中model.matrix中有序因子的列名

时间:2017-02-28 06:39:17

标签: r

我使用model.matrix函数创建了一个设计矩阵。

如果我使用有序因子数据,我会在列名称中得到LQC个后缀。 这些后缀的含义是什么以及它们如何映射到因子级别? model.matrix的帮助文件在此问题上不明确。

head( model.matrix( as.formula( ~ ps ), 
                    model.frame( as.formula( ~ ps ),
                                 data.frame(ps = factor( x =  sample(x = c( 'none', '3XLT', '41X',  '3X' ),
                                                                     size = 50,
                                                                     replace = TRUE ),
                                                         levels = c( '3X', '3XLT', '41X', 'none' ),
                                                         ordered = TRUE ) ) ) ) )

#   (Intercept)       ps.L ps.Q       ps.C
# 1           1 -0.2236068 -0.5  0.6708204
# 2           1  0.6708204  0.5  0.2236068
# 3           1  0.6708204  0.5  0.2236068
# 4           1  0.2236068 -0.5 -0.6708204
# 5           1  0.6708204  0.5  0.2236068
# 6           1 -0.2236068 -0.5  0.6708204

如果我使用无序因子,我可以通过列名轻松跟踪列的映射。

head( model.matrix( as.formula( ~ ps ), 
                    model.frame( as.formula( ~ ps ),
                                 data.frame(ps = factor( x =  sample(x = c( 'none', '3XLT', '41X',  '3X' ),
                                                                     size = 50,
                                                                     replace = TRUE ),
                                                         levels = c( '3X', '3XLT', '41X', 'none' ) ) ) ) ) )

#   (Intercept) ps3XLT ps41X psnone
# 1           1      0     0      1
# 2           1      1     0      0
# 3           1      0     0      1
# 4           1      1     0      0
# 5           1      0     0      0
# 6           1      1     0      0

1 个答案:

答案 0 :(得分:1)

我仍然不知道这些后缀的含义,可能还有一些历史原因。

调试model.matrix函数后,调用了其中的C_modelmatrix

.External2(C_modelmatrix, t, data)

对于有序因子contrasts.poly用于使用此调用中定义的make.poly函数获取设计矩阵。获取设计矩阵后,将修改列名称,并为列2 - 4提供奇怪的后缀。第一列将被忽略,如果有超过4列,则将保留其名称,如下所示。 make.poly功能。

contr <- make.poly(n, scores)
if (contrasts) {
  dn <- colnames(contr)
  dn[2:min(4, n)] <- c(".L", ".Q", ".C")[1:min(3, n - 1)]
  colnames(contr) <- dn
  contr[, -1, drop = FALSE]
}

总之,这些后缀没有任何意义,但是它们被映射到从2到4的有序因子的级别。对于长度大于4的因子级别,不应用重命名。请参阅下面的示例。

head( model.matrix( as.formula( ~ ps ), 
                    model.frame( as.formula( ~ ps ),
                                 data.frame(ps = factor( x =  sample(x = c( 'none', '3XLT', '2X', '41X',  '3X' ),
                                                                     size = 50,
                                                                     replace = TRUE ),
                                                         levels = c( '3X', '3XLT', '2X', '41X', 'none' ),
                                                         ordered = TRUE ) ) ) ) )

#   (Intercept)       ps.L       ps.Q          ps.C       ps^4
# 1           1  0.0000000 -0.5345225 -4.095972e-16  0.7171372
# 2           1  0.0000000 -0.5345225 -4.095972e-16  0.7171372
# 3           1  0.3162278 -0.2672612 -6.324555e-01 -0.4780914
# 4           1 -0.6324555  0.5345225 -3.162278e-01  0.1195229
# 5           1  0.3162278 -0.2672612 -6.324555e-01 -0.4780914
# 6           1 -0.6324555  0.5345225 -3.162278e-01  0.1195229

contr

的输出
contr <- make.poly(n, scores)
Browse[6]> contr
#             ^0         ^1         ^2            ^3         ^4
# [1,] 0.4472136 -0.6324555  0.5345225 -3.162278e-01  0.1195229
# [2,] 0.4472136 -0.3162278 -0.2672612  6.324555e-01 -0.4780914
# [3,] 0.4472136  0.0000000 -0.5345225 -4.095972e-16  0.7171372
# [4,] 0.4472136  0.3162278 -0.2672612 -6.324555e-01 -0.4780914
# [5,] 0.4472136  0.6324555  0.5345225  3.162278e-01  0.1195229 

修改 有序因子对比矩阵中L,Q,C的扩展对应于线性,二次和三次项。更多度的多项式项(大于3)的命名由该多项式项的度数值表示。