r - 为什么正常样本的直方图在模式附近比在尾部附近更粗糙?
问题描述
我试图了解从生成的样本直方图的特定行为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)
您会注意到,在每种情况下 (我没有进行交叉比较;我知道随着样本量变大,直方图和曲线之间的匹配会更好),直方图在尾部更接近标准法线,但在模式方面更差. 简而言之,我试图理解为什么每个直方图在中间比尾部更粗糙。这是预期的行为还是我错过了一些基本的东西?
解决方案
我们的眼睛在愚弄我们。模式附近的密度很高,因此我们可以更明显地观察到变化。尾部附近的密度非常低,以至于我们无法真正发现任何东西。以下代码执行某种“标准化”,使我们能够以相对比例可视化变化。
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)
,因此恢复了通常的对数变换。
推荐阅读
- python - 如何通过pytorch中的给定索引和张量生成新的张量?
- r - 重塑前期数据
- javascript - 如何获取 Quasar Framework 文件的绝对路径?
- rest - Postman/Newman,如何根据先前的请求响应链接请求?
- python-3.x - 非本地关键字似乎不起作用
- selenium - Selenium:单击并按住元素,然后滑动它
- sql - 在日期范围表中查找与给定日期范围相交的天数
- angular - 以 Angular 6+ 向指定模块注入服务
- android - 应用程序中的 AWS Cognito 和私有访问密钥
- excel - 有没有办法使用 vba 在网页上下载一行表格或整个表格本身?