【问题标题】:Stat function dnorm failure统计函数 dnorm 失败
【发布时间】:2020-08-13 05:35:49
【问题描述】:

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

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()

据我所知,其余代码工作正常——只是没有正确绘制 dnorm stat 函数。完全相同的 stat 行以前对我有用,所以我不确定出了什么问题。

【问题讨论】:

  • 试试stat_function(fun = dnorm, args = list(mean = 10, sd = 2), ...)。我不认为 purr 语法适用于所有 ggplot2 函数参数。
  • @teunbrand 这就是我的想法,但显然它确实如此(见下文)。这更像是一个统计问题而不是编程问题。

标签: r ggplot2


【解决方案1】:

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

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) +
  xlim(c(5, 15)) +
  coord_cartesian(xlim = c(5, 15), ylim = c(0, 1)) +
  theme_classic()

但这是为什么呢?

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

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 = mean(median_clt_test), 
                             sd = sd(median_clt_test)),
                col = "darkorchid1", 
                lwd = 2)
  theme_classic()

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

# Theoretical SEM
2/sqrt(500)
#> [1] 0.08944272

# SD of medians
sd(median_clt_test)
#> [1] 0.08850221

【讨论】:

  • 非常感谢!这很有意义。平均值是否也应该更改为平均值(median_clt_test)? 10 是样本的理论平均值,但平均值(median_clt_test)不是完美的 10。
  • @HannahHarder 是的,你可以这样做。我想这取决于您要展示的内容。
  • @HannahHarder 我已经更新了移动 dnorm 曲线的答案
  • 是的,我认为这更好地显示了曲线的目的。非常感谢您的所有帮助和出色的解释!
猜你喜欢
  • 2019-02-14
  • 1970-01-01
  • 2020-01-18
  • 2012-11-03
  • 1970-01-01
  • 1970-01-01
  • 2013-11-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多