我有一个相当具体的正则表达式问题,这让我有些悲痛。我已从混合模型中删除了一个或多个固定效果(lme
或lme4
),并希望删除相应的随机斜率。但是,根据随机结构,这可能会留下不必要的+
符号,或者更糟糕的是,不会在|
之前留下任何内容。
分别使用lme
和lme4
获取lme.model$call$random
和findbars(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
从固定效果公式中删除了变量c
和dropterms
。由于它们不再作为固定效应存在,因此不应允许它们的随机斜率变化。
b
和c
:
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
或~ |
之间的空白处插入( |
。
答案 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))
使用常规公式时,您应该没有问题。