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

因变量取值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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 09:06:20