RStudio中含负值数据集拟合对数正态等分布的问题求助
解决股票对数回报拟合分布的两个常见问题
我之前也碰到过类似的情况,刚好可以给你一些实用的解决方案:
一、对数正态分布拟合:处理负值数据的问题
对数正态分布的核心要求是数据必须全部为正,但股票对数回报(log(1+收益率))天然会出现负值(股价下跌时),直接拟合肯定会报错。你提到的平移方法是可行的,具体操作步骤如下:
- 计算数据的最小值,确定需要平移的幅度
- 把所有数据平移到正区间(记得加一个极小的正数,避免出现0)
- 拟合平移后的数据,最后还原参数到原始尺度
示例代码:
# 处理GSPC对数回报的负值 min_return <- min(logreturn.GSPC) # 平移数据:减去最小值(相当于把最小值移到0)再加1e-8确保所有值>0 shifted_returns <- logreturn.GSPC - min_return + 1e-8 # 拟合平移后的对数正态分布 library(MASS) dist1 <- fitdistr(shifted_returns, densfun = "lognormal") # 还原原始数据对应的对数正态参数 # 对数正态的meanlog需要减去平移量的对数 original_meanlog <- dist1$estimate["meanlog"] - log(-min_return + 1e-8) original_sdlog <- dist1$estimate["sdlog"]
注意:这种平移方法会改变数据的位置特征,后续分析时一定要记得把平移的影响考虑进去。如果不需要严格用对数正态,也可以考虑用偏态正态分布(支持负值)来替代,拟合起来更直接。
二、Student-t分布拟合:解决"In log(s) : NaNs produced"错误
这个错误几乎都是因为优化过程中尺度参数s变成了非正数,或者初始值设置不合理导致的。给你两个解决思路:
1. 调整初始值,确保参数合理
Student-t分布的自由度df必须大于2(否则方差无穷大,优化算法无法收敛),而且尺度参数s必须是正数。你之前把df设为2刚好踩了坑,改成更大的初始值试试:
library(MASS) # 设置合理的初始值:df初始为5,确保大于2;s用样本标准差保证正数 start_params <- list(m = mean(logreturn.SBUX), s = sd(logreturn.SBUX), df = 5) dist4 <- fitdistr(logreturn.SBUX, "t", start = start_params)
2. 改用fitdistrplus包的fitdist函数,稳定性更强
fitdistr(MASS包)的优化有时候比较敏感,换成fitdistrplus包的fitdist函数,支持更多优化方法和参数控制:
library(fitdistrplus) # 用MLE方法拟合,设置初始值和优化控制参数 start_params <- list(m = mean(logreturn.SBUX), s = sd(logreturn.SBUX), df = 5) dist4 <- fitdist(logreturn.SBUX, "t", method = "mle", start = start_params, control = list(reltol = 1e-8, maxit = 1000))
如果还是报错,可以检查数据里有没有极端异常值——极端值可能导致优化过程中尺度参数趋近于0,进而触发log(s)的NaN。可以先用箱线图检测并移除极端值,再尝试拟合。
内容的提问来源于stack exchange,提问作者Simon
相关产品推荐
相关产品推荐

