【问题标题】:Discrepancies in the density() kernel estimator compared to calculations by scratch与从头计算相比,密度()内核估计器的差异
【发布时间】:2017-04-13 08:06:07
【问题描述】:

我正在尝试计算高斯核密度,为了测试我对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")

密度函数的输出(红色)和我的计算(黑色),我得到

!这两种计算方式明显不同!

我是否错过了密度函数的工作原理?为什么我不能从头开始计算相同的结果?为什么我的内核估计器提供不同的结果?为什么我的结果不太顺利?

我需要构建一个内核平滑器(不仅仅是密度)并将其应用于更复杂的数据集,并且只做了这个小例子来确保我正在做与自动化函数相同的操作,实际上并没有期待有这个问题。我已经尝试了各种各样的事情,只是不明白为什么我会得到不同的结果。

提前感谢大家的阅读和任何 cmets,无论大小。

编辑:13:40 29/11/2016 解决方案,详见下面的答案

【问题讨论】:

    标签: r gaussian kernel-density probability-density


    【解决方案1】:

    您不需要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")
    

    【讨论】:

    • 谢谢!这解决了问题,显然只是我对教科书数学的理解没有遵循代码。我很放心,这是一个如此简单的问题!
    猜你喜欢
    • 1970-01-01
    • 2011-08-07
    • 1970-01-01
    • 2017-02-11
    • 2018-12-19
    • 2021-01-25
    • 2020-11-25
    • 2011-08-28
    • 2018-10-06
    相关资源
    最近更新 更多