如何在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
相关产品推荐
相关产品推荐

