了解有关逆变换采样R的代码

时间:2019-03-24 20:47:30

标签: r statistics simulation uniform-distribution

我试图理解以下有关逆变换采样的代码(离散示例)

    discrete.inv.transform.sample <- function( p.vec ) {
  U  <- runif(1)
  if(U <= p.vec[1]){
    return(1)
  }
  for(state in 2:length(p.vec)) {
    if(sum(p.vec[1:(state-1)]) < U && U <= sum(p.vec[1:state]) ) {
      return(state)
    }
  }
}

num.samples <- 1000
p.vec        <- c(0.1, 0.4, 0.2, 0.3)
names(p.vec) <- 1:4
samples     <- numeric(num.samples)
for(i in seq_len(num.samples) ) {
  samples[i] <- discrete.inv.transform.sample(p.vec)
}
barplot(p.vec, main='True Probability Mass Function')

我的第一个问题是在第一部分discrete.inv.transform.sample(p.vec)中的函数return(1)中,返回时该1值在哪里?

在第二部分中,return(state)分配在哪里state

  • 为什么names(p.vec)<-1:4这行是?

  • seq_len是什么意思?

  • 为什么在代码中不再使用samples[i]

我认为应该有一个独立的行sample

有人可以解释吗?

提前谢谢

1 个答案:

答案 0 :(得分:2)

看起来您通常需要对R和编程进行一些基础研究。这是您简单问题的简短答案,但请稍后再阅读以获取更广泛的建议。

  • 返回时,1值在哪里?无论分配到哪里。在这里,即在samples[i]中到达该分支的i中的任何一个。
  • state在哪里分配?在for(state in 2:length(p.vec))
  • 行中
  • names(p.vec)<-1:4行为何用于?好问题。 names()<-只是为对象分配名称,我不确定在您的上下文中为什么具有等于矢量索引的名称很有用,尽管我可以想象在某些情况下也是这样。
  • seq_len是什么意思? seq_len(x)创建一个整数向量,其中包含1x之间的所有数字。参见help("seq_len")
  • 为什么在代码中不再使用samples[i]?因为它仅在for循环中有用。

所有这些都指向一个更大的问题:您不了解R的基础知识。我们都是从这里开始的,但这意味着您需要阅读一些基本信息并通读一些基础教程。 RStudio提供了一些学习here的资源。