使用r中的核密度估计的生成样本

时间:2013-04-19 10:00:40

标签: r random

我需要使用R中的内核密度估计从现有数据生成样本。在我的数据中缺少负值(并且不能),但是生成样本负值存在。

library(ks)
set.seed(1)
par(mfrow=c(2,1))

x<-rlnorm(100)
hist(x, col="red", freq=F)

y <- rkde(fhat=kde(x=x, h=hpi(x)), n=100)
hist(y, col="green", freq=F)

如何限制KDE和生成的样本的范围?

2 个答案:

答案 0 :(得分:4)

rkde一个positive参数:

y <- rkde(
  fhat = kde(x=x, h=hpi(x)), 
  n    = 100, 
  positive = TRUE
)

另一种方法是在估计之前转换数据(例如,用对数), 使其不受约束,并在随机数生成后将其转换回来。

x2 <- log(x)
y2 <- rkde(fhat=kde(x=x2, h=hpi(x2)), n=100)
y <- exp(y2)
hist(y, col="green", freq=F)

答案 1 :(得分:1)

如果您可以接受非KDE的密度估算,请查看logspline包。这是估算密度估计值的另一种方法,并且存在设置较低(和/或较高)边界的参数,以便得到的估计值不会超出边界并且在边界附近有意义。

这是一个基本的例子:

set.seed(1)
x<-rlnorm(100)
hist(x, prob=TRUE)

lines(density(x), col='red')

library(ks)
tmp <- kde(x, hpi(x))
lines(tmp$eval.points, tmp$estimate, col='green')

library(logspline)
lsfit <- logspline(x, lbound=0)
curve( dlogspline(x,lsfit), add=TRUE, col='blue' )

curve( dlnorm, add=TRUE, col='orange' )

enter image description here

您可以使用rlogspline函数从拟合密度生成新数据点,还有plogsplineqlogspline函数。