我正在尝试计算高斯核密度,并测试我对density()
函数的了解,我决定从头开始计算并比较两个结果。
但是,他们没有提供相同的答案。
我从现有数据集开始
xi <- mtcars$mpg
并可以绘制此数据的核密度,如下所示
plot(density(xi, kernel = "gaussian"))
提供了这个......
然后我从这个计算中获取了一些细节,以便我的计算是一致的。
auto.dens <- density(xi, kernel = "gaussian")
h <- auto.dens$bw # bandwidth for kernel
x0 <- auto.dens$x # points for prediction
然后我自己计算出高斯核密度,而且我有
这是在一个循环中完成的,所以阅读起来更清楚。
fx0 <- NULL
for (j in 1:length(x0)){
t <- abs(x0[j]-xi)/h
K <- (1/sqrt(2*pi))*exp(-(t^2)/2)
fx0 <- c(fx0,sum(K*t)/(length(t)*h))
}
基本计算是按照Daniel Wilks在大气科学统计方法第3版第3.3.6节中详述的。
高斯内核设为
,t为
然而,这是我的问题。
然后我将两者结合在一起......
plot(y=fx0,x=x0, type="l", ylim=c(0,0.07))
lines(x=auto.dens$x, y=auto.dens$y, col="red")
!这两项计算明显不同!
我是否想念密度函数的工作原理?为什么我无法从头开始计算相同的结果?为什么我的内核估算器提供不同的结果?为什么我的结果不太顺畅?
我需要构建并应用更加复杂的数据集的内核平滑器(不仅仅是密度),并且只做了这个小例子以确保我和自动化函数一样,并且实际上并非如此期待有这个问题。我尝试了各种各样的东西,但是我看不出为什么会得到不同的结果。
提前感谢大家,阅读和评论,无论大小。
答案 0 :(得分:2)
您不需要))
,只需sum(K*t)
。
sum(K)