为什么正常样本的直方图在模式附近比在尾部附近更粗糙?
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 的数量随着样本大小(通常作为立方根,有时作为对数)和比这里的分析更复杂的分析而变化相当缓慢需要得到确切的形式。然而,结果是相同的——在通常观察到的条件下,箱子高度的方差通常随箱子的高度单调增加。
我试图了解从 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 的数量随着样本大小(通常作为立方根,有时作为对数)和比这里的分析更复杂的分析而变化相当缓慢需要得到确切的形式。然而,结果是相同的——在通常观察到的条件下,箱子高度的方差通常随箱子的高度单调增加。