Что вызывает эту ошибку?Коэффициенты не определены из-за особенностей - PullRequest
0 голосов
/ 31 декабря 2018

Я пытаюсь найти модель для своих данных, но я получаю сообщение "Коэффициенты: (3 не определены из-за особенностей)". Это происходит для зимы, большого и высокого_ потока

Я нашел это: https://stats.stackexchange.com/questions/13465/how-to-deal-with-an-error-such-as-coefficients-14-not-defined-because-of-singu

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

когда я использую функцию alias (), я получаю:

Model :
S ~ A + B + C + D + E + F + G + spring + summer + autumn + winter + small + medium + large + low_flow + med_flow + high_flow

Complete :
          (Intercept) A  B  C  D  E  F  G  spring summer autumn small medium
winter     1           0  0  0  0  0  0  0 -1     -1     -1      0     0    
large      1           0  0  0  0  0  0  0  0      0      0     -1    -1    
high_flow  1           0  0  0  0  0  0  0  0      0      0      0     0    
          low_flow med_flow
winter     0        0      
large      0        0      
high_flow -1       -1      

столбцы AH моих данных содержат числовые значения, остальные столбцы принимают 0 или 1, и я проверил, нет ли конфликтующих значений (т. Е. Если весна = 1 для случая, осень = лето = зима = 0)

model_1 <- lm(S ~ A+B+C+D+E+F+G+spring+summer+autumn+winter+small+medium+large+low_flow+med_flow+high_flow, data = trainOne)
summary(model_1)

Может кто-нибудь объяснить ошибку, пожалуйста?

РЕДАКТИРОВАТЬ: пример моих данных, прежде чем я изменил их на двоичный

season  size   flow  A  B   C   D   E   F   G  S
spring small  medium 52 72 134  48 114 114 142 11
autumn small  medium 43 21  98 165 108  23  60 31
spring medium medium 41 45 161  86 177 145  32 12
autumn large  medium 40 86 132  80  82 138 186 16
winter medium  high  49 32 147 189 125  43 144 67
summer large   high  43  9 158  64  14 146  15 71

Ответы [ 3 ]

0 голосов
/ 31 декабря 2018

Некоторые из ваших переменных могут быть совершенно коллинеарны.Посмотрите на переменные и как они соотносятся друг с другом.Вы можете начать проверку данных с cor(dataset), это вернет матрицу корреляции вашего dataset.

0 голосов
/ 31 декабря 2018

@ JuliusVainora уже дала вам хорошее объяснение того, как происходит ошибка, которую я не буду повторять.Однако ответ Юлиуса - это всего лишь один метод, и он может быть неудовлетворительным, если вы не понимаете, что действительно есть значение для случаев, где зима = 1, большая = 1 и высокая_поток = 1.Это можно легко увидеть на дисплее как значение для «(Перехват)».Вы можете сделать результат более понятным, добавив +0 к своей формуле.(Или нет, в зависимости от ситуации с данными.)

Тем не менее, я думаю, что вы действительно должны пересмотреть, как выполняется кодирование категориальных переменных.Вы используете метод одной фиктивной переменной на уровень, который вы копируете из какой-то другой системы, возможно, SAS или SPSS?Это в будущем может вызвать проблемы для вас, а также является болезненным методом для написания кода и поддержки.Функция data.frame в R уже автоматически создает factor, которые кодируют несколько уровней в одной переменной.(Читайте ?factor.) Таким образом, ваша формула станет:

 S ~ A + B + C + D + E + F + G + season + size + flow
0 голосов
/ 31 декабря 2018

Проблема идеальной коллинеарности.А именно,

spring + summer + autumn + winter == 1
small + medium + large == 1
low_flow + med_flow + high_flow == 1
Constant term == 1

Под этим я подразумеваю, что эти идентичности имеют место для каждого наблюдения в отдельности.(Например, только один из сезонов равен одному.)

Так, например, lm не может различить перехват и сумму эффектов всех сезонов.Возможно, это или это поможет лучше понять идею.С технической точки зрения, оценки OLS включают определенную матрицу, которая не является обратимой в этом случае.

Чтобы исправить это, вы можете запустить, например,

model_1 <- lm(S ~ A + B + C + D + E + F + G + spring + summer + autumn + small + medium + low_flow + med_flow, data = trainOne)

Также см. этот вопрос.

...