-2

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

    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

有人可以解释一下吗?

先感谢您

4

1 回答 1

3

看起来您需要对 R 和一般编程进行一些基础研究。以下是对您的简单问题的简短回答,但请继续阅读以获取更广泛的建议。

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

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

于 2019-03-24T21:23:41.473 回答