【发布时间】:2019-04-30 10:15:12
【问题描述】:
我想从模型公式中提取信息,尤其是我想去除随机效应,以便从混合模型(lme4-notation)中获得“固定效应部分”。
为此,我在找到括号 ( 之前在公式中搜索最后一个 +。 + 之前的所有内容都必须是公式的“固定”部分。这适用于具有固定效应预测器/变量的模型。
但是,对于空模型(仅在固定效果中拦截),可能没有 +,例如如果公式是Reaction ~ (Days | Subject)。在这种情况下,我检查是否有 no +-sign。但这不适用于具有 多个 随机部分的模型。在下面的示例中,grepl()for f2 应该返回 FALSE,但返回 TRUE,因为在随机部分的 second 开头括号中找到了 +。
我的问题:如何在第一个 ( 之后停止检查 +,从而忽略可能的第二个或第三个随机效应项?以下示例的目标是 grepl()-commands 返回 FALSE、FALSE、TRUE、TRUE。
f1 <- "Reaction ~ (1 + Days | Subject)"
f2 <- "Reaction ~ (1 | mygrp/mysubgrp) + (1 | Subject)"
f3 <- "Reaction ~ x1 + x2 + (1 + Days | Subject)"
f4 <- "Reaction ~ x1 + x2 + (1 | mygrp/mysubgrp) + (1 | Subject)"
# works!
grepl("\\+(\\s)*\\((.*)\\)", f1) # should return FALSE
#> [1] FALSE
# fails...
grepl("\\+(\\s)*\\((.*)\\)", f2) # should return FALSE
#> [1] TRUE
# works!
grepl("\\+(\\s)*\\((.*)\\)", f3) # should return TRUE
#> [1] TRUE
# works!
grepl("\\+(\\s)*\\((.*)\\)", f4) # should return TRUE
#> [1] TRUE
【问题讨论】:
-
顺便问一下:谁能详细说明为什么
grepl("\\~[:space:]*[:alnum:]+[:space:]*\\+", f3)返回FALSE和stringr::str_detect(f3, "\\~[:space:]*[:alnum:]+[:space:]*\\+")返回TRUE? -
@Roman: 试试
grepl("\\~[[:space:]]*[[:alnum:]]+[[:space:]]*\\+", f3) -
FFS。 @AkselA 谢谢。我以为我要疯了。
-
@Roman:不,只是 R 是它的特殊自我。 ;)
-
由于问题最终与模式匹配无关,因此更改标题可能是合适的,因此其他试图从公式中删除随机效应的人可以找到它。