Stat函数dnorm失效

Stat函数dnorm失效,r,ggplot2,R,Ggplot2,我正在处理一个类问题,以测试中心极限定理是否也适用于中位数。我已经编写了代码,据我所知,它工作得很好。但是我绘制正态分布的数据没有显示出来。当它应该创建钟形曲线时,它只创建一条平线。代码如下: set.seed(14) median_clt <- rnorm(1000, mean = 10, sd = 2) many_sample_medians <- function(vec, n, reps) { rep_vec <- replicate(reps, sample(v

我正在处理一个类问题,以测试中心极限定理是否也适用于中位数。我已经编写了代码,据我所知,它工作得很好。但是我绘制正态分布的数据没有显示出来。当它应该创建钟形曲线时,它只创建一条平线。代码如下:

set.seed(14)
median_clt <- rnorm(1000, mean = 10, sd = 2)

many_sample_medians <- function(vec, n, reps) {
  rep_vec <- replicate(reps, sample(vec, n), simplify = "vector")
  median_vec <- apply(rep_vec, 2, median)
  return(median_vec)
}

median_clt_test <- many_sample_medians(median_clt, 500, 1000)

median_clt_test_df <- data.frame(median_clt_test)
bw_clt <- 2 * IQR(median_clt_test_df$median_clt_test) / length(median_clt_test_df$median_clt_test)^(1/3)
ggplot(median_clt_test_df, aes(x = median_clt_test)) + 
  geom_histogram(binwidth = bw_clt, aes(y = ..density..), fill = "hotpink1", col = "white") + 
  stat_function(fun = ~dnorm(.x, mean = 10, sd = 2), col = "darkorchid1", lwd = 2) +
  theme_classic()
set.seed(14)

中线不是很平;与柱状图相比,它只是非常延伸。如果我们缩小x轴并放大y轴,我们可以更清楚地看到这一点:

ggplot(中位数clt测试df,aes(x=中位数clt测试))+
几何直方图(BINWITH=bw\U clt,aes(y=…密度…),
fill=“hotpink1”,col=“white”)+
统计函数(fun=~dnorm(.x,平均值=10,sd=2),
col=“darkorchid1”,
lwd=2)+
xlim(c(5,15))+
坐标笛卡尔(xlim=c(5,15),ylim=c(0,1))+
主题(经典)

但这是为什么呢

这是因为您正在使用
dnorm
绘制随机变量的分布图,从中可以绘制中间值,但您的直方图是中间值本身的样本。因此,您绘制了错误的
dnorm
曲线。
sd
不应是随机变量的标准偏差,而是样本中位数的标准偏差:

ggplot(中位数clt测试df,aes(x=中位数clt测试))+
几何直方图(BINWITH=bw\U clt,aes(y=…密度…),
fill=“hotpink1”,col=“white”)+
stat_函数(fun=~dnorm(.x,
平均值=平均值(中位数clt检验),
sd=sd(中位数clt试验),
col=“darkorchid1”,
lwd=2)
主题(经典)

如果您愿意,您可以使用平均值的理论标准误差,而不是中位数的测量标准偏差-它们将非常相似

#理论扫描电镜
2/平方米(500)
#> [1] 0.08944272
#中位数
sd(中位数clt检验)
#> [1] 0.08850221

这条线不是很平;与柱状图相比,它只是非常延伸。如果我们缩小x轴并放大y轴,我们可以更清楚地看到这一点:

ggplot(中位数clt测试df,aes(x=中位数clt测试))+
几何直方图(BINWITH=bw\U clt,aes(y=…密度…),
fill=“hotpink1”,col=“white”)+
统计函数(fun=~dnorm(.x,平均值=10,sd=2),
col=“darkorchid1”,
lwd=2)+
xlim(c(5,15))+
坐标笛卡尔(xlim=c(5,15),ylim=c(0,1))+
主题(经典)

但这是为什么呢

这是因为您正在使用
dnorm
绘制随机变量的分布图,从中可以绘制中间值,但您的直方图是中间值本身的样本。因此,您绘制了错误的
dnorm
曲线。
sd
不应是随机变量的标准偏差,而是样本中位数的标准偏差:

ggplot(中位数clt测试df,aes(x=中位数clt测试))+
几何直方图(BINWITH=bw\U clt,aes(y=…密度…),
fill=“hotpink1”,col=“white”)+
stat_函数(fun=~dnorm(.x,
平均值=平均值(中位数clt检验),
sd=sd(中位数clt试验),
col=“darkorchid1”,
lwd=2)
主题(经典)

如果您愿意,您可以使用平均值的理论标准误差,而不是中位数的测量标准偏差-它们将非常相似

#理论扫描电镜
2/平方米(500)
#> [1] 0.08944272
#中位数
sd(中位数clt检验)
#> [1] 0.08850221

试试统计函数(fun=dnorm,args=list(mean=10,sd=2),…)
。我不认为purr语法适用于所有ggplot2函数参数。@teunbrand这就是我的想法,但显然它确实适用(见下文)。这与其说是编程问题,不如说是统计问题。试试统计函数(fun=dnorm,args=list(mean=10,sd=2),…)。我不认为purr语法适用于所有ggplot2函数参数。@teunbrand这就是我的想法,但显然它确实适用(见下文)。这与其说是编程问题,不如说是统计问题。非常感谢!这很有道理。平均值是否也应改为平均值(中位数clt检验)?10是样本的理论平均值,但平均值(中位数clt检验)并不完全是10。@Hannahard是的,你可以这样做。我想这取决于你想展示什么。@Hannahard我已经更新了答案来移动dnorm curveYeah我认为这更好地显示了曲线的用途。非常感谢你的帮助和解释!非常感谢你!这很有道理。平均值是否也应改为平均值(中位数clt检验)?10是样本的理论平均值,但平均值(中位数clt检验)并不完全是10。@Hannahard是的,你可以这样做。我想这取决于你想展示什么。@Hannahard我已经更新了答案来移动dnorm curveYeah我认为这更好地显示了曲线的用途。非常感谢你的帮助和解释!