我正在使用不同的采样函数,我想知道为什么这两个公式不能给出相同的结果

n=2
set.seed(1)
rweibull(n,shape = 1,scale = 1)
# [1] 1.3261078 0.9885284
set.seed(1)
rexp(n,rate = 1)
# [1] 0.7551818 1.1816428

当这是等价的:

x <- c(0, rlnorm(50))
all.equal(dweibull(x, shape = 1), dexp(x))

是逆变换抽样的问题吗?

若有,原因为何?

谢谢,

推荐答案

首先,d*表示密度函数,它是确定性的,这就是为什么您可以在以下代码中获得相同的结果

x <- c(0, rlnorm(50))
all.equal(dweibull(x, shape = 1), dexp(x)

但是,r*会提供给定分布的随机样本,这取决于随机性是如何触发的.

  • 百人组
#include "nmath.h"

double rweibull(double shape, double scale)
{
    if (!R_FINITE(shape) || !R_FINITE(scale) || shape <= 0. || scale <= 0.) {
    if(scale == 0.) return 0.;
    /* else */
    ML_ERR_return_NAN;
    }

    return scale * pow(-log(unif_rand()), 1.0 / shape);
}
  • 百人组
#include "nmath.h"

double rexp(double scale)
{
    if (!R_FINITE(scale) || scale <= 0.0) {
    if(scale == 0.) return 0.;
    /* else */
    ML_ERR_return_NAN;
    }
    return scale * exp_rand(); // --> in ./sexp.c
}

其中,exp_rand()是用来产生指数随机变量的,它不是简单地与rweibull.c中的pow(-log(unif_rand()), 1.0 / shape)相同,而是更复杂,如下所示

#include "nmath.h"

double exp_rand(void)
{
    /* q[k-1] = sum(log(2)^k / k!)  k=1,..,n, */
    /* The highest n (here 16) is determined by q[n-1] = 1.0 */
    /* within standard precision */
    const static double q[] =
    {
    0.6931471805599453,
    0.9333736875190459,
    0.9888777961838675,
    0.9984959252914960,
    0.9998292811061389,
    0.9999833164100727,
    0.9999985691438767,
    0.9999998906925558,
    0.9999999924734159,
    0.9999999995283275,
    0.9999999999728814,
    0.9999999999985598,
    0.9999999999999289,
    0.9999999999999968,
    0.9999999999999999,
    1.0000000000000000
    };

    double a = 0.;
    double u = unif_rand();    /* precaution if u = 0 is ever returned */
    while(u <= 0. || u >= 1.) u = unif_rand();
    for (;;) {
    u += u;
    if (u > 1.)
        break;
    a += q[0];
    }
    u -= 1.;

    if (u <= q[0])
    return a + u;

    int i = 0;
    double ustar = unif_rand(), umin = ustar;
    do {
    ustar = unif_rand();
    if (umin > ustar)
        umin = ustar;
    i++;
    } while (u > q[i]);
    return a + umin * q[0];
}

R相关问答推荐

在特定列上滞后n行,同时扩展框架的长度

在R中创建一个包含转换和转换之间的时间的列

当两个图层映射到相同的美学时,隐藏一个图层的图例值

如何使用R对每组变量进行随机化?

用预测NLS处理R中生物学假设之上的误差传播

错误:非常长的R行中出现意外符号

如何优化向量的以下条件赋值?

使用整齐的计算(curl -curl )和杂音

在嵌套列表中查找元素路径的最佳方法

将一个字符串向量调整为与其他字符串向量完全相同的大小

QY数据的处理:如何定义QY因素的水平

我们如何在R中透视数据并在之后添加计算

如何将一个方阵分解成没有循环的立方体

根据r中另一个文本列中给定的范围对各列求和

如何判断代码是否在R Markdown(RMD)上下文中交互运行?

如何将EC50值绘制在R中的剂量-react 曲线上?

将数据从一列转换为按组累计计数的单个虚拟变量

排序R矩阵的行和列

将Geojson保存为R中的shapefile

向内存不足的数据帧添加唯一行