计算R中20面骰子的pmf和cdf

时间:2014-10-08 18:11:30

标签: r statistics

我想创建两个函数来计算20个骰子的概率质量函数(pmf)和累积分布函数(cdf)。

在函数中我将使用一个参数,y用于侧面(从1到20)。我应该能够放置一个向量,它将返回每个变量的值。

如果输入的值是非离散的,那么它应该在结果中返回零并发出警告消息。

这是迄今为止PMF所解决的问题:

PMF= function(side) {

  a = NULL   

  for (i in side)
  {
    a= dbinom(1, size=1, prob=1/20)
    print(a)
  }

}

这就是我为CDF所得到的:

CDF= function(side) {
  a = NULL   
  for (i in side)
  {
    a= pnorm(side)
    print(a)
  }

}

我目前停留在警告消息和结果中的零。我如何在命令行中为该功能提供帮助?

接下来,如何在特定区间(例如1,12)的同一图上绘制这两个函数?

我是否使用正确的函数来计算cdf和pmf?

1 个答案:

答案 0 :(得分:0)

我建议采用以下简化方法:

PMF <- function(side) {
   x <- rep(0.05, length(side))
   bad_sides <- ! side %in% 1:20 # sides that aren't in 1:20 are bad
   x[bad_sides] <- 0             # set bad sides to 0
   # warnings use the warning() function. See ?warning for details
   if (any(bad_sides)) warning("Sides not integers between 1 and 20 have 0 probability!")
   # print results is probably not what you want, we'll return them instead.
   return(x)
}

对于CDF,我假设你的意思是滚动一个小于或等于给定边的数字的概率,即side / 20。 (pnorm是错误的功能......它给正常分布的CDF。)

CDF <- function(side) {
    return(pmin(1, pmax(0, floor(side) / 20)))
}

从技术上讲,CDF是针对非整数值定义的。 1.2的CDF与CDF的1相同,所以我在这里使用floor。如果你想让它更强大,可以让它min(1, floor(side) / 20)确保它不超过1,同样地max()为0,以确保它不是负数。或者你可以尝试不给它超过20的负值或值。

绘图:

my_interval <- 1:12
plot(range(my_interval), c(0, 1), type = "n")
points(my_interval, PMF(my_interval))
lines(my_interval, CDF(my_interval), type = "s")