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

如何在MLE模型中实现alpha参数按国家-年份变动(复现Layard等2008论文)

实现随Country-Year变动的Alpha参数估计(针对《The marginal utility of income》复现)

看起来你已经在复现论文的路上走了不少啦!要让alpha(对应你代码里的a)随国家-年份(country-year)变动,核心是给每个国家-年份组合分配独立的alpha参数,下面是具体的修改步骤和代码:

步骤1:构造Country-Year分组变量

首先需要把你的国家(yct)和时间(Time)变量组合成唯一的country-year分组。我们从Time里提取年份,再和国家名称拼接成分组标识:

# 从Time变量提取年份,构造country-year分组
TDT[, year := year(Time)]
TDT[, cy_group := factor(paste(yct, year, sep = "_"))]
# 统计分组数量,后续设置参数时用
n_cy <- length(unique(TDT$cy_group))

步骤2:修改对数似然函数

原来的似然函数里a是全局单一参数,现在要改成每个country-year分组对应一个alpha值。我们把alpha设为一个向量,然后给每个观测匹配对应分组的alpha:

LL4_cy <- function(p, mu, sigma, alpha_vec) {
  # 为每个观测匹配其对应的country-year alpha值
  alpha <- alpha_vec[match(TDT$cy_group, levels(TDT$cy_group))]
  
  # 计算模型的线性预测项:alpha*(收入转换项) + 控制变量
  linear_term <- alpha * ((TDT$Income^(1-p)-1)/(1-p)) + 
    TDT$Educ + TDT$TDT_Albania + TDT$TDT_Belarus + TDT$TDT_Chillipepper
  
  # 计算负对数似然(mle2默认最小化目标函数,所以取负的对数似然和)
  -sum(dnorm(TDT$Happiness - linear_term, mu, sigma, log = TRUE), na.rm = TRUE)
}

这里有几个关键点:

  • 用alpha_vec代替原来的单一a,向量长度等于country-year分组数
  • 通过match函数把每个观测的cy_group映射到alpha_vec的对应位置,实现分组专属alpha
  • 保留了你原来的控制变量(教育、国家虚拟变量),可以根据论文原文调整是否保留

步骤3:设置新的初始值

现在初始值需要包含每个country-year分组的alpha初始值,我们统一设为1(你也可以根据数据调整):

start_rho <- c(1,1.2,1.4,1.6,1.8,2)
mu_Happiness <- mean(TDT$Happiness, na.rm=TRUE)
sd_Happiness <- sd(TDT$Happiness, na.rm=TRUE)

# 为每个country-year分组设置alpha初始值(这里统一设为1)
start_alpha <- rep(1, n_cy)
# 整理初始值列表:p、mu、sigma和alpha_vec
start_list <- list(p = start_rho[[1]], mu = mu_Happiness, sigma = sd_Happiness, alpha_vec = start_alpha)

步骤4:调整MLE循环逻辑

原来的循环是遍历不同的p初始值,现在要把alpha_vec加入初始值列表,修改循环中的mle2调用:

mle = list()
mle_sum = list()

for (i in 1:length(start_rho)) {
  tryCatch({
    # 更新当前循环的p初始值
    start_list$p <- start_rho[[i]]
    # 调用mle2估计模型
    mle[[i]] <- mle2(LL4_cy, start = start_list, method = "BFGS")
    mle_sum[[i]] <- summary(mle[[i]])
    
    # 打印当前进度和结果
    cat("=== 当前p初始值:", start_rho[[i]], " ===\n")
    print(mle_sum[[i]])
  }, error=function(e){
    cat("初始值p=", start_rho[[i]], "时出错:", e$message, "\n")
  })
}

额外注意事项

  • 缺失值处理:我在似然函数里加了na.rm=TRUE,避免因Happiness或Income的缺失值导致计算中断,你可以根据实际数据调整
  • 参数收敛问题:如果country-year分组太多,可能会出现参数过多导致MLE不收敛的情况。可以考虑合并样本量过小的分组,或者给alpha参数加正则化约束(比如L1/L2惩罚)
  • 模型冗余检查:如果alpha已经是country-year层面的参数,原来的国家虚拟变量可能存在冗余,可以对照论文原文的模型设定决定是否保留

内容的提问来源于stack exchange,提问作者Tom

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:28:06