代码之家  ›  专栏  ›  技术社区  ›  MyQ

移除主效应时移除交互项

  •  1
  • MyQ  · 技术社区  · 6 年前

    例如,我有一个用R表示的公式

    y ~ x + z + xx + zz + tt + x:xx + x:zz + xx:z + zz:xx + xx:zz:tt
    

    或者更复杂 (y~x*z*xx*zz*tt)

    请注意,公式右侧的名称是有意选择的,以便在某种程度上与至少一个其他术语相似。

    现在的问题是如何删除与特定主要效果相关的交互项。例如,如果我删除术语x(主要效果),我想删除也包含x的交互术语,这里 x:xx

    我试过了。 grepl() 但它会删除任何部分或全部包含该词的术语。在我的示例中,它删除了 x,xx,x:xx,xx:z,zz:xx,xx:zz:tt

    有什么关于函数的想法吗?

    update : 我已经试过了:

    f = y ~ x + z + xx + zz + tt + x:xx + x:zz + xx:z + zz:xx + xx:zz:tt
    modelTerms = attr(terms(f)    , which = 'term.labels')
    modelTerms[!grepl(pattern = 'x', x = modelTerms)]
    
    3 回复  |  直到 6 年前
        1
  •  4
  •   Roland    6 年前

    使用 update.formula

    f <- y~x*z*xx*zz*tt
    update(f, . ~ . - x - x:.)
    #y ~ z + xx + zz + tt + z:xx + z:zz + xx:zz + z:tt + xx:tt + zz:tt + 
    #  z:xx:zz + z:xx:tt + z:zz:tt + xx:zz:tt + z:xx:zz:tt
    
    f <- y ~ x + z + xx + zz + tt + x:xx + x:zz + xx:z + zz:xx + xx:zz:tt
    update(f, . ~ . - x - x:.)
    #y ~ z + xx + zz + tt + z:xx + xx:zz + xx:zz:tt
    
        2
  •  1
  •   jay.sf    6 年前

    你在找这个吗?

    > modelTerms[!grepl(pattern='^x\\:x+', x=modelTerms)]
    [1] "x"        "z"        "xx"       "zz"       "tt"       "x:zz"     "z:xx"     "xx:zz"   
    [9] "xx:zz:tt"
    
        3
  •  1
  •   TPArrow    6 年前
    简单:

    f = y~x*z*xx*zz*tt
    modelTerms = attr(terms(f)    , which = 'term.labels')
    
    
    l = sapply(
        strsplit(x = modelTerms, split = '[:*]'),
        FUN = function(x) {
            'x' %in% x
        }
    )
    modelTerms[!l]