如何从混合模型公式中删除术语

时间:2015-05-07 19:15:42

标签: regex r lme4 mixed-models nlme

我有一个相当具体的正则表达式问题,这让我有些悲痛。我已从混合模型中删除了一个或多个固定效果(lmelme4),并希望删除相应的随机斜率。但是,根据随机结构,这可能会留下不必要的+符号,或者更糟糕的是,不会在|之前留下任何内容。

分别使用lmelme4获取lme.model$call$randomfindbars(formula(lme4.model))的随机效果公式列表:

   random.structures = list(
  "~ b | random1",
  "(b | random1)",
  "~ b + x1 | random1",
  "(b + x1 | random1)",
  "~ x1 + b| random1",
  "(x1 + b| random1)",
  "~ b + x1 + c | random1",
  "(b+ x1 + c | random1)",
  "~b + x1 + x2 | random1",
  "(b + x1 + x2 | random1)",
  "~ x1 + x2 + b | random1",
  "(x1 + x2 + b | random1)"
)

我已使用b从固定效果公式中删除了变量cdropterms。由于它们不再作为固定效应存在,因此不应允许它们的随机斜率变化。

可以使用以下行从上面的随机公式中删除

bc

random.structures = lapply(random.structures, function(i) gsub("b|c", "", i))

现在,我希望删除所有剩余的+符号,即那些不链接变量的符号。

然后,如果~(|之间有空格,我希望插入1

所需的输出是

random.structures2 = list(
  "~ 1 | random1",
  "(1 | random1)",
  "~ x1 | random1",
  "(x1 | random1)",
  "~ x1 | random1",
  "(x1 | random1)",
  "~ x1 | random1",
  "(x1 | random1)",
  "~ x1 + x2 | random1",
  "(x1 + x2 | random1)",
  "~ x1 + x2 | random1",
  "(x1 + x2 | random1)"
)

我摆弄了gsub,但似乎无法做到正确。例如,这有效:

gsub("(.*)\\+\\ |(.*)\\+(\\|)", "\\1", random.structures[[3]])
# Accounting for space or lack of space between + and |

但不是为了这个:

gsub("(.*)\\+\\ |(.*)\\+(\\|)", "\\1", random.structures[[7]])

或者,如果对于随机结构存在类似dropterms的预先存在的函数,我全都在!

同样,我无法在1~ |之间的空白处插入( |

1 个答案:

答案 0 :(得分:3)

您的起始列表中的一半项目是正确的公式(带有"〜"的公式)。我不确定你在用括号中的术语做什么。但是对于公式,您可以使用TIMESTAMP包来更好地支持使用条件术语删除术语。

这里我将使用正确的公式子集并转换为Formula个对象。

Formula

我们可以通过

快速达到峰值
library(Formula)
rx <- lapply(random.structures[grep("~", random.structures)],
    function(x) Formula(as.formula(x)))

现在,我们可以使用

从所有这些中移除sapply(rx, deparse) # [1] "~b | random1" # [2] "~b + x1 | random1" # [3] "~x1 + b | random1" # [4] "~b + x1 + c | random1" # [5] "~b + x1 + x2 | random1" # [6] "~x1 + x2 + b | random1" b
c

并使用

查看结果
nx <- lapply(x, function(x) update(x, ~.-b-c))

使用常规公式时,您应该没有问题。