【问题标题】:Custom Kernel in kdensity package in RR中kdensity包中的自定义内核
【发布时间】:2019-07-05 07:35:24
【问题描述】:

我在将定制内核插入 R 包时需要帮助,这可能吗?在 kdensity 包中,它声明“内核函数可以从内置内核列表中选择或定制。”

我在网上找到了一个关于如何使用 kdensity 包插入自定义内核的教程,但是我仍然不清楚它实际上是如何工作的。

这里是教程的链接: (https://cran.r-project.org/web/packages/kdensity/vignettes/tutorial.html)。

我想要做的是使用自定义内核 0.5e^(-|x|) 和模拟随机正态数据 (x=rnorm(100,6,2) 来绘制内核估计值。然后从那里,更改带宽以查看它对绘图的影响。

根据教程,给出了高斯核的例子,代码如下:

    gaussian = list(
     kernel  = function(y, x, h) dnorm((y-x)/h),
     sd      = 1,
     support = c(-Inf, Inf))

x 是数据,y 是要评估的点,h 是带宽。

因此,基于此,我创建了这个:

    k1=list(
     kernel=function(y,x,h){
     inside=(y-x)/h
     0.5*exp(-1*abs(inside))
     },

     suport=c(-Inf,Inf)
     )

然后,我在 kdensity 包中运行它,得到了这个错误:

   kde=kdensity(N,kernel = "k1",bw=0.5)
   Error: The supplied kernel ('k1') is not implemented.

显然有些地方不对劲,我不知道如何解决。

感谢任何帮助!

【问题讨论】:

    标签: r kernel-density


    【解决方案1】:

    两件事:

    1. support 而不是 suport
    2. kernel = k1 而不是 kernel = "k1"

    这给了

    k1 <- list(
      kernel = function(y,x,h) {
        inside <- (y - x) / h
        0.5 * exp(-1 * abs(inside))},
      support = c(-Inf, Inf))
    kdensity(rnorm(1000), kernel = k1, bw = 0.5)
    # 
    # Call:
    # kdensity(x = rnorm(1000), bw = 0.5, kernel = k1)
    #
    # Data:      rnorm(1000) (1000 obs.)
    # Bandwidth: 0.5 ('user supplied')
    # Support:   (-Inf, Inf)
    # Kernel:    k1
    # Start:     uniform
    

    【讨论】:

    • 非常感谢!我一直忽略的小错误!
    • @MBR,第二点不是那么明显,但通常情况确实如此,如果有的话,它是被接受为字符的内置东西,而自定义的东西需要直接作为函数提供。
    • 再次感谢。现在该函数适用于正常和指数随机数据,但是当我尝试它用于伽马随机数据时,它说提供的数据 x 不包含在支持中。我什至修复了支持边界以匹配随机数据的范围,但它仍然给我这个错误。任何线索为什么?
    • @MBR,对于 gamma,支持必须至少为 c(0, Inf)。与我的答案相同的k1 也应该有效。如果没有,你就做错了。
    猜你喜欢
    • 2017-05-29
    • 1970-01-01
    • 2017-07-26
    • 2015-10-23
    • 2012-08-18
    • 2011-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多