如何在ggplot2中绘制拟合的Ex-gaussian密度曲线?
绘制基于已知参数的平滑Ex-Gaussian拟合曲线
我懂你现在的困扰:用模拟数据生成的密度图每次跑出来形态都有点不一样,毕竟抽样有随机性嘛。你想要的是一条完全基于你手里的mu、sigma、tau参数的平滑拟合曲线,不管运行多少次都能保持完全一致的形态,对吧?
你之前用rexgauss()生成模拟样本再画密度图的思路,问题就出在随机抽样的波动上——每次模拟的样本都有差异,自然曲线形态不稳定。咱们换个思路,直接用理论密度函数来计算,就能得到绝对稳定的平滑曲线了。
这里咱们用retimes包自带的dexgauss()函数(专门用来计算Ex-Gaussian分布的概率密度值),步骤很清晰:
- 先生成一个足够密集的x轴数值序列,覆盖这个分布的主要取值范围(可以根据你的参数调整区间,确保包含大部分概率密度)
- 用
dexgauss()计算每个x对应的理论密度值 - 最后用ggplot直接绘制这条理论曲线
下面是完整的代码示例,我用你给出的参数(mu=1, sigma=1, tau=1)来演示:
library(retimes) library(ggplot2) # 1. 定义你已有的Ex-Gaussian参数 mu <- 1 sigma <- 1 tau <- 1 # 2. 生成密集的x值序列(这里取0到8,覆盖该参数下分布的主要区间) x_vals <- seq(from = 0, to = 8, by = 0.01) # 3. 计算每个x对应的理论概率密度 density_vals <- dexgauss(x_vals, mu = mu, sigma = sigma, tau = tau) # 4. 转换成ggplot能用的数据框格式 exgauss_fit_df <- data.frame(x = x_vals, density = density_vals) # 5. 绘制平滑的理论拟合曲线 ggplot(exgauss_fit_df, aes(x = x, y = density)) + geom_line(size = 1, color = "#2E86AB") + labs(x = "观测值", y = "概率密度", title = "平滑Ex-Gaussian拟合曲线") + theme_minimal()
如果你想同时对比模拟数据的密度图和理论曲线,也可以把两者放在一起:
# 保留你原来的模拟数据步骤 sim_data <- as.data.frame(rexgauss(1000, mu=mu, sigma=sigma, tau=tau)) colnames(sim_data) <- "obs" # 同时绘制模拟密度和理论曲线 ggplot() + geom_density(data = sim_data, aes(x = obs), size=1, alpha=.4, fill = "#F2D388") + geom_line(data = exgauss_fit_df, aes(x = x, y = density), size = 1.2, color = "#2E86AB") + labs(x = "观测值", y = "概率密度", title = "Ex-Gaussian:模拟数据vs理论曲线") + theme_minimal()
这样每次运行,理论曲线都是完全一致的,模拟密度图会有抽样波动,但能直观看到两者的对应关系。
内容的提问来源于stack exchange,提问作者HJT
相关产品推荐
相关产品推荐

