You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言lm()函数报错:contrasts仅适用于2个及以上水平的因子

问题解决方法

错误根源

你遇到的报错是因为数据框里的TYPE列经过filter(TYPE=="RESIDENTIAL")处理后,所有观测值都是唯一的"RESIDENTIAL"。当lm()函数运行时,会自动把字符型的TYPE转成因子,但这个因子只有1个水平——回归模型无法对没有变异的分类变量计算对比项,所以触发了这个错误。

具体解决方案

有两种处理方式,根据你的作业需求选择:

  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)
      
  2. 保留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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 23:01:04