最近田茂再老师在讲这个问题。
[未知用户] 不明真相的本文作者表示压力很大……
这个办法看起来挺理论的,学习了!
不过有个更简单的办法,直接对数据LOG后再在LOG后的数据上建密度函数,再转化过来,不就好了吗。--sliverman 84年那本书上是这么说的

    shuaihuang 多谢提醒,我用对数变换的方法试了一下,公式是

    f^(x)=1nxh(lnxlnxih)\hat{f}(x)=\frac{1}{nxh}\sum(\frac{\ln x-\ln x_i}{h})

    程序如下:

    k <- function(x) 3 / 4 * (1 - x^2) * (abs(x) <= 1)
    den.est <- function(u, ui, h) {
      sapply(u, function(u) ifelse(u < 0, 0,
          mean(k((log(u) - log(ui)) / h)) / (u * h)
        ))
    }
    set.seed(123)
    dat <- rexp(1000, 1)
    x <- seq(0.01, 8, by = 0.05)
    y <- den.est(x, dat, 2 * bw.nrd0(log(dat)))
    plot(x, y, type = "l", ylim = c(0, 1.2), main = "Log Transformed")
    lines(x, dexp(x, 1), col = "red")

    结果发现在很靠近0的时候出现了一个诡异的下降(可能是因为估计式的分母中有x,在0点无定义)。

    6 天 后

    yihui 这种变换的方法就是把有边界的区间变换到R上吧,比如如果X是[1,+][-1,+∞]上的,就令Y=g(X)=log(X+1)Y=g(X)=log(X+1),然后fX(x)=fY(g(x))g(x)f_X(x)=f_Y(g(x))g'(x)

    2 个月 后
    理论虽然如此,但实际操作中a(x),b(x)都怎么选取?能说说思路吗?
    还有p(x)的公式(倒数第二个)是怎么由倒数第三个导出的?
    [未知用户] a_i(x)不是选出来的,它是对核函数进行积分的结果,积分的上下限与区间的边界有关,参见文中的定义式。只要核函数定了,区间定了,a_i(x)就定了。
    把p(x)当作是一个核函数,写出密度估计的表达式,变换后会发现与倒数第三个式子相等。简单地来说,对不同核函数的密度估计进行线性组合,相当于对核函数进行线性组合然后估计密度,前提是保证核函数和密度函数积分为1之类的。
    1 个月 后
    4 个月 后
    [未知用户] 直觉感觉:在对数变换之后,原始数据趋向于-INF的分布过于稀疏,nh不趋于正无穷。如果要使对数变换后的数据在-inf的位置上nh趋于正无穷,那么原数据在[0,1]区间上就不应该是均匀分布,在趋于0的位置上的密度应该呈指数增加。但是这个在实际中几乎不能做到,因此对数变换不能消除在0点位置上的一阶偏差。所以原文的方法是更好的处理方法。
    [未知用户] 我稍微折腾了一下,基本上就是这个原因,推导在这里。针对上面那个例子,把带宽调大些可以减轻那种现象,相当于是减小方差;但h一大,偏差又大了。如果从MSE方面考虑,还是需要做出一些权衡的。正文中的方法有个缺点是不能保证密度函数的积分是1,不知道是不是有人继续在这方面加以改进。
    [未知用户] 恩,我应该更正一下,在0点附近的密度应该成倒数速率增加,因为d(logx)=1/xdx,这也解释了你方差的第一项。
    对于积分为1的问题,可以考虑标准化,但不知能否证明标准化的分母的MSE是否为分子MSE的高阶无穷小。
    6 个月 后
    您好,我们在用SAS编程求核密度的时候也遇到这个问题,在0附近的核密度都大于1,请问怎么解决这个问题呢?
    [未知用户] 为什么总是有人认为密度函数值一定要小于1呢?只有累积分布函数(CDF)取值是在[0, 1]上,密度函数没有小于1这种范围。
    [未知用户] 密度不是概率,不要求在[0,1]之间。你可以算一下正态分布N(0,0.000001)在0点的密度值。
    [未知用户] 是的。谢谢三楼。对于离散的分布列(在连续成为密度函数)的值是在[0,1](由于此时的分布列即是概率值);连续的密度函数值不一定在[0,1]之间,因为它只是函数值不是概率(三楼);例如三楼给的dnorm(0,0,000001)=398942.3;均匀分布[0,0.01]密度函数值全是100!
    文章提供的方法很有实际意义。现实中的很多分布原本就有区间限制。
    我现在就碰到一个这样的问题。根据住院费用的一定赔付数据求出住院赔付的核密度估计。这里的费用明显是非负的。进而需要求解赔付的期望和方差。这里需要用到积分。
    但我遇到的问题是,因为要求根据病人男女不同,医院等级不同等,需要进一步求出每一个细分赔付的核密度估计,并求期望和方差。 根据文章中给出的核密度函数 den.est=function(u,ui,h) 。只需要求 den.est(u,ui,h)*u 在0-Inf上的积分 就可求解期望。 但是这样作用在三个数上的自定义函数,怎样运用tapply 和by 之类的函数实现快捷地对dat在其他条件限制下的核密度函数?一般运用tapply都只是求出了一个值,但是这里需要求出一个函数。如果每次人工将dat按条件挑出来,费时且当限制条件种类很多(如医院等级很多),容易出错。 不知道有没有什么好的方法?
    边学R边用,对R了解不是很深。
    6 个月 后
    I like this boundary bias reduction trick, and it reminds me the somewhat remotely related generalized jackknife bias correction.