2016-11-29 121 views
1

我试图计算高斯核密度,并且为了测试我对density()函数的了解,我决定从头计算并比较两个结果。密度()内核估计器与计算相比的差异

但是,他们没有提供相同的答案。

我开始与现有的数据集

xi <- mtcars$mpg 

,可以绘制该数据的内核密度,如下

plot(density(xi, kernel = "gaussian")) 

提供这个...

Automated gaussian kernel density

然后我抓住一些d从这个计算来看,这样我的计算是一致的。

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)) 
} 

基本计算已按照丹尼尔威尔克斯的“大气科学统计方法”第3版第3.3.6节的详细内容构建。 Equation 3.13 from Wilks textbook 与高斯核设置为enter image description here和t为enter image description here

然而,这里是我的问题。

然后我绘制了两人在一起......

plot(y=fx0,x=x0, type="l", ylim=c(0,0.07)) 
lines(x=auto.dens$x, y=auto.dens$y, col="red") 

从密度函数(红色),和我的计算(黑色),我得到的输出 enter image description here

!这两个计算显然不同!

我想不明白密度函数是如何工作的?为什么我无法从头开始计算相同的结果?为什么我的内核估计器提供不同的结果?为什么我的结果不够流畅?

我需要构建并应用一个内核平滑器(不仅仅是密度)到一个更复杂的数据集中,并且只做这个小例子来确保我的功能与自动化功能相同,期待有这个问题。我尝试了各种各样的东西,只是看不出为什么我会得到不同的结果。

非常感谢大家的阅读和任何意见,无论大小。

编辑:13:40 29/11/2016 解决方案,详细回答下​​面 enter image description here

回答

2

你并不需要sum(K*t),只是sum(K)

xi <- mtcars$mpg 
plot(density(xi, kernel = "gaussian"), lwd = 2) 

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)/(length(t)*h)) 
} 

lines(x0, fx0, col = "red", lty = "dotted") 
+0

谢谢!这解决了这个问题,显然只是我对从教科书中的数学不理解到代码的理解。我很放心,这是一个简单的问题! – Kate2808