我正在尝试对剂量预测值进行转换,这是我的代码:
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时,它可以工作。
答案 0 :(得分:1)
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)然后使用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")
答案 1 :(得分:0)
如果这是来自“ faraway”软件包的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")
这将为您提供线性和二次项,但二次项将作为正交多项式完成,然后您可以进行适当的推论。