SUR系统中跨方程约束系数相等的实现方法问询
问题
我需要在**看似不相关回归(SUR)**系统中,针对不同年龄段估计劳动力参与率,回归变量包含部分年龄段专属变量和共享出生队列虚拟变量,这是典型的队列分析方法(参考Grigoli等人2018年研究)。
我已用linearmodels库实现SUR系统估计,但不知道怎么设置约束,强制出生队列虚拟变量的系数在所有出现该变量的方程中保持相等。想确认当前现有库是否支持该操作?
为方便复现,改用常用数据集举例:我希望linearmodels文档示例的两个方程里,male系数的估计值保持一致:
import numpy as np import pandas as pd from linearmodels.datasets import fringe from collections import OrderedDict from linearmodels.system import SUR data = fringe.load() formula = OrderedDict() formula["benefits"] = "hrbens ~ nrthcen + male" formula["earnings"] = "hrearn ~ married + male" mod = SUR.from_formula(formula, data) print(mod.fit(cov_type="unadjusted"))
我尝试了以下代码,但未成功:
constraints_matrix=pd.DataFrame([0,0,0,1]).transpose() constraints_values=pd.Series(['benefits_male']) mod.add_constraints(constraints_matrix,constraints_values)
解决方案
linearmodels支持SUR的跨方程系数约束,你之前的写法有误,正确的约束设置需要明确指定系数之间的等式关系,具体步骤如下:
方法1:使用字符串格式的约束(推荐)
直接用字符串描述约束条件,格式为"方程名_变量名 = 另一方程名_变量名",代码示例:
import numpy as np import pandas as pd from linearmodels.datasets import fringe from collections import OrderedDict from linearmodels.system import SUR data = fringe.load() formula = OrderedDict() formula["benefits"] = "hrbens ~ nrthcen + male" formula["earnings"] = "hrearn ~ married + male" mod = SUR.from_formula(formula, data) # 添加约束:benefits方程的male系数 = earnings方程的male系数 mod.add_constraints("benefits_male = earnings_male") # 拟合带约束的模型 results = mod.fit(cov_type="unadjusted") print(results)
方法2:使用矩阵格式的约束
如果需要更复杂的约束,可以用矩阵形式。首先要明确所有系数的顺序,你可以通过mod.params查看系数名称列表:
print(mod.params.index) # 输出会是类似:Index(['benefits_intercept', 'benefits_nrthcen', 'benefits_male', 'earnings_intercept', 'earnings_married', 'earnings_male'], dtype='object')
针对benefits_male = earnings_male的约束,对应的约束矩阵是一个行向量,在benefits_male位置为1,earnings_male位置为-1,其余为0;约束值为0:
constraint_matrix = pd.DataFrame([[0, 0, 1, 0, 0, -1]]) constraint_values = pd.Series([0]) mod.add_constraints(constraint_matrix, constraint_values) results = mod.fit(cov_type="unadjusted") print(results)
这样就能强制两个方程中的male系数相等,同理可推广到你的出生队列虚拟变量,只需要给每个队列虚拟变量添加对应的跨方程相等约束即可。
内容的提问来源于stack exchange,提问作者datatrainR
相关产品推荐
相关产品推荐

