Слишком много упорядоченных уровней факторов для lm () - PullRequest
0 голосов
/ 18 октября 2019

У меня есть фрейм данных с переменной year, охватывающей более 100 лет. Первоначально переменная была целым числом, но я подумал, что было бы неплохо преобразовать ее в упорядоченный коэффициент.

> myDf <- data.frame(year = factor(1900:1995, levels = 1900:1995, ordered = TRUE),
                   z = rnorm(96))

Однако, когда я пытаюсь обучить модель, выдается ошибка.

> myFit <- lm(z ~ year, data = myDf)

Error in ctrfn(levels(x), contrasts = contrasts) : 
orthogonal polynomials cannot be represented accurately enough for 95 degrees of freedom

После поиска все, что я мог найти, было следующее из исходного кода contr.poly.

if (n > 95) 
  stop(gettextf("orthogonal polynomials cannot be represented accurately enough for %d degrees of freedom", 
                n - 1), domain = NA)

Итак, я попробовал следующее:

> myDf2 <- data.frame(year = factor(1900:1994, levels = 1900:1994, ordered = TRUE),
                    z = rnorm(95))
> myFit2 <- lm(z ~ year, data = myDf2)

Ошибка не возвращается.

Делает ли факт, что фактор упорядочен, делаетразница?

> myDf3 <- data.frame(year = factor(1900:1995, levels = 1900:1995, ordered = FALSE),
                    z = rnorm(96))
> myFit3 <- lm(z ~ year, data = myDf3)

Ошибок нет. Очевидно, именно порядок и вызывает эту ошибку.

Я не понимаю значения отсечки при 95 степенях свободы или как contr.poly связано с lm. Или есть связь вообще? Почему порядок имеет значение?

Кроме того, имеет ли порядок фактор столько же уровней, сколько я сделал неразумно? Мой мыслительный процесс состоял в том, что я должен преобразовать year из целого числа в упорядоченный коэффициент, потому что год не «масштабируется» так же, как другие переменные в моем наборе данных, то есть расстояние. Шкала, возможно, не является правильным термином, но я просто имею в виду, что переменная года имеет ограничения в наборе данных, тогда как расстояние не имеет.

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