所以我使用了''精算器''在R中打包以对连续的gamma cdf进行离散化,返回概率质量函数。
试图将我生成的概率质量函数转换为累积分布函数:
disc.gamma.cdf <- function(y)
{
values <- discretize(pgamma(x, 20, 0.2),
from = 0, to = 300, method = "rounding")
result <- sum(values[0:y])
return(result)
}
但是当我想在一定范围的值上对discrete.gamma.cdf求和时,我返回时出现错误:
i <- 0:4
sum(disc.gamma.cdf(i))
Warning message:
In 0:y : numerical expression has 5 elements: only the first used
R不太好,所以任何帮助都会受到赞赏。
答案 0 :(得分:0)
你几乎是对的。要记住的主要事情是R数组索引从1开始,并且函数不会自动在数组上工作,它必须被矢量化。
因此,通过两次更改,您的代码是正确的:
disc.gamma.cdf <- function(y)
{
values <- discretize(pgamma(x, 20, 0.2),
from = 0, to = 300, method = "rounding")
result <- sum(values[1:y]) # From 1 not 0
return(result)
}
i <- 1:5
sum( sapply(i, disc.gamma.cdf) )
sapply(i, disc.gamma.cdf)
调用i的每个元素的函数,然后你总结它。
如果您需要代码的矢量化版本,可以执行以下操作:
disc.gamma.cdf <- function(y)
{
values <- discretize(pgamma(x, 20, 0.2),
from = 0, to = 300, method = "rounding")
cumsum(values)[y] # last expression is returned anyway
}
i <- 1:5
sum( disc.gamma.cdf(i) )
函数cumsum
计算所有可能的总和,现在您可以通过向量对其进行子集化。