我正在尝试使用 R 中的“密度”函数找到具有未知分布的连续数据的最佳 PDF。现在,给定一个新数据点,我想基于内核找到该数据点的概率密度我从“密度”函数结果中得到的密度估计器。 我怎样才能做到这一点?
如果您的新点将在
density
生成的值范围内,则相当容易做到 - 我建议使用 approx
(或 approxfun
如果您需要它作为函数)来处理插值网格值之间。
这是一个例子:
set.seed(2937107)
x <- rnorm(10,30,3)
dx <- density(x)
xnew <- 32.137
approx(dx$x,dx$y,xout=xnew)
如果我们绘制密度和新点,我们可以看到它正在执行您需要的操作:
如果需要推断新值,这将返回
NA
。如果您想处理外推,我建议直接计算该点的 KDE(使用您拥有的 KDE 的带宽)。
这已经有一岁了,但尽管如此,这里还是一个完整的解决方案。我们打电话吧
d <- density(xs)
并定义
h = d$bw
。您的 KDE 估算完全取决于
xs
、h
,给定一个新值
t
,您可以使用以下函数计算相应的 y(t)
,该函数假设您已使用高斯核进行估计。
myKDE <- function(t){
kernelValues <- rep(0,length(xs))
for(i in 1:length(xs)){
transformed = (t - xs[i]) / h
kernelValues[i] <- dnorm(transformed, mean = 0, sd = 1) / h
}
return(sum(kernelValues) / length(xs))
}
myKDE
的作用是根据定义计算
y(t)
。
请参阅下面 Privé 的评论,了解更简洁但等效且更快的实现。
参见:文档
dnorm(data_point, its_mean, its_stdev)