带权重的回归:标准化残数量少于观测值问题咨询
解决带权重的Mincer工资方程回归中残差维度不匹配的问题
我来帮你拆解这个问题——在使用带权重的lm()时遇到残差数量和原观测数不匹配,大概率是权重变量的问题,加上模型设定里的一个小细节需要注意,下面一步步解决:
核心原因:权重为0的观测被自动剔除
lm()函数在处理weights参数时,会自动过滤掉权重为0的观测值,这就导致拟合后的模型实际使用的样本量比原始数据集少,如果你直接用原始数据的维度去匹配模型输出的残差/拟合值,自然会出现维度不匹配的报错。
排查与解决步骤
1. 先确认权重变量的情况
先检查你的phrf里是否存在0值,运行下面的代码:
# 查看权重为0的观测数量 table(phrf == 0) # 查看权重的整体分布 summary(phrf)
如果结果显示有不少0权重的观测,那就要先确认这些0值是数据录入错误,还是抽样设计里的合理情况(比如某些样本被设定为无代表性而赋予0权重)。如果是错误,先修正数据;如果是合理设计,那模型剔除这些观测是正确的。
2. 正确提取模型的残差与拟合值
不要用原始数据集的变量去和rstandard(model)配对,应该直接从模型对象中提取对应的数据:
# 先拟合修正后的模型 mincer_model <- lm(log(earnings) ~ Gender + Age + I(Age^2) + Education, weights = phrf) # 提取模型使用的拟合值和标准化残差 fitted_vals <- fitted(mincer_model) std_resids <- rstandard(mincer_model) # 现在绘制图,维度肯定匹配 plot(fitted_vals, std_resids, xlab = "拟合值", ylab = "标准化残差")
或者更简单的,直接用lm()自带的绘图功能,它会自动匹配正确的维度:
# 绘制第1个残差拟合图(默认就是拟合值vs残差) plot(mincer_model, which = 1)
3. 修正模型设定的小细节
这里要提醒你:在lm()公式里,Age^2的写法是错误的!因为lm()中的^符号代表的是交互项+主效应,不是数学上的平方。正确的平方项写法应该用I(Age^2),它会强制R把Age^2当作数学运算来处理,否则你的模型里其实等于没加平方项,这会导致你的Mincer方程设定错误!
总结
- 权重导致的维度不匹配:是因为0权重观测被剔除,要从模型对象中提取对应的数据来绘图;
- 模型设定:务必把
Age^2改成I(Age^2),否则平方项没真正加入模型。
内容的提问来源于stack exchange,提问作者Brandon_33




