公式中的错误。(公式,数据=数据):公式中的无效功效

时间:2019-03-05 20:07:36

标签: r

我正在尝试对剂量预测值进行转换,这是我的代码:

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时,它可以工作。

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)
  • 使用该剂量的幂作为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")

enter image description here

答案 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")

这将为您提供线性和二次项,但二次项将作为正交多项式完成,然后您可以进行适当的推论。