Спасибо за предоставление вашего набора данных (я надеюсь, что ссылка всегда будет действительной, чтобы каждый мог получить к ней доступ).Я прочитал его во фрейм данных 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