R:使用`lm`

时间:2018-05-19 00:20:42

标签: r regression linear-regression lm

我找到了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

问题是什么?

2 个答案:

答案 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_errordebug_contr_error2NA_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