Nele ?formula
diz:
Há duas interpretações especiais de . em uma fórmula. A usual é no contexto de um argumento de dados de funções de ajuste de modelo e significa 'todas as colunas que não estão na fórmula': veja terms.formula. No contexto de update.formula, somente, significa 'o que estava anteriormente nesta parte da fórmula'.
Minha leitura da primeira parte desse pedaço de documentação me levou a supor que este código:
dat <- data.frame(
y = rnorm(10),
x1 = runif(10),
x2 = rbinom(10,size = 1,prob = 0.5),
x3 = rbinom(10,size = 1,prob = 0.5)
)
mt <- terms.formula(
x = y ~ x1 + . + (.)^2,
data = dat
)
mm <- model.matrix(mt,dat)
...produziria uma matriz modelo com um termo de interação somente para x2:x3
, já que essas são as únicas duas colunas em dat
"não de outra forma na fórmula". No entanto:
> colnames(mm)
[1] "(Intercept)" "x1" "x2" "x3" "x1:x2"
[6] "x1:x3" "x2:x3"
...em vez disso, obtemos todas as interações.
Se eu escrever explicitamente, é claro, obtenho o que espero:
> mt1 <- terms.formula(
+ x = y ~ x1 + x2 + x3 + (x2 + x3)^2,
+ data = dat
+ )
>
> mm1 <- model.matrix(mt1,dat)
> colnames(mm1)
[1] "(Intercept)" "x1" "x2" "x3" "x2:x3"
Sei que fórmulas e matrizes de modelos às vezes são sutilmente confusas, mas estou tendo dificuldade em conciliar minha leitura da documentação com o comportamento.
Estou interpretando a documentação incorretamente, ou possivelmente escrevendo a fórmula incorretamente (para o que estou tentando fazer)? Ou a documentação não é totalmente precisa?
Parece que "não de outra forma na fórmula" pode realmente significar "não no lado esquerdo da fórmula": por exemplo
(enquanto bobo) não inclui
x1
nas interações. Por outro lado, incluiroffset(x1)
não conta.O código interno para
terms
é assustador, mas este comentário(ênfase adicionada) reforça a conclusão.
Vale ressaltar que isso também funciona para excluir
x1
da interação: