如何从非同一分布的伯努利随机变量进行矢量抽样?

时间:2017-01-25 03:56:03

标签: r random probability

给出一系列独立但不完全相同的伯努利试验,其中载体给出成功概率,例如:

x <- seq(0, 50, 0.1)
prob <- - x*(x - 50)/1000 # trial probabilities for trials 1 to 501

从每次试验获得随机变量的最有效方法是什么?我假设矢量化是要走的路。

我知道两个函数给伯努利随机变量:

    来自包rbernoulli
  1. purr,它不接受成功概率向量作为输入。在这种情况下,可以将函数包装在apply类型的操作中。
  2. 带有参数rbinom
  3. size = 1给出了伯努利随机变量。它还接受概率向量,以便:

    rbinom(n = length(prob), size = 1, prob = prob)

  4. 给出一个正确长度的输出。但是,我并不完全确定这实际上是我想要的。帮助文件?rbinom中似乎相关的位是:

      

    对于rbinom,结果的长度由n确定,并且是   另一个的数值参数的最大长度   功能

         

    除了n之外的数字参数被循环到长度   结果。只使用逻辑参数的第一个元素。

    但是,n是一个没有默认值的参数,所以我不确定第一句话是什么意思。我认为第二句话意味着我得到了我想要的东西,因为只有size = 1才能被回收。但是this thread似乎表明此方法不起作用。

    这个blog post也提供了一些其他方法。一位评论员使用rbinom提到了我的建议。

2 个答案:

答案 0 :(得分:2)

测试rbinom的另一种方法是为prob进行矢量化,利用N个bernoulli随机变量之和为分母N的二项式随机变量:

x <- seq(0, 50, 0.1)
prob <- -x*(x - 50)/1000

n <- rbinom(prob, size=1000, prob)

par(mfrow=c(1, 2))
plot(prob ~ x)
plot(n ~ x)

enter image description here

答案 1 :(得分:1)

如果您不相信互联网上的随机陌生人而且不懂文档,也许您可​​以通过测试来说服自己。只需设置随机种子即可获得可重现的结果:

public function actionUpload()
{
    $model = new UploadForm();

    if (Yii::$app->request->isPost) {
        $model->imageFile = UploadedFile::getInstance($model, 'imageFile');
        if ($model->upload()) {
            // file is uploaded successfully
            return;
        }
    }

    return $this->render('upload', ['model' => $model]);
}


class UploadForm extends Model
{
    /**
     * @var UploadedFile
     */
    public $imageFile;

    public function rules()
    {
        return [
            [['imageFile'], 'file', 'skipOnEmpty' => false, 'extensions' => 'png, jpg'],
        ];
    }

    public function upload()
    {
        if ($this->validate()) {
            $this->imageFile->saveAs('uploads/' . $this->imageFile->baseName . '.' . $this->imageFile->extension);
            return true;
        } else {
            return false;
        }
    }
}