[英]Density plot of the F-distribution (df1=1). Theoretical or simulated?
我正在绘制R中 F(1,49) 的密度。 当值接近零时,模拟图似乎与理论图不匹配。
set.seed(123)
val <- rf(1000, df1=1, df2=49)
plot(density(val), yaxt="n",ylab="",xlab="Observation",
main=expression(paste("Density plot (",italic(n),"=1000, ",italic(df)[1],"=1, ",italic(df)[2],"=49)")),
lwd=2)
curve(df(x, df1=1, df2=49), from=0, to=10, add=T, col="red",lwd=2,lty=2)
legend("topright",c("Theoretical","Simulated"),
col=c("red","black"),lty=c(2,1),bty="n")
默认情况下, density
使用高斯核来估计给定点的概率密度。 实际上,这意味着在每个点发现一个观测值,一个正态密度曲线被放置在那里,其中心位于观测值。 所有这些法向密度相加,然后对结果进行归一化,使曲线下的面积为 1。
如果观察结果具有集中趋势,则此方法效果很好,但当存在尖锐边界时会给出不切实际的结果(尝试plot(density(runif(1000)))
作为主要示例)。
当您有非常高的点密度接近零但没有低于零时,所有正常内核的左尾将“溢出”为负值,从而给出与理论密度不匹配的高斯类型。
这意味着如果您在 0 处有一个尖锐的边界,您应该删除介于零和平滑内核的大约两个标准偏差之间的模拟密度值 - 低于此值的任何值都会产生误导。
由于我们可以使用density
的bw
参数来控制平滑内核的标准偏差,并使用ggplot
轻松控制绘制哪些 x 值,因此我们将通过执行以下操作获得更合理的结果:
library(ggplot2)
ggplot(as.data.frame(density(val), bw = 0.1), aes(x, y)) +
geom_line(aes(col = "Simulated"), na.rm = TRUE) +
geom_function(fun = ~ df(.x, df1 = 1, df2 = 49),
aes(col = "Theoretical"), lty = 2) +
lims(x = c(0.2, 12)) +
theme_classic(base_size = 16) +
labs(title = expression(paste("Density plot (",italic(n),"=1000, ",
italic(df)[1],"=1, ",italic(df)[2],"=49)")),
x = "Observation", y = "") +
scale_color_manual(values = c("black", "red"), name = "")
kde1d和logspline包对于这种密度来说还不错。
sims <- rf(1500, 1, 49)
library(kde1d)
kd <- kde1d(sims, bw = 1, xmin = 0)
plot(kd, col = "red", xlim = c(0, 2), ylim = c(0, 2))
curve(df(x, 1, 49), add = TRUE)
library(logspline)
fit <- logspline(sims, lbound = 0, knots = c(0, 0.5, 1, 1.5, 2))
plot(fit, col = "red", xlim = c(0, 2), ylim = c(0, 2))
curve(df(x, 1, 49), add = TRUE)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.