R: Ошибка в контрастах при подгонке линейных моделей с помощью `lm` - PullRequest
0 голосов
/ 19 мая 2018

Я обнаружил Ошибка в контрастах при определении линейной модели в R и следовал предложенным там рекомендациям, но ни одна из моих факторных переменных не принимает только одно значение, и я все еще испытываю ту же проблему.

Это набор данных, который я использую: https://www.dropbox.com/s/em7xphbeaxykgla/train.csv?dl=0.

Это код, который я пытаюсь запустить:

simplelm <- lm(log_SalePrice ~ ., data = train)

#Error in `contrasts<-`(`*tmp*`, value = contr.funs[1 + isOF[nn]]) :
# contrasts can be applied only to factors with 2 or more levels

В чем проблема?

Ответы [ 2 ]

0 голосов
/ 28 июля 2018

Спасибо за предоставление вашего набора данных (я надеюсь, что ссылка всегда будет действительной, чтобы каждый мог получить к ней доступ).Я прочитал его во фрейм данных train.

Используя вспомогательные функции debug_contr_error, debug_contr_error2 и NA_preproc, предоставляемые Как отладить "контрасты могут применяться только к факторам с 2или больше уровней "ошибка? , мы можем легко проанализировать проблему.

info <- debug_contr_error2(log_SalePrice ~ ., train)

## the data frame that is actually used by `lm`
dat <- info$mf

## number of cases in your dataset
nrow(train)
#[1] 1460

## number of complete cases used by `lm`
nrow(dat)
#[1] 1112

## number of levels for all factor variables in `dat`
info$nlevels
#     MSZoning        Street         Alley      LotShape   LandContour 
#            4             2             3             4             4 
#    Utilities     LotConfig     LandSlope  Neighborhood    Condition1 
#            1             5             3            25             9 
#   Condition2      BldgType    HouseStyle     RoofStyle      RoofMatl 
#            6             5             8             5             7 
#  Exterior1st   Exterior2nd    MasVnrType     ExterQual     ExterCond 
#           14            16             4             4             4 
#   Foundation      BsmtQual      BsmtCond  BsmtExposure  BsmtFinType1 
#            6             5             5             5             7 
# BsmtFinType2       Heating     HeatingQC    CentralAir    Electrical 
#            7             5             5             2             5 
#  KitchenQual    Functional   FireplaceQu    GarageType  GarageFinish 
#            4             6             6             6             3 
#   GarageQual    GarageCond    PavedDrive        PoolQC         Fence 
#            5             5             3             4             5 
#  MiscFeature      SaleType SaleCondition  MiscVal_bool      MoYrSold 
#            4             9             6             2            55 

Как видите, Utilities является ошибочной переменной здесь, поскольку имеет только 1 уровень.

Поскольку в train имеется много символьных / факторных переменных, мне интересно, есть ли у них NA для них.Если мы добавим NA в качестве допустимого уровня, мы можем получить более полные случаи.

new_train <- NA_preproc(train)

new_info <- debug_contr_error2(log_SalePrice ~ ., new_train)

new_dat <- new_info$mf

nrow(new_dat)
#[1] 1121

new_info$nlevels
#     MSZoning        Street         Alley      LotShape   LandContour 
#            5             2             3             4             4 
#    Utilities     LotConfig     LandSlope  Neighborhood    Condition1 
#            1             5             3            25             9 
#   Condition2      BldgType    HouseStyle     RoofStyle      RoofMatl 
#            6             5             8             5             7 
#  Exterior1st   Exterior2nd    MasVnrType     ExterQual     ExterCond 
#           14            16             4             4             4 
#   Foundation      BsmtQual      BsmtCond  BsmtExposure  BsmtFinType1 
#            6             5             5             5             7 
# BsmtFinType2       Heating     HeatingQC    CentralAir    Electrical 
#            7             5             5             2             6 
#  KitchenQual    Functional   FireplaceQu    GarageType  GarageFinish 
#            4             6             6             6             3 
#   GarageQual    GarageCond    PavedDrive        PoolQC         Fence 
#            5             5             3             4             5 
#  MiscFeature      SaleType SaleCondition  MiscVal_bool      MoYrSold 
#            4             9             6             2            55

Мы получим более полные случаи, но у Utilities все еще есть один уровень.Это означает, что большинство неполных случаев на самом деле вызвано NA в ваших числовых переменных, что мы ничего не можем сделать (если у вас нет статистически достоверного способа вменения этих пропущенных значений).

Поскольку у вас есть только один единственныйфактор-переменная уровня, тот же метод, который приведен в Как сделать GLM, когда «контрасты могут применяться только к факторам с 2 или более уровнями»? будет работать.

new_dat$Utilities <- 1

simplelm <- lm(log_SalePrice ~ 0 + ., data = new_dat)

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

b <- coef(simplelm)

length(b)
#[1] 301

sum(is.na(b))
#[1] 9

simplelm$rank
#[1] 292
0 голосов
/ 19 мая 2018

Ошибка в значительной степени описывает проблему.Неверные данные в вашем 9-м столбце (Utilities).

В рассматриваемом столбце слишком мало вариаций.

table(train$Utilities)
AllPub NoSeWa 
  1459      1
log_SalePrice <- train$log_SalePrice

train[,9] <- NULL
simplelm  <- lm(log_SalePrice ~ ., data = train)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...