我找到了Error in contrasts when defining a linear model in 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
问题是什么?
答案 0 :(得分:0)
错误几乎描述了这个问题。有问题的错误数据位于第9列(Utilities
)。
相关专栏的变化太小。
table(train$Utilities)
AllPub NoSeWa 1459 1
log_SalePrice <- train$log_SalePrice
train[,9] <- NULL
simplelm <- lm(log_SalePrice ~ ., data = train)
答案 1 :(得分:0)
感谢您提供数据集(我希望该链接永远有效,以便所有人都可以访问)。我将其读入数据框train
。
使用How to debug "contrasts can be applied only to factors with 2 or more levels" error?提供的debug_contr_error
,debug_contr_error2
和NA_preproc
辅助功能,我们可以轻松地分析问题。
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
引起的,我们无法采取任何措施(除非您有统计上有效的方法来估算那些缺失的值)。
由于您只有一个单级因子变量,因此与How to do a GLM when "contrasts can be applied only to factors with 2 or more levels"?中给出的方法相同。
new_dat$Utilities <- 1
simplelm <- lm(log_SalePrice ~ 0 + ., data = new_dat)
模型现在成功运行。但是,它是rank-deficient。您可能想采取一些措施来解决该问题,但是可以将其保留为好。
b <- coef(simplelm)
length(b)
#[1] 301
sum(is.na(b))
#[1] 9
simplelm$rank
#[1] 292