在R中使用optim()拟合自定义模型的实现是否正确?
关于自定义模型拟合方法的正确性判断
你的拟合思路和代码整体是正确的,以下是具体分析:
一、核心逻辑的正确性
- 负对数似然函数的参数化合理:通过
beta = exp(alpha)、sigma = exp(params[4])的转换,确保了模型要求的非负参数约束,避免优化过程中出现无效的负数值。 - 似然计算逻辑准确:使用
dnorm(y, mean = mu, sd = sigma, log = TRUE)计算单观测对数似然,求和后取负得到负对数似然,符合极大似然估计的目标;加入的NA/Inf判断能规避数值异常导致的优化中断。 - 优化流程规范:调用
optim()的BFGS方法进行无约束优化,同时计算海森矩阵用于标准误估计,最后将转换后的参数(beta、sigma)整理输出的步骤完全正确。
二、需要优化的细节
- 初始值调整:当前设置的
start_params = c(0, 0.5, 0, 0)是可行的,但如果出现优化不收敛(fit$convergence != 0),可以尝试基于简单OLS估计初始值,比如先拟合y ~ y_lag + x,用系数作为c、phi1、beta的初始值,再取log(sigma)为OLS残差标准差的对数。 - 标准误的转换:当前计算的
se是优化参数(c、phi1、alpha、log(sigma))的标准误,若要得到原模型参数beta和sigma的标准误,需要通过delta方法转换:# 计算beta的标准误 se_beta <- final_params["beta"] * se[3] # 计算sigma的标准误 se_sigma <- final_params["sigma"] * se[4] # 整理最终参数与标准误 final_results <- data.frame( Estimate = c(final_params), Std.Error = c(se[1], se[2], se_beta, se_sigma) ) - 收敛性验证:拟合完成后务必检查
fit$convergence是否为0,若不为0说明优化未收敛,需要调整初始值或更换优化方法(比如使用method = "L-BFGS-B"并设置参数边界)。 - 稳定性测试:可以尝试用不同的优化方法(如Nelder-Mead)重复拟合,对比参数估计结果,确保估计的稳定性。
内容的提问来源于stack exchange,提问作者stats_noob
相关产品推荐
相关产品推荐

