geom_density绘图与预期不符,求原因及修正方法
问题原因分析
- 函数定义错误:你命名为
r_density的函数并非随机数生成器,它只是计算给定输入的密度值(对应拉普拉斯分布的概率密度函数),没有实现生成服从该分布随机样本的逻辑。 - 样本生成错误:你用
runif(N)生成了均匀分布的数值,然后计算这些数值对应的密度值,再对密度值进行密度估计——这完全违背任务要求,任务需要的是生成服从目标分布的样本,而非对均匀分布样本的密度值做估计。 - 绘图映射错误:
geom_density中把x映射到了密度值density_fkt,而非目标分布的样本值;同时使用..scaled..对估计密度做缩放,导致图形形态与真实密度完全不符。
修正后的实现代码
library(tidyverse) # 正确的拉普拉斯分布随机数生成函数 r_density <- function(n) { # 利用两个独立指数分布的差值生成拉普拉斯样本 y1 <- rexp(n, rate = 1) y2 <- rexp(n, rate = 1) y1 - y2 } N <- 1000 # 生成服从目标分布的样本 samples <- r_density(N) tb <- tibble(x = samples) ggplot() + # 用生成的样本估计密度 geom_density(data = tb, mapping = aes(x = x), color = "black", size = 1) + # 绘制真实密度函数 geom_function( fun = function(x) exp(-abs(x))/2, xlim = c(-6,6), color = "red", size = 1 ) + theme_minimal() + labs( x = "x", y = "Dichtefunktion f(x)", title = "Geschätzte (schwarz) vs echte (rot) Dichte" )
关键修正点说明
- 随机数生成函数:重新实现
r_density,通过两个独立指数分布的差值生成拉普拉斯分布样本(拉普拉斯分布的一个核心性质是可分解为两个同速率指数分布的差)。 - 样本来源:使用修正后的
r_density(N)生成目标分布的样本,而非均匀分布样本。 - 绘图逻辑:
geom_density的x映射到生成的样本值,去掉..scaled..参数,保证估计密度的尺度与真实密度一致,便于直接对比。
内容的提问来源于stack exchange,提问作者clementine1001
相关产品推荐
相关产品推荐

