如何用自定义Bootstrap估计值更新linearmodels的PanelResults对象?
解决方案
方法1:直接修改已有PanelResults实例的属性
Python是动态类型语言,你可以直接修改PanelResults实例中的标准误、t值、p值等属性,无需重新构造对象,这是最直接高效的方案:
- 先拟合原始PooledOLS模型,得到完整的
PanelResults对象 - 将自定义Bootstrap得到的结果替换掉实例中对应的属性
- 返回修改后的实例,直接复用linearmodels的回归对比、LaTeX输出功能
修改后的完整代码:
import pandas as pd from linearmodels.panel import PooledOLS from linearmodels.panel.results import PanelResults class EstimationProcedure: def __init__(self, data, formula): self.data = data self.formula = formula # 补充模型公式,原代码遗漏了这部分 def bootstrap(self, original_results): # 这里替换为你的Bootstrap实现逻辑 # 示例:基于原始估计参数生成模拟统计量 params = original_results.params std_errors = params * 0.1 # 自定义标准误示例值 tstats = params / std_errors pvalues = pd.Series([0.05]*len(params), index=params.index) return std_errors, tstats, pvalues def fit(self): # 第一步:拟合原始PooledOLS模型,获取完整的PanelResults实例 model = PooledOLS.from_formula(self.formula, data=self.data) original_results = model.fit() # 第二步:用原始估计结果执行Bootstrap,得到自定义统计量 std_errors, tstats, pvalues = self.bootstrap(original_results) # 第三步:替换原始结果中的目标属性 original_results._std_errors = std_errors original_results._tstats = tstats original_results._pvalues = pvalues # 可选:手动更新置信区间(确保summary输出正确) original_results._conf_int = original_results.conf_int() return original_results # 示例使用 df = pd.DataFrame({ 'y': [1,2,3,4,5], 'x': [2,3,4,5,6], 'entity': ['a','a','b','b','c'], 'time': [1,2,1,2,1] }) df = df.set_index(['entity', 'time']) estimator = EstimationProcedure(df, 'y ~ x + EntityEffects') custom_results = estimator.fit() # 验证:输出带自定义标准误的回归结果 print(custom_results.summary()) # 导出LaTeX格式结果 print(custom_results.summary().as_latex())
方法2:继承PanelResults扩展(可选)
如果需要长期维护自定义逻辑,可以继承PanelResults类,通过复制原始实例属性+替换自定义统计量的方式实现,适合需要更多定制化的场景:
class CustomPanelResults(PanelResults): def __init__(self, original_results, std_errors, tstats, pvalues): # 复制原始结果的所有属性 self.__dict__.update(original_results.__dict__) # 替换自定义统计量 self._std_errors = std_errors self._tstats = tstats self._pvalues = pvalues # 重新计算依赖属性 self._conf_int = self.conf_int() # 在EstimationProcedure的fit方法中使用 def fit(self): model = PooledOLS.from_formula(self.formula, data=self.data) original_results = model.fit() std_errors, tstats, pvalues = self.bootstrap(original_results) return CustomPanelResults(original_results, std_errors, tstats, pvalues)
关键注意事项
PanelResults的内部属性多为私有命名(下划线开头),虽然Python允许修改,但要注意linearmodels版本兼容性——若后续包更新了内部属性命名,可能需要调整代码- 替换属性后,需确保依赖这些属性的方法(如
summary()、conf_int())能正常工作,必要时手动更新衍生属性 - Bootstrap过程必须基于原始模型的估计结果(如参数、残差),务必将
original_results传入bootstrap方法,而非仅传入原始数据
内容的提问来源于stack exchange,提问作者Jhonny
相关产品推荐
相关产品推荐

