首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >terms.formula( formula,data = data)出错:公式中的幂无效

terms.formula( formula,data = data)出错:公式中的幂无效
EN

Stack Overflow用户
提问于 2019-03-06 04:07:36
回答 2查看 2.1K关注 0票数 1

我正在尝试对剂量预测器进行改造,这是我的代码:

代码语言:javascript
复制
mod = glm(colonies ~ (as.numeric(as.factor(dose)))^(m), data = salmonella, family = "poisson")

其中"m“是我使用的能量。但是,我得到了一个错误

代码语言:javascript
复制
> 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)。但是如果代码是

代码语言:javascript
复制
mod = glm(colonies ~ (as.factor(dose))^(m), data = salmonella, family = "poisson")

错误仍然存在。这很奇怪,因为当我把m改成2的时候,它是有效的。

EN

回答 2

Stack Overflow用户

发布于 2019-03-06 04:22:29

tl;dr我最好的猜测是,你应该使用I(...^m)来保护^/have R,把它当作一个数值求幂运算符。

我在faraway包中找到了salmonella,可以确认您的错误。事实上,它坚持通过各种简化。

代码语言:javascript
复制
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应该将^视为数值运算符,而不是公式中的交互运算符,这是您想要的:

代码语言:javascript
复制
ss <- transform(salmonella, numdose=as.numeric(as.factor(dose)))
mod = glm(colonies ~ I(numdose^m), data = ss, family = "poisson")

OTOH图片显示这并不是完全疯狂的(尽管也是不必要的):

代码语言:javascript
复制
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")

票数 2
EN

Stack Overflow用户

发布于 2019-03-06 06:39:22

如果这是来自package:‘salmonella’的剂量数据集,那么就不能对剂量值使用as.factor或as.numeric,因为它已经是数字了。

换算成因子会严重扭曲“剂量”的含义。

此外,在R中进行多项式模型的正确方法是使用poly函数,而不是形成二次项。如果您坚持使用“原始”二次项,那么使用poly会更容易,但正如Ben建议的那样,应该使用i函数。

代码语言:javascript
复制
library(faraday)
m=2
mod = glm(colonies ~ I(dose^m), data = salmonella, family = "poisson")

然而,更好的方法是:

代码语言:javascript
复制
 m=2; mod = glm(colonies ~ poly(dose, m), data = salmonella, family = "poisson")

这将给出线性项和二次项,但二次项将被做为正交多项式,然后让你做出适当的推断。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55010732

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档