Ошибка в term.formula (формула, данные = данные): неверная мощность в формуле - PullRequest
1 голос
/ 05 марта 2019

Я пытаюсь выполнить преобразование предиктора дозы, вот мой код:

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

Кто-нибудь знает почему?

Извините за непонятность.Здесь мой м -0,18182 от более раннего расчета.Теперь я понимаю, что не должен использовать as.numeric (as.factor).Но если код

mod = glm(colonies ~ (as.factor(dose))^(m), data = salmonella, family = "poisson")

Ошибка все еще здесь.Это странно, потому что когда я меняю m на 2, это работает.

Ответы [ 2 ]

1 голос
/ 05 марта 2019

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

0 голосов
/ 06 марта 2019

Если это набор данных salmonella из пакета: 'faraway', то вы не используете ни as.factor, ни as.numeric для значения дозы, поскольку оно уже числовое.

преобразование в фактор серьезно искажает значение "дозы"

Кроме того, правильным способом создания полиномиальных моделей в R является использование функции poly вместо формирования квадратичных членов. Если вы настаиваете на использовании «сырых» квадратичных терминов, то это будет проще сделать с поли, но, как предположил Бен, это должно быть с функцией 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")

Что даст вам как линейные, так и квадратичные члены, но квадратный член будет выполнен как ортогональный многочлен, который затем позволит вам сделать правильные выводы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...