隨着您的基礎離散數據,創建於細如你希望(網格內核密度估計即作爲根據需要爲您的應用程序(的機器精度和計算時間的範圍內,當然是「接近連續」 ))。然後從該內核密度採樣,使用密度值確保您的分佈更可能的值更可能被採樣。例如:
假數據,只是有一些在這個例子中一起工作:
set.seed(4396)
dat = round(rnorm(1000,100,10))
創建內核密度估計。增加n
如果要估計上的點的更精細的網格密度:
dens = density(dat, n=2^14)
在這種情況下,密度估計上的2^14點的網格,每個點之間的距離mean(diff(dens$x))
= 0.0045。
現在,來自核密度估計的樣本:我們對密度估計的x值進行採樣,並將prob
設置爲等於密度估計的y值(密度),以便更可能的x值將是更容易被採樣:
kern.samp = sample(dens$x, 250000, replace=TRUE, prob=dens$y)
比較dens
(我們的原始數據的密度估計)(黑線),與kern.samp
(紅色)密度:
plot(dens, lwd=2)
lines(density(kern.samp), col="red",lwd=2)

使用上述方法,您可以爲密度估計創建更精細的網格,但您仍然將密度值限制爲用於密度估計的網格點(即值爲dens$x
)。但是,如果您確實需要能夠獲得數據值的密度,則可以創建一個近似函數。在這種情況下,您仍然可以創建密度估計 - 無論採集數據結構所需的任何帶寬和網格大小 - 然後創建一個插值網格點之間密度的函數。例如:
dens = density(dat, n=2^14)
dens.func = approxfun(dens)
x = c(72.4588, 86.94, 101.1058301)
dens.func(x)
[1] 0.001689885 0.017292405 0.040875436
可以使用此,以獲得在任何x值(而不是僅僅在由density
函數所使用的網格點)的密度分佈,然後使用輸出dens.func
作爲prob
參數到sample
。
如果我理解你的問題,你可以使用Monte Carlo模擬。由於您的分佈是已知的,您可以使用該分佈的隨機抽樣來創建您的模擬數據。這聽起來像你想要做的? –
嗨@LloydChristmas,謝謝你的回覆。事情是,分佈是已知的,但我不想使用實際的離散分佈模擬數據,而是使用內核中描述的連續分佈。如果這就是你所指的,這將是非常棒的。我該怎麼做? – nikUoM
這裏有一些有趣的討論:http://stats.stackexchange.com/questions/30303/how-to-simulate-data-that-satisfy-specific-constraints-such-as-having-specific-m –