tl; dr мое лучшее предположение, что вы должны использовать I(...^m)
для защиты ^
/ чтобы R считал его оператором числового возведения в степень.
Я нашел salmonella
в пакете faraway
и может подтвердить вашу ошибку.В самом деле, это сохраняется благодаря ряду упрощений.
m <- 1 ## same results with m <- 2L, etc.
mod = glm(colonies ~ (as.numeric(as.factor(dose)))^(m), data = salmonella, family = "poisson")
mod = glm(colonies ~ dose^(m), data = salmonella, family = "poisson")
mod = glm(colonies ~ dose^m, data = salmonella, family = "poisson")
mod = lm(colonies ~ dose^m, data = salmonella)
Похоже, что интерфейс формулы R не допускает символическое замещение в степени в формуле.
Однако : если то, что вы действительно пытаетесь сделать, это
- , то конвертируйте
dose
в равномерно распределенное целое значение (0 = 1, 10 = 2, 33 = 3) - использовать мощность этой дозы в качестве предиктора в GLM
, а затем с помощью I()
указать, что R должен обрабатывать ^
как числовой оператор, а не оператор взаимодействия в формуле, это то, что вы хотите:
ss <- transform(salmonella, numdose=as.numeric(as.factor(dose)))
mod = glm(colonies ~ I(numdose^m), data = ss, family = "poisson")
OTOH картина показывает, что это не совсем сумасшедший (хотя и ненужный):
library(ggplot2); theme_set(theme_bw())
m <- 2
ggplot(ss,aes(numdose,colonies))+
geom_point()+
geom_smooth(method="glm",method.args=list(family=poisson))+
geom_smooth(method="glm",method.args=list(family=poisson),
formula=y~I(x^m),colour="red")
ggsave("numdose.png")
