如何在merMod对象中找到带有交互项的原始变量(配有lme4包)?

时间:2014-12-10 10:53:51

标签: r interaction lme4

我想计算交互效果,如this blog posting所示,因此我可以计算y = (b0 + (b1 * xa) + (b3 * xa * xb)),其中b0是截距的估计值,b1是预测变量A和b3的估计是预测变量A和B之间相互作用的估计。

要做到这一点,我需要

  1. 拟合模型的估计值
  2. 预测变量的原始值(即使用变量的“data.frame”,其中每个值都插入上面显示的公式中)
  3. 对于“简单”广义线性模型,我可以使用数据矩阵参数将原始数据值存储在拟合模型对象中(glm(... x=TRUE)。例如:

    fit <- glm(f1care ~ c12hour + neg_c_7 + c172 + 
               sex1 + sex2 + c172:neg_c_7 + sex1:c12hour,
               data = mydf,
               x = TRUE,
               family = binomial("logit"))
    
    Coefficients:
                    Estimate Std. Error z value Pr(>|z|)    
    (Intercept)    1.4674300  0.1759883   8.338  < 2e-16 ***
    c12hour        0.0016157  0.0016315   0.990   0.3220    
    neg_c_7       -0.0549614  0.0108868  -5.048 4.45e-07 ***
    c1721         -0.1575547  0.2752344  -0.572   0.5670    
    sex12         -0.0320619  0.1286984  -0.249   0.8033    
    sex22          0.2091354  0.0874629   2.391   0.0168 *  
    neg_c_7:c1721  0.0090043  0.0202720   0.444   0.6569    
    c12hour:sex12 -0.0003121  0.0018246  -0.171   0.8642  
    
    > head(fit$x)
      (Intercept) c12hour neg_c_7 c1721 sex12 sex22 neg_c_7:c1721 c12hour:sex12
    1           1      10       9     0     1     1             0            10
    2           1       4      13     1     1     1            13             4
    3           1      12      21     0     1     1             0            12
    4           1      60      14     0     1     1             0            60
    5           1      40      17     0     1     1             0            40
    6           1      50      17     0     1     1             0            50
    

    如您所见,系数的名称与模型数据框(fit$x)中的列名相同。

    如果我找到一个交互术语(例如c12hour:sex12),我可以在冒号处拆分名称,使用c12hoursex12,并通过模型矩阵列名称查找值(名字相同)。

    现在我的问题是,如何使用merMod个对象执行此操作?用于使模型(fit@frame)与原始值相符的数据框的列名称看起来像这样:

    library(lme4)
    fit <- glmer(f1care ~ c12hour + neg_c_7 + c172 + 
                 sex1 + sex2 + 
                 c172:neg_c_7 + sex1:c12hour + (1|g2ctry),
                 data = mydf,
                 family = binomial("logit"))
    
    > colnames(fit@frame)[-1]
    [1] "c12hour" "neg_c_7" "c172"    "sex1"    "sex2"    "g2ctry" 
    

    通过summaryfixef访问的系数如下所示:

    Fixed effects:
                    Estimate Std. Error z value Pr(>|z|)    
    (Intercept)    1.2388127  0.2382648   5.199    2e-07 ***
    c12hour        0.0018070  0.0016450   1.098 0.272018    
    neg_c_7       -0.0387817  0.0115511  -3.357 0.000787 ***
    c1721          0.1187357  0.2842743   0.418 0.676181    
    sex12         -0.0305578  0.1306499  -0.234 0.815069    
    sex22          0.1580400  0.0897806   1.760 0.078358 .  
    neg_c_7:c1721 -0.0106958  0.0209961  -0.509 0.610458    
    c12hour:sex12 -0.0009486  0.0018350  -0.517 0.605206   
    
    > cbind(fixef(fit))
                           [,1]
    (Intercept)    1.2388126568
    c12hour        0.0018069626
    neg_c_7       -0.0387817065
    c1721          0.1187357405
    sex12         -0.0305578499
    sex22          0.1580400407
    neg_c_7:c1721 -0.0106958049
    c12hour:sex12 -0.0009485618
    

    如您所见,列名sex1sex2与系数“{1}}和sex12不相同(与第一个,简单{ {1}}示例,两者都相同)。

    我目前的方法是

    • 获取列名称(例如sex22
    • 检查它是否为glm,如果是,请检索sex1(例如factorlevels
    • concat列名称和因子级别(因此我们有12
    • 找到交互字词,其中包含连接的“预测名称”(因此sex11不会匹配,但sex12将匹配第二个交互字词sex11

    我想知道这是最好的还是唯一的解决方案,或者是否有可能出现“检测”交互条款的方式不起作用的情况?

1 个答案:

答案 0 :(得分:0)

好的,model.matrix执行操作并返回一个数据框,其中列名对应于模型摘要中的术语名称。