为什么正常样本的直方图在模式附近比在尾部附近更粗糙?

Why is a histogram for normal samples rougher near the mode than near the tail?

我试图了解从 rnorm 生成的样本直方图的特定行为。

set.seed(1)
x1 <- rnorm(1000L)
x2 <- rnorm(10000L)
x3 <- rnorm(100000L)
x4 <- rnorm(1000000L)

plot.hist <- function(vec, title, brks) {
  h <- hist(vec, breaks = brks, density = 10,
            col = "lightgray", main = title) 
  xfit <- seq(min(vec), max(vec), length = 40) 
  yfit <- dnorm(xfit, mean = mean(vec), sd = sd(vec)) 
  yfit <- yfit * diff(h$mids[1:2]) * length(vec) 
  return(lines(xfit, yfit, col = "black", lwd = 2))
}

par(mfrow = c(2, 2))
plot.hist(x1, title = 'Sample = 1E3', brks = 100)
plot.hist(x2, title = 'Sample = 1E4', brks = 500)
plot.hist(x3, title = 'Sample = 1E5', brks = 1000)
plot.hist(x4, title = 'Sample = 1E6', brks = 1000)

您会注意到 在每种情况下 (我不是在进行交叉比较;我知道随着样本量变大,直方图和曲线之间的匹配更好),直方图越接近标准正态分布越接近尾部,但越接近众数。简而言之,我试图理解为什么 each 直方图在中间比尾部更粗糙。这是预期的行为还是我错过了一些基本的东西?

rnorm() 从正态分布中抽取 随机 样本。样本的大小是 rnorm() 的第一个参数。所以如果你这样做 hist(rnorm(10)) 你当然会得到一些看起来不太像正常钟形曲线的东西,因为你的样本量太小了。如果你这样做 hist(rnorm(1000)) 会更好,如果你这样做 hist(rnorm(1e8)) 你的样本应该非常接近曲线。

我们的眼睛在愚弄我们。模式附近的密度很高,因此我们可以更明显地观察到变化。尾巴附近的密度非常低,以至于我们无法真正发现任何东西。以下代码执行某种 "standardization",使我们能够可视化相对比例的变化。

set.seed(1)
x1 <- rnorm(1000L)
x2 <- rnorm(10000L)
x3 <- rnorm(100000L)
x4 <- rnorm(1000000L)

foo <- function(vec, title, brks) {
  ## bin estimation
  h <- hist(vec, breaks = brks, plot = FALSE)
  ## compute true probability between adjacent break points
  p2 <- pnorm(h$breaks[-1])
  p1 <- pnorm(h$breaks[-length(h$breaks)])
  p <- p2 - p1
  ## compute estimated probability between adjacent break points
  phat <- h$count / length(vec)
  ## compute and plot their absolute relative difference
  v <- abs(phat - p) / p
  ##plot(h$mids, v, main = title)
  ## plotting on log scale is much better!!
  v.log <- log(1 + v)
  plot(h$mids, v.log, main = title)
  ## invisible return
  invisible(list(v = v, v.log = v.log))
  }

par(mfrow = c(2, 2))
v1 <- foo(x1, title = 'Sample = 1E3', brks = 100)
v2 <- foo(x2, title = 'Sample = 1E4', brks = 500)
v3 <- foo(x3, title = 'Sample = 1E5', brks = 1000)
v4 <- foo(x4, title = 'Sample = 1E6', brks = 1000)

相对变化在中间附近(接近 0)最低,但在两个边缘附近非常高。这在统计数据中得到了很好的解释:

  • 我们在中间附近有更多样本,所以 (sample sd) : (sample mean) 较低;
  • 边缘附近的样本很少,可能有 1 个或 2 个,所以 (sample sd) : (sample mean) 很大。

稍微解释一下log-transform我拿

v.log = log(1 + v)。它的泰勒展开确保 v.log 接近 v 对于非常小的 v 大约 0。随着 v 变大,log(1 + v) 接近 log(v),因此恢复了通常的log-transform。

这不仅适用于正常样本。如果我们有固定的分箱(而不是像我们通常那样由数据确定的分箱)并且我们以观察总数为条件,那么计数将为 multinomial.

bin i 中计数的期望值为 n·p(i) 其中 p(i) 是落在 bin 中的人口密度的比例 (i ).

bin i 中计数的方差将为 n·p(i)·(1-p(i))。对于许多 bin 和像法线一样平滑的非峰值密度,(1-p(i)) 将非常接近 1; p(i) 通常会很小(远小于 1/2)。

计数的方差(以及它的标准差)是预期高度的递增函数:

对于固定的 bin 宽度,高度与预期计数成正比,而 bin 高度的标准偏差是高度的递增函数。

所以这正是你所看到的。

实际上,bin 边界并不是固定的;当您添加观察值或生成新样本时,它们会发生变化,但是 bin 的数量随着样本大小(通常作为立方根,有时作为对数)和比这里的分析更复杂的分析而变化相当缓慢需要得到确切的形式。然而,结果是相同的——在通常观察到的条件下,箱子高度的方差通常随箱子的高度单调增加。