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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 03:20:24