2015-05-07 3 views
1

У меня есть довольно специфическая проблема с регулярными выражениями, которая вызывает у меня некоторое горе. Я удалил один или несколько фиксированных эффектов из смешанной модели (либо 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 в пустое пространство между ~ | или (|.

+5

Вы действительно хотите решить это регулярное выражение? Если вы работаете с формулами, существуют другие функции для манипулирования формулами, которые не приведут к недопустимому синтаксису. Если вы хотите удалить переменную, попробуйте 'update (y ~ a + b, ~.-B)' – MrFlick

+0

Будет ли это работать для смешанных моделей, особенно в пакете 'lme4', где' update' работает по всей формуле (фиксированные и случайные эффекты)? – jslefche

+1

Было бы полезно, если бы вы предоставили воспроизводимый пример того, что вы на самом деле пытаетесь достичь. Предоставляйте формулы ввода, переменные, которые вы хотите удалить, и желаемый результат. – MrFlick

ответ

3

Половина предметов в вашем стартовом списке - это правильные формулы (те, у которых есть «~»). Я не уверен, что вы делаете с терминами в скобках. Но для формул вы можете использовать пакет 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)) 

и просмотреть результаты с

sapply(nx, deparse) 

# [1] "~1 | random1" 
# [2] "~x1 | random1" 
# [3] "~x1 | random1" 
# [4] "~x1 | random1" 
# [5] "~x1 + x2 | random1" 
# [6] "~x1 + x2 | random1" 

У вас не должно возникнуть проблемы с использованием этих методов, когда бы вы не использовали регулярные формулы.

+0

Хм, это интересный подход и должен работать для 'lme', где формула случайных эффектов хранится отдельно - спасибо !. Я не знал, что «Формула» сохранит бары. Но, к сожалению, он не будет работать с синтаксисом от 'lmer' - он не удалит или не заменит случайный уклон, например: ' x = "y ~ x2 + (x2 | random1)"; x = Формула (as.formula (x)); обновление (x, ~.-X2) ' – jslefche

Смежные вопросы