因变量取值0-1区间的固定效应模型拟合值越界修正方法
你当前使用的feols是线性OLS类固定效应模型,属于线性概率模型范畴,模型本身不对响应变量的取值范围做任何约束,当响应变量是取值在[0,1]的概率类指标时,拟合值超出合理区间是这类模型的固有缺陷,不是代码运行错误。
方案1:改用固定效应Logit模型(最推荐,模型层面天然约束取值范围)
你用的fixest包原生支持高维固定效应广义线性模型,直接换用feglm函数搭配二项分布Logit连接函数即可,模型输出的响应类预测值会天然落在0-1区间,不需要额外处理。
参考代码如下:
library(fixest) # 注意:如果default_rate是单账户层面的0/1二元违约标识,直接运行即可 # 如果是分组汇总得到的违约率(违约数/组内总户数),需要额外传入对应组的样本量权重参数weights mod_logit <- feglm( default_rate ~ 1 | account_id + age^r12_gdp_bl, # 原模型把account_id放在协变量位置是错误的,个体固定效应要放在|后面 family = binomial(link = "logit"), data = data ) # 提取0-1区间的拟合值 fitted_vals <- predict(mod_logit, type = "response")
这个方案完全适配你当前的工作流,计算速度快,支持和原模型完全一致的聚类标准误、固定效应设定,预测值从模型原理上就不会超出[0,1]范围。
方案2:事后截断拟合值(权宜方案,仅适合快速探索场景)
如果你必须保留线性模型的系数可解释性(比如需要直接读取边际效应,不想额外计算Logit的边际效应),可以直接对线性模型输出的拟合值做边界截断,把小于0的值设为0,大于1的值设为1:
fitted_vals_trim <- pmax(0, pmin(1, mod_bl$fitted.values))
注意这个方案没有修正模型设定偏差,只是强行把越界值压到边界,不适合用于正式的统计推断或精度要求高的预测场景。
方案3:其他可选模型
如果你的样本中违约率存在大量0值(从你给出的描述性统计看最小值为0,存在不少零值观测),也可以考虑固定效应Tobit模型、零膨胀Beta模型,但这类模型对高维固定效应的支持远不如feglm成熟,计算速度慢,参数调优成本高,非必要不优先选择。
你原模型的设定存在一处错误:你将account_id写在了公式的协变量部分(竖线前),这相当于把账户ID作为普通连续变量估计线性系数,既浪费大量自由度,也没有真正控制账户层面的个体固定效应。如果你的研究设计需要控制个体固定效应,要把account_id放到竖线后的固定效应位置,和你原本设定的age^r12_gdp_bl交互固定效应并列。
内容的提问来源于stack exchange,提问作者Saïd Maanan

