कस्टम वितरण से यादृच्छिक नमूने उत्पन्न करना


16

मैं R. My pdf का उपयोग कर एक कस्टम पीडीएफ से यादृच्छिक नमूने उत्पन्न करने की कोशिश कर रहा हूं:

fX(x)=32(1x2),0x1

मैंने समान नमूने तैयार किए और फिर इसे अपने कस्टम वितरण में बदलने की कोशिश की। मैंने अपने वितरण ( FX(x) ) के सीएफडी को ढूंढकर और इसे यूनिफ़ॉर्म सैंपल ( u ) पर सेट करके और लिए हल करके किया x

FX(x)=Pr[Xx]=0x32(1y2)dy=32(xx33)

उपरोक्त वितरण के साथ एक यादृच्छिक नमूना उत्पन्न करने के लिए, एक समान नमूना प्राप्त करें और x के लिए in \ frac {3} {2} (x - \ frac {x ^ 3} {3}) = हल करें यूu[0,1]x

32(xx33)=u

मैंने इसे लागू किया Rऔर मुझे अपेक्षित वितरण नहीं मिला। क्या कोई मेरी समझ में दोष को इंगित कर सकता है?

nsamples <- 1000;
x <- runif(nsamples);

f <- function(x, u) { 
  return(3/2*(x-x^3/3) - u);
}

z <- c();
for (i in 1:nsamples) {
  # find the root within (0,1) 
  r <- uniroot(f, c(0,1), tol = 0.0001, u = x[i])$root;
  z <- c(z, r);
}

1
कोडिंग की गलती होनी चाहिए। मैं R का उपयोग नहीं करता हूं, इसलिए मैं यह नहीं कह सकता कि गलती क्या है - लेकिन मैंने सिर्फ आपके समाधान को कोडित किया है (क्यूबिक बहुपद के मध्य मूल को ध्यान में रखते हुए, जो हमेशा 0 और 1 के बीच स्थित है), और मुझे नमूनों और अपेक्षित वितरण के बीच अच्छा समझौता है। यह आपके रूट खोजक के साथ एक समस्या हो सकती है? आपके द्वारा लिए जा रहे नमूनों में क्या गलत है?
२१:

मैंने आपके कोड की कोशिश की (जो बहुत कुशल नहीं है, वैसे) और अपेक्षित वितरण प्राप्त करें।
ऐको जूल

@jpillow और @Aniko मेरी गलती है। जब मैंने इसका इस्तेमाल किया तो nsamples <- 1e6यह एक अच्छा मैच था।
आनंद

2
@Anand एक तरीका यह है कि का निरीक्षण करें , जिससे की प्रत्यक्ष गणना संदर्भ में की जा सके । x=2sin(arcsin(u)/3)xu
whuber

जवाबों:


11

ऐसा लगता है कि आपने यह पता लगा लिया है कि आपका कोड काम करता है, लेकिन @Aniko ने बताया कि आप इसकी दक्षता में सुधार कर सकते हैं। आपकी सबसे बड़ी गति का लाभ संभवतः पूर्व-आवंटित मेमोरी से आएगा zताकि आप इसे लूप के अंदर नहीं बढ़ा रहे हैं। कुछ इस तरह से z <- rep(NA, nsamples)करना चाहिए ट्रिक आपको vapply()एक स्पष्ट लूप के बजाय (जो लौटे हुए वैरिएबल प्रकार को निर्दिष्ट करता है) उपयोग करने से एक छोटी गति प्राप्त हो सकती है ( लागू परिवार पर एक महान एसओ सवाल है)।

> nsamples <- 1E5
> x <- runif(nsamples)
> f <- function(x, u) 1.5 * (x - (x^3) / 3) - u
> z <- c()
> 
> # original version
> system.time({
+ for (i in 1:nsamples) {
+   # find the root within (0,1) 
+   r <- uniroot(f, c(0,1), tol = 0.0001, u = x[i])$root
+   z <- c(z, r)
+ }
+ })
   user  system elapsed 
  49.88    0.00   50.54 
> 
> # original version with pre-allocation
> z.pre <- rep(NA, nsamples)
> system.time({
+ for (i in 1:nsamples) {
+   # find the root within (0,1) 
+   z.pre[i] <- uniroot(f, c(0,1), tol = 0.0001, u = x[i])$root
+   }
+ })
   user  system elapsed 
   7.55    0.01    7.78 
> 
> 
> 
> # my version with sapply
> my.uniroot <- function(x) uniroot(f, c(0, 1), tol = 0.0001, u = x)$root
> system.time({
+   r <- vapply(x, my.uniroot, numeric(1))
+ })
   user  system elapsed 
   6.61    0.02    6.74 
> 
> # same results
> head(z)
[1] 0.7803198 0.2860108 0.5153724 0.2479611 0.3451658 0.4682738
> head(z.pre)
[1] 0.7803198 0.2860108 0.5153724 0.2479611 0.3451658 0.4682738
> head(r)
[1] 0.7803198 0.2860108 0.5153724 0.2479611 0.3451658 0.4682738

और आपको ;प्रत्येक पंक्ति के अंत में ज़रूरत नहीं है (क्या आप MATLAB कन्वर्ट हैं?)।


आपके विस्तृत उत्तर के लिए और इंगित करने के लिए धन्यवाद vapply। मैं C/C++बहुत लम्बे समय से कोडिंग कर रहा हूँ और यही कारण है कि ;दुःख होता है!
आनंद

1
uniroot107
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.