How to use mhsample or slicesample with ksdensity?
10 views (last 30 days)
Show older comments
How can I set up the arguments for mhsample and/or slicesample so I can draw samples from a probability density function estimated using ksdensity? I have been unable to create a function handle for the target distribution "pdf" so that it will work with mhsample or slicesample. I want to use ksdensity to estimate a pdf, then draw samples from that pdf/distribution. The function handle "pdf" takes only one argument, but ksdensity requires two or more. Please advise me.
1 Comment
Answers (1)
Tom Lane
on 19 Sep 2012
Suppose you have data "mydata" and you want to base the ksdensity on that:
mydata = [randn(100,1); 6+randn(150,1)];
a1 = subplot(3,1,1);
[f,x,w] = ksdensity(mydata);
plot(x,f)
Then you can set up a pdf function that computes the density based on the sample in mydata, but at specified x values, and provide that to slicesample:
N = 1000;
mypdf = @(x) ksdensity(mydata,x);
tic, y = slicesample(5,N,'pdf',mypdf); toc
a2 = subplot(3,1,2);
ksdensity(y)
But I don't recommend doing that. The plain version of ksdensity is a mixture of little normal distributions with a specific width, centered at each data value. It's easier to just sample from that directly. Pick data values at random, add random noise, and you get the results much faster than you would by applying slicesample to a ksdensity-based density estimate.
tic
i = randi(length(mydata),N,1);
noise = w*randn(N,1);
z = mydata(i) + noise;
toc
a3 = subplot(3,1,3);
ksdensity(z)
set([a1 a2 a3],'XLim',[-10 15])
My tic/toc values were 10.634902 seconds vs. 0.001418 seconds.
0 Comments
See Also
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!