繁体   English   中英

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

[英]Error in terms.formula(formula, data = data) : invalid power in formula

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

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

tl; dr我最好的猜测是,您应该使用I(...^m)来保护^ /让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)
  • 在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")

在此处输入图片说明

如果这是来自程序包“ 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")

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM