R中的公式操作

4
我正在尝试编写类似于MASS:stepAIC函数的功能,用于具有固定和混合效应的高斯模型。这个想法是使它完全可推广到许多固定和混合效应,因为这些任务对于少数任务可以手动完成。
我希望能够像lmer一样将公式作为输入写入:
`Y ~ x1 + x2 + (a|b) + (1|c)
我无法从公式类中提取所需的信息。此外,我需要能够将某些变量的选定部分放回lm和lmer函数中。因此,我希望能够将公式的各个部分提取出来:
data      fixed effects       mixed effects
Y              x1                 a|b
               x2                 1|c

我需要能够自动将任意一组固定效应和混合效应发送到lm函数中:

lm(y ~ x1)


2
固定效应和混合效应总是成对出现吗?您需要多大的灵活性?混合效应总是采用(a|b)的形式吗? - Spacedman
1
你可能需要先查看lme4包中(私有的)lme4:::drop1.mer函数的内部实现... - Ben Bolker
@Spacedman,我希望它尽可能通用。目前我没有任何比a|b更复杂的混合效应,因此这将是期望达到的初始水平。谢谢。 - Peter Dutton
另一个要看的例子是lattice包中的latticeParseFormula函数。我关心的是你的公式如何确定哪个元素是模型的哪个部分。Y很容易,因为它在左侧,但对于R来说,右侧只是一系列等效事物的总和。nlme函数有几个公式参数可以指定模型的每个部分 - 也许这是一个可行的方法? - Spacedman
1个回答

2
如果我们能精确地假设混合效应项的形式为(variable|variable),那么:
library(gsubfn)
fo <- Y ~ x1 + x2 + (a|b) + (1|c)

mixed.vec <- strapplyc(format(fo), "[(] *(\\w+) *[|] *(\\w+) *[)]")[[1]]
mixed <- matrix(mixed.vec, byrow = TRUE, nc = 2)
fixed <- setdiff(all.vars(fo)[-1], mixed)

以下是给出的结果:
> mixed
     [,1] [,2]
[1,] "a"  "b" 
[2,] "1"  "c" 
> fixed
[1] "x1" "x2"

这里的“mixed”是一个矩阵,它的第一列包含了|之前的变量,第二列包含了对应的|之后的变量。

这很棒。只是我发现如果公式太长,格式会将其分成多行,从而可能破坏混合效应。可以使用as.character(fo)[3]来解决这个问题。 - Peter Dutton
已经完成了,非常感谢,现在可以使用任何glm模型,lme4中的glm和glmer都可以解决并执行前向拟合过程,打印出所有步骤以实现透明,并节省大量费力的工作... - Peter Dutton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接