R语言lm()函数报错:contrasts仅适用于2个及以上水平的因子
问题解决方法
错误根源
你遇到的报错是因为数据框里的TYPE列经过filter(TYPE=="RESIDENTIAL")处理后,所有观测值都是唯一的"RESIDENTIAL"。当lm()函数运行时,会自动把字符型的TYPE转成因子,但这个因子只有1个水平——回归模型无法对没有变异的分类变量计算对比项,所以触发了这个错误。
具体解决方案
有两种处理方式,根据你的作业需求选择:
移除TYPE列(推荐,因为它对模型无解释力)
既然所有数据都是住宅类型,这个变量完全没有区分度,没必要留在模型里。可以二选一操作:- 修改数据框创建代码,在
select里去掉TYPE:df.Part3 <- df %>% filter(NEIGHBORHOOD_NAME=="BRONXDALE",YEAR>2008,SALE_PRICE>0,TYPE=="RESIDENTIAL") %>% mutate(TOTAL_UNITS=RESIDENTIAL_UNITS+COMMERCIAL_UNITS) %>% mutate(SALE_YEAR=year(SALE_DATE)) %>% ungroup() %>% select(SALE_PRICE,SALE_YEAR,YEAR_BUILT,GROSS_SQUARE_FEET,TOTAL_UNITS) # 去掉TYPE - 或者直接在回归公式里排除TYPE:
z <- lm(formula=SALE_PRICE~.-TYPE, data=df.Part3)
- 修改数据框创建代码,在
保留TYPE并调整数据(如果作业需要分析TYPE的影响)
如果你原本想对比不同TYPE的影响,那是filter条件太严格了——把TYPE=="RESIDENTIAL"删掉,保留至少两种不同的TYPE值,然后把TYPE转成因子再跑回归:df.Part3 <- df %>% filter(NEIGHBORHOOD_NAME=="BRONXDALE",YEAR>2008,SALE_PRICE>0) %>% # 去掉TYPE的过滤 mutate(TOTAL_UNITS=RESIDENTIAL_UNITS+COMMERCIAL_UNITS) %>% mutate(SALE_YEAR=year(SALE_DATE)) %>% mutate(TYPE=factor(TYPE)) %>% # 转成因子 ungroup() %>% select(SALE_PRICE,SALE_YEAR,YEAR_BUILT,GROSS_SQUARE_FEET,TOTAL_UNITS,TYPE) z <- lm(formula=SALE_PRICE~., data=df.Part3)
内容的提问来源于stack exchange,提问作者Thanos of Siberia
相关产品推荐
相关产品推荐

