2016-09-26 115 views
3

首先,我不能完全肯定,如果這是要發佈這個正確的地方,或許應該在更多的統計數據爲中心的論壇去。然而,正如我打算用R實現這一點,我認爲這是最好的張貼在這裏。如果我錯了,請道歉。的R - 模擬從內核密度獲得的概率密度分佈數據估算

所以,我想要做的是以下。我想模擬總共250.000個觀測值的數據,根據經驗數據(離散值)導出的核密度估計值分配一個連續(非整數)值,原始值範圍從-5到+5。這是我想要使用的分佈圖。

enter image description here

這是很重要的,我認爲我不模擬基於離散概率的新數據,而是不斷的人,因爲它是一個值,可以說2.89,而不是3或2真的很重要。因此,新值將根據圖中描述的概率進行分配。模擬數據中最頻繁的值將在+2附近,而-4和+5附近的值很少。

我已經做了相當多的閱讀在R和有關密度估計如何內核工作模擬數據,但我真的不往前走的。所以我的問題基本上需要兩個步驟 - 我怎樣才能模擬數據(1)?此外,如何使用此特定概率分佈(2)模擬數據?

在此先感謝,我希望你們能幫助我與此有關。

+0

如果我理解你的問題,你可以使用Monte Carlo模擬。由於您的分佈是已知的,您可以使用該分佈的隨機抽樣來創建您的模擬數據。這聽起來像你想要做的? –

+0

嗨@LloydChristmas,謝謝你的回覆。事情是,分佈是已知的,但我不想使用實際的離散分佈模擬數據,而是使用內核中描述的連續分佈。如果這就是你所指的,這將是非常棒的。我該怎麼做? – nikUoM

+1

這裏有一些有趣的討論:http://stats.stackexchange.com/questions/30303/how-to-simulate-data-that-satisfy-specific-constraints-such-as-having-specific-m –

回答

5

隨着您的基礎離散數據,創建於細如你希望(網格內核密度估計即作爲根據需要爲您的應用程序(的機器精度和計算時間的範圍內,當然是「接近連續」 ))。然後從該內核密度採樣,使用密度值確保您的分佈更可能的值更可能被採樣。例如:

假數據,只是有一些在這個例子中一起工作:

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) 

enter image description here

使用上述方法,您可以爲密度估計創建更精細的網格,但您仍然將密度值限制爲用於密度估計的網格點(即值爲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

+0

非常感謝。我會試試看看它有什麼作用。我會在稍後回覆我的結果。 – nikUoM

+0

親愛的@ eipi10 - 這工作。非常非常感謝你! – nikUoM