Как описать условия регрессионного взаимодействия в компактной форме? - PullRequest
2 голосов
/ 12 февраля 2020

У меня есть регрессоры a, b, c, e_1 и e_2, и я хочу запустить следующую регрессию:

y ~ a + b + c + e_1 + e_2 + a.e_1 + a.e_2 + b.e_1 + b.e_2 + c.e_1 + c.e_2

Каждый e_1 и e_2 должны взаимодействовать с a, b и c переменными.

У меня на самом деле есть 5 e и 5 других переменных. Какой самый быстрый способ написать код вместо того, чтобы писать по отдельности a:e_1, a:e_2 et c.

Ответы [ 2 ]

1 голос
/ 12 февраля 2020

Как насчет ~(a+b+c)*(e1+e2)?

Пример:

dd <- data.frame(a=1,b=1,c=1,e1=1,e2=1)
colnames(model.matrix(~(a+b+c)*(e1+e2),dd)
##  [1] "(Intercept)" "a"           "b"           "c"           "e1"         
##  [6] "e2"          "a:e1"        "a:e2"        "b:e1"        "b:e2"       
## [11] "c:e1"        "c:e2"     

Для большего набора переменных, альтернатива решению @ ThomasIsCoding:

pfun <- function(x) paste("(", paste(x,collapse="+"), ")")
reformulate(paste(pfun(p), "*", pfun(q)), response="y")
1 голос
/ 12 февраля 2020

Если вы знаете сгруппированные имена переменных для интерактивных частей в формуле, например p и q ниже

p <- c("a","b","c")
q <- c("e_1","e_2")

, вы можете попробовать следующий код для генерации всей формулы, используя as.formula и paste0, т.е.

f <- as.formula(paste0("y ~",paste0(c(p,q,do.call(paste, c(expand.grid(p,q),sep = ":"))),collapse = "+")))

, таких что

> f
y ~ a + b + c + e_1 + e_2 + a:e_1 + b:e_1 + c:e_1 + a:e_2 + b:e_2 + 
    c:e_2

и

> class(f)
[1] "formula"
...