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

如何基于家庭分工模型展示α参数变化对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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 11:17:04