【问题标题】:Simulate a strange distribution in R在 R 中模拟一个奇怪的分布
【发布时间】:2021-11-09 22:15:51
【问题描述】:

大家好,我正在尝试模拟如下所示的数据:

有人知道我会怎么做吗?

【问题讨论】:

  • 你知道最低的箱子应该是什么样子吗?它们都完全为零,还是散布在垃圾箱中?
  • 我们现在有三个不同的答案,所以看看 OP 对分布的了解会很有趣。我猜还没有可用于混合物的参数吗?那么问题是 (1) 经验数据是已知的 还是 (2) 任务是否只是通过反复试验来创建 类似的定性模式

标签: r histogram simulation


【解决方案1】:

这可以被视为一个经典问题,将runif 生成的均匀随机数与经验相对频率的逆变换进行转换。这是一种使用近似值的方法:

freq <- c(0.39, 0.02, 0.15, 0.18, 0.12, 0.09,0.04, 0.01)
sum(freq) # This is a check. The sum must be 1.0.

r_empirical <- function(n, freq) {
  approx(c(0, cumsum(freq)), 0:(length(freq)),
         runif(n), method="constant", f=0)$y
}

x <- r_empirical(1000, freq)

hist(x, breaks=0:length(freq))

下图演示了基本原理。楼梯显示了累积分布,红色箭头显示了如何转换均匀的随机数:

【讨论】:

  • 我想sample(0:(length(freq)-1), n, prob=freq, TRUE) 可以用于这个例子,但没那么有趣。
  • @user20650:同意,这在离散情况下确实有效。谢谢。
【解决方案2】:

您还可以使用两个 beta 发行版。

Beta 版是一个非常有用的发行版。

beta<-c(rbeta(600, 0.1, 5, ncp = 0),rbeta(1200, 3, 4, ncp = 1))

hist(beta,breaks=30,probability = T)

【讨论】:

  • 也可以使用其他混合物,例如一个指数和一个正常的。但随之而来的问题是如何估计参数。这当然是可能的(参见here),但接下来的问题是推导参数。
【解决方案3】:

零膨胀对数法线? (对于 Tobit 来说,0 处的峰值看起来有点太大了,即审查了 Normal,负面的东西堆积在零上)

zero_prob <- 0.25
meanlog <- log(20)
sdlog <- 0.4 ## SD ~ 40%

n <- 500
rzilnorm <- function(n, pz, meanlog, sdlog) {
   ifelse(runif(n) < pz, 0,
          rlnorm(n, meanlog, sdlog))
}
set.seed(101)
hist(rzilnorm(n=500, zero_prob, meanlog, sdlog), col = "gray", breaks=25, freq=FALSE)

我的第一次尝试是使用n=100pz=0.2;如果我要多玩这个,我可能会增加sdlog 一点点。否则这看起来很接近?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-29
    • 2023-01-10
    • 1970-01-01
    • 2013-12-27
    • 2015-09-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多