无需重估模型,如何基于fixest对样本外固定效应做加权预测?
用fixest对样本外固定效应水平的观测值做预测(加权均值替代)
解决方案思路
要实现无需重新拟合模型、用训练数据中固定效应的加权均值(按观测数加权)替代样本外FE水平的预测,核心逻辑是:
- 从训练好的fixest模型中提取固定效应估计值及对应观测数
- 计算加权平均FE
- 将样本外观测的预测值替换为「线性预测部分 + 加权平均FE」
具体实现代码
1. 基础实现
library(tidyverse) library(fixest) # 拟合FE模型 data(trade) mod <- feols(log(Euros) ~ log(dist_km) | Product, trade) # 定义包含样本外FE的新数据 df <- tribble( ~dist_km, ~Product, 140, 20, # 样本内Product 140, 21 # 样本外Product ) # 提取固定效应及每个FE水平的观测数 fe_product <- get_fe(mod) # 计算加权平均固定效应(权重为观测数) weighted_mean_fe <- weighted.mean(fe_product$fe, w = fe_product$nobs) # 获取不含FE的线性预测值(仅Xβ部分) lin_pred <- predict(mod, newdata = df, type = "linear.predictor") # 生成最终预测:样本内用原结果,样本外替换为线性预测+加权平均FE final_pred <- case_when( !is.na(predict(mod, newdata = df)) ~ predict(mod, newdata = df), TRUE ~ lin_pred + weighted_mean_fe ) final_pred #> [1] 20.14376 18.88489
2. 封装为函数(方便复用)
predict_fe_fill <- function(mod, newdata) { # 提取固定效应及观测数 fe_vals <- get_fe(mod) # 计算加权平均FE weighted_mean_fe <- weighted.mean(fe_vals$fe, w = fe_vals$nobs) # 获取原预测和线性预测 pred_orig <- predict(mod, newdata = newdata) lin_pred <- predict(mod, newdata = newdata, type = "linear.predictor") # 替换NA值 ifelse(is.na(pred_orig), lin_pred + weighted_mean_fe, pred_orig) } # 调用函数 predict_fe_fill(mod, df) #> [1] 20.14376 18.88489
原理说明
- fixest的
predict()默认对未知FE水平返回NA,因为无法匹配训练数据中的FE估计值 type = "linear.predictor"返回的是仅由自变量计算的线性部分(即回归系数乘以自变量值),不包含固定效应- 加权平均FE是训练数据中所有Product固定效应的加权平均(按每个Product的观测数加权),用它替代样本外FE,等价于无FE模型的预测逻辑,但无需重新拟合模型
内容的提问来源于stack exchange,提问作者dufei
相关产品推荐
相关产品推荐

