我需要使用 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 和生成样本的范围?
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)
如果您可以接受不是 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' )
您可以使用该函数从拟合密度生成新数据点,rlogspline
还有plogspline
和qlogspline
函数。