删除主要效果后删除交互项

时间:2019-02-12 14:10:20

标签: r regex

例如,我在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

关于执行此功能的任何想法?

更新: 我已经尝试过的:

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 个答案:

答案 0 :(得分:4)

使用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

答案 1 :(得分:1)

您在寻找这个吗?

> modelTerms[!grepl(pattern='^x\\:x+', x=modelTerms)]
[1] "x"        "z"        "xx"       "zz"       "tt"       "x:zz"     "z:xx"     "xx:zz"   
[9] "xx:zz:tt"

答案 2 :(得分:1)

简单:

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]