我正在尝试对剂量预测器进行改造,这是我的代码:
mod = glm(colonies ~ (as.numeric(as.factor(dose)))^(m), data = salmonella, family = "poisson")其中"m“是我使用的能量。但是,我得到了一个错误
> mod = glm(colonies ~ (as.numeric(as.factor(dose)))^(m), data = salmonella, family = "poisson")
Error in terms.formula(formula, data = data) : invalid power in formula有人知道为什么吗?
抱歉,我没说清楚。这里我的m是-0.18182,来自之前的计算。我现在明白了我不应该使用as.numeric(as.factor)。但是如果代码是
mod = glm(colonies ~ (as.factor(dose))^(m), data = salmonella, family = "poisson")错误仍然存在。这很奇怪,因为当我把m改成2的时候,它是有效的。
发布于 2019-03-06 04:22:29
tl;dr我最好的猜测是,你应该使用I(...^m)来保护^/have R,把它当作一个数值求幂运算符。
我在faraway包中找到了salmonella,可以确认您的错误。事实上,它坚持通过各种简化。
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)中的预测器
然后使用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")

发布于 2019-03-06 06:39:22
如果这是来自package:‘salmonella’的剂量数据集,那么就不能对剂量值使用as.factor或as.numeric,因为它已经是数字了。
换算成因子会严重扭曲“剂量”的含义。
此外,在R中进行多项式模型的正确方法是使用poly函数,而不是形成二次项。如果您坚持使用“原始”二次项,那么使用poly会更容易,但正如Ben建议的那样,应该使用i函数。
library(faraday)
m=2
mod = glm(colonies ~ I(dose^m), data = salmonella, family = "poisson")然而,更好的方法是:
m=2; mod = glm(colonies ~ poly(dose, m), data = salmonella, family = "poisson")这将给出线性项和二次项,但二次项将被做为正交多项式,然后让你做出适当的推断。
https://stackoverflow.com/questions/55010732
复制相似问题