如何基于家庭分工模型展示α参数变化对H_F/H_M的影响?
问题描述
我有一个项目,需要展示调整某一参数时两个变量间的关系变化。具体是用包含男女成员的家庭经济模型,二者通过选择以下时间分配最大化效用:
- 市场工作时长$L_M$和$L_F$,对应工资$W_M$和$W_F$
- 家务工作时长$H_M$和$H_F$
需要展示当$\alpha$参数取[0.25, 0.50, 0.75]不同值时,$H_F/H_M$的变化情况。
现有代码
1. HouseholdSpecializationModel.py 文件中的模型类
from types import SimpleNamespace import numpy as np from scipy import optimize import pandas as pd import matplotlib.pyplot as plt class HouseholdSpecializationModelClass: def __init__(self): """ setup model """ # a. create namespaces par = self.par = SimpleNamespace() sol = self.sol = SimpleNamespace() # b. preferences par.rho = 2.0 par.nu = 0.001 par.epsilon = 1.0 par.omega = 0.5 # c. household production par.alpha = 0.5 par.sigma = 1.0 # d. wages par.wM = 1.0 par.wF = 1.0 par.wF_vec = np.linspace(0.8,1.2,5) # e. targets par.beta0_target = 0.4 par.beta1_target = -0.1 # f. solution sol.LM_vec = np.zeros(par.wF_vec.size) sol.HM_vec = np.zeros(par.wF_vec.size) sol.LF_vec = np.zeros(par.wF_vec.size) sol.HF_vec = np.zeros(par.wF_vec.size) sol.beta0 = np.nan sol.beta1 = np.nan def calc_utility(self,LM,HM,LF,HF): """ calculate utility """ par = self.par sol = self.sol # a. consumption of market goods C = par.wM*LM + par.wF*LF # b. home production H = HM**(1-par.alpha)*HF**par.alpha # c. total consumption utility Q = C**par.omega*H**(1-par.omega) utility = np.fmax(Q,1e-8)**(1-par.rho)/(1-par.rho) # d. disutlity of work epsilon_ = 1+1/par.epsilon TM = LM+HM TF = LF+HF disutility = par.nu*(TM**epsilon_/epsilon_+TF**epsilon_/epsilon_) return utility - disutility def solve_discrete(self,do_print=False): """ solve model discretely """ par = self.par sol = self.sol opt = SimpleNamespace() # a. all possible choices x = np.linspace(0,24,49) LM,HM,LF,HF = np.meshgrid(x,x,x,x) # all combinations LM = LM.ravel() # vector HM = HM.ravel() LF = LF.ravel() HF = HF.ravel() # b. calculate utility u = self.calc_utility(LM,HM,LF,HF) # c. set to minus infinity if constraint is broken I = (LM+HM > 24) | (LF+HF > 24) # | is "or" u[I] = -np.inf # d. find maximizing argument j = np.argmax(u) opt.LM = LM[j] opt.HM = HM[j] opt.LF = LF[j] opt.HF = HF[j] # e. print if do_print: for k,v in opt.__dict__.items(): print(f'{k} = {v:6.4f}') return opt def solve(self,do_print=False): """ solve model continously """ pass def solve_wF_vec(self,discrete=False): """ solve model for vector of female wages """ pass def run_regression(self): """ run regression """ par = self.par sol = self.sol x = np.log(par.wF_vec) y = np.log(sol.HF_vec/sol.HM_vec) A = np.vstack([np.ones(x.size),x]).T sol.beta0,sol.beta1 = np.linalg.lstsq(A,y,rcond=None)[0] def estimate(self,alpha=None,sigma=None): """ estimate alpha and sigma """ pass
2. Jupyter Notebook 中的调用代码
from HouseholdSpecializationModel import HouseholdSpecializationModelClass model = HouseholdSpecializationModelClass
解决方案
步骤1:正确实例化模型类
首先需要创建类的实例(对象),而不是直接赋值类本身,修改Notebook中的代码:
from HouseholdSpecializationModel import HouseholdSpecializationModelClass # 加括号创建模型实例 model = HouseholdSpecializationModelClass()
步骤2:遍历不同α值并求解模型
循环测试目标α值,修改模型参数后调用求解方法,计算并保存$H_F/H_M$比值:
# 定义要测试的alpha值列表 alpha_values = [0.25, 0.50, 0.75] # 存储结果的字典 results = {'alpha': [], 'HF/HM': []} for alpha in alpha_values: # 设置当前alpha参数 model.par.alpha = alpha # 调用离散求解方法得到最优时间分配 opt = model.solve_discrete(do_print=True) # do_print=True可查看每次的最优解详情 # 计算HF/HM比值 hf_hm_ratio = opt.HF / opt.HM # 保存结果 results['alpha'].append(alpha) results['HF/HM'].append(hf_hm_ratio) print(f"当alpha={alpha}时,HF/HM={hf_hm_ratio:.4f}\n")
步骤3:可视化结果
用matplotlib绘制α值与$H_F/H_M$的关系图,直观展示变化:
import matplotlib.pyplot as plt import pandas as pd # 转换为DataFrame方便处理 df_results = pd.DataFrame(results) # 绘制柱状图 plt.figure(figsize=(8, 5)) plt.bar(df_results['alpha'], df_results['HF/HM'], color='skyblue') plt.xlabel('参数α') plt.ylabel('家务时长比值 HF/HM') plt.title('不同α值下HF/HM的变化') plt.xticks(df_results['alpha']) plt.grid(axis='y', linestyle='--', alpha=0.7) plt.show() # 绘制折线图(可选) plt.figure(figsize=(8, 5)) plt.plot(df_results['alpha'], df_results['HF/HM'], marker='o', linestyle='-', color='darkred') plt.xlabel('参数α') plt.ylabel('家务时长比值 HF/HM') plt.title('不同α值下HF/HM的变化') plt.xticks(df_results['alpha']) plt.grid(axis='y', linestyle='--', alpha=0.7) plt.show()
关键说明
par.alpha是家庭生产函数中女性家务贡献的权重,α越大,女性家务劳动对家庭产出的边际贡献越高,理论上最优$H_F$会增加,$H_F/H_M$比值上升,可通过结果验证这一预期。solve_discrete()方法通过遍历所有可能的时间分配组合(0-24小时,每0.5小时一个间隔)找到效用最大化的解,适合新手理解,无需复杂优化算法。
内容的提问来源于stack exchange,提问作者zgk915
相关产品推荐
相关产品推荐

