首页 > 解决方案 > 为什么正常样本的直方图在模式附近比在尾部附近更粗糙?

问题描述

我试图了解从生成的样本直方图的特定行为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)

在此处输入图像描述

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

标签: rstatisticsnormal-distribution

解决方案


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

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)很大。

关于我采用的对数变换的一点解释

v.log = log(1 + v). 它的泰勒展开式确保v.log接近0 附近v的非常小的值v。随着v变大,log(1 + v)越来越接近log(v),因此恢复了通常的对数变换。


推荐阅读