为何出现‘Replacement has 2287 rows, data has 2490’报错?
问题原因及解决办法
报错原因
你遇到的行数不匹配问题,核心原因是线性回归模型lm()会自动剔除包含缺失值(NA)的观测:
- 你的
df.Part3原始有2490行,但其中部分行存在缺失值(比如SALE_PRICE、YEAR_BUILT等变量里有NA),lm()运行时会自动删掉这些行,最终参与回归的只有2287行,所以z$residuals的长度是2287。 - 当你试图把2287行的残差赋值给有2490行的
df.Part3时,行数不匹配就触发了报错。
解决办法
方法1:提前删除缺失值
先把df.Part3里的缺失值行删掉,再做回归,这样残差行数就和数据框行数一致了:
df.Part3 <- df %>% filter(NEIGHBORHOOD_NAME=="BRONXDALE",YEAR>2008,SALE_PRICE>0)%>% 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) %>% drop_na() # 新增:删除所有含NA的行 z <- lm(formula=SALE_PRICE~.,data=df.Part3) summary(z) df.Part3["residuals"] <- z$residuals
方法2:用broom包的augment函数(保留所有行)
如果不想删除原始行,想保留所有观测(缺失值对应的残差设为NA),可以用broom包的augment()函数,它会直接把残差等回归结果合并到原数据框:
library(broom) df.Part3 <- df %>% filter(NEIGHBORHOOD_NAME=="BRONXDALE",YEAR>2008,SALE_PRICE>0)%>% 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) z <- lm(formula=SALE_PRICE~.,data=df.Part3) summary(z) df.Part3 <- augment(z, data = df.Part3) # 此时df.Part3会新增.resid列,就是残差,所有原始行都保留,缺失值对应的.resid为NA
内容的提问来源于stack exchange,提问作者Thanos of Siberia
相关产品推荐
相关产品推荐

