【问题标题】:Error in terms.formula(formula, data = data) : invalid power in formulaterms.formula(formula, data = data) 中的错误:公式中的无效功率
【发布时间】:2019-03-05 20:07:36
【问题描述】:

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

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 时,它起作用了。

【问题讨论】:

  • CRAN 图书馆里有沙门氏菌吗?而且这是将因子转换为数字的错误方法。
  • m 来自哪里?是在数据中还是在外部。您是否正在尝试实际执行数学运算?因为公式中的^ 通常用于交互,而不是数学。你确定你真的想用你的剂量做as.numeric(as.factor())吗?这看起来很奇怪。

标签: r


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    如果这是来自 package:'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")
    

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

    【讨论】:

      猜你喜欢
      • 2019-07-06
      • 2021-07-05
      • 1970-01-01
      • 1970-01-01
      • 2020-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多