将理论密度函数绘制为 R 中的直方图的问题

Problem with theoretical density functions plotted to histograms in R

我在 R 中进行了模拟,并在直方图中绘制了结果。使用 density() 函数将概率密度添加到直方图中没有问题。但是出于某种原因,当我将理论密度绘制到直方图以进行比较时,我得到了非常奇怪的结果。这里有两个示例代码和两张图片。蓝色的理论 pdf 离我很远,我不知道为什么。有R技能的人可以指出我的错误吗?

# generating 10000 samples thrice from U(0,1) distribution
# and sorting them for the statistics:
n <- 10000
samples1 <- data.frame('0'=c(rep(NA,4)))
samples2 <- data.frame('0'=c(rep(NA,10)))
samples3 <- data.frame('0'=c(rep(NA,10)))
for (i in 1:n) {
  new <- runif(4)
  samples1[ , ncol(samples1) + 1] <- sort(new) 
  colnames(samples1)[ncol(samples1)] <- i
  new <- runif(10)
  samples2[ , ncol(samples2)+1] <- sort(new)
  colnames(samples2)[ncol(samples2)] <- i
  new <- runif(10)
  samples3[ , ncol(samples3)+1] <- sort(new)
  colnames(samples3)[ncol(samples3)] <- i
}
# dropping the first (useless) columns:
samples1 <- samples1[-c(1)] 
samples2 <- samples2[-c(1)] 
samples3 <- samples3[-c(1)] 
# selecting the statistics from the samples:
# X_2:4
stat24 <- rep(NA,n)
for (i in 1:n) {
  stat24[i] <- samples1[2,i] 
}
# X_2:10
stat210 <- rep(NA,n)
for (i in 1:n) {
  stat210[i] <- samples1[2,i]
}
# X_10:10
stat1010 <- rep(NA,n)
for (i in 1:n) {
  stat1010[i] <- samples1[10,i]
}
# plotting the histograms and Beta pdfs:
hist(stat24, freq = FALSE)
lines(dbeta(stat24, 2, 5), col='blue')
lines(density(stat24), col='red')

第 k 个统计量的分布遵循 Beta(k, n+k-1) 分布,显示为右侧的奇数蓝色笔划。

n <- 10000
random_variable_F <- rep(NA,n)
# generating 10000 samples of sizes 10 and 5 and computing F:
for (i in 1:n) {
  x <- rnorm(10, mean = 10, sd = sqrt(5))
  y <- rnorm(5, mean = 20, sd = sqrt(10))
  random_variable_F[i] <- ((var(x))*5)/((var(y)*10))
}
#head(random_variable_F)
# plotting the histogram:
hist(random_variable_F, freq = F)
lines(density(random_variable_F), col='red')
lines(df(random_variable_F, 9, 4,), col='blue')

随机变量F服从F分布。参数是样本大小减一,在本例中为 10-1=9 和 5-1=4。理论曲线非常疯狂:

如果您将单个向量传递给 lines,它会假定这是一个包含您要绘制的 y 值的向量。它在 x = 1 处绘制第一个 y 值,在 x = 2 处绘制第二个 y 值,依此类推,一直到 x = length(y)。在你的例子中,random_variable_F 是一个无序的随机变量,你只是在 1:10000 沿 x 轴绘制它的顺序值。

显然,您希望绘制函数 y = df(x),因此您需要传递 random_variable_F 作为 x 值,传递 df(random_variable_F) 作为 y 值。您还需要先对 random_variable_F 进行排序,以确保该线是从左到右绘制的:

hist(random_variable_F, freq = F)
lines(density(random_variable_F), col='red')
lines(sort(random_variable_F), df(sort(random_variable_F), 9, 4), col='blue')

请注意,绘制 lines(density(random_variable_F)) 时不会发生这种情况,因为 density 生成的列表包含有序的 x 和 y 值而不是向量。