我想对使用while循环的函数进行矢量化。
原始功能是
getParamsLeadtime <- function(leadtimeMean, in_tolerance, tolerance){
searchShape=0
quantil=0
# iterates the parameters until the percentage of values is within the interval of tolerance
while (quantil < in_tolerance){
searchShape = searchShape+1
quantil <- pgamma(leadtimeMean+tolerance,shape=searchShape,rate=searchShape/leadtimeMean) -
pgamma(leadtimeMean-tolerance,shape=searchShape,rate=searchShape/leadtimeMean)
}
leadtimeShape <- searchShape
leadtimeRate <- searchShape/leadtimeMean
return(c(leadtimeShape, leadtimeRate))
}
我希望对此函数进行矢量化调用,以将其应用于数据框。目前我正在循环使用它:
leadtimes <- data.frame()
for (a in seq(92:103)) {
leadtimes <- rbind(leadtimes, getParamsLeadtime(a, .85,2))
}
当我试图对该函数进行矢量化时,while似乎并不接受向量作为条件。发生以下警告:
Warning message:
In while (input["U"] < rep(tolerance, dim(input)[1])) { :
the condition has length > 1 and only the first element will be used
这让我想到虽然不喜欢矢量。你能告诉我如何对这个函数进行矢量化吗?
在旁注中,我想知道为什么生成的leadtimes-data.frame的列名显示为值:
> leadtimes
X1 X1.1
1 1 1.000000
2 1 0.500000
3 4 1.333333
4 8 2.000000
5 13 2.600000
6 19 3.166667
7 25 3.571429
8 33 4.125000
9 42 4.666667
10 52 5.200000
11 63 5.727273
12 74 6.166667
答案 0 :(得分:0)
这是一个非常高效的选项。
我们通过足够大的pgamma
序列,针对+tol
和-tol
案例,针对给定的平均提前期,shp
计算in_tol
。我们计算(矢量化)差异,并与in_tol
进行比较。向量的第一个元素(大于shp
)的索引(减1,因为我们开始我们的序列为0)是导致pgamma大于{{in_tol
的最低值f <- function(lead, in_tol, tol) {
shp <- which(!(pgamma(lead + tol, 0:10000, (0:10000)/lead) -
pgamma(lead - tol, 0:10000, (0:10000)/lead))
< in_tol)[1] - 1
rate <- shp/lead
c(shp, rate)
}
。 1}}。
sapply
然后我们可以在一系列平均交付周期内t(sapply(1:12, f, 0.85, 2))
## [,1] [,2]
## [1,] 1 1.000000
## [2,] 1 0.500000
## [3,] 4 1.333333
## [4,] 8 2.000000
## [5,] 13 2.600000
## [6,] 19 3.166667
## [7,] 25 3.571429
## [8,] 33 4.125000
## [9,] 42 4.666667
## [10,] 52 5.200000
## [11,] 63 5.727273
## [12,] 74 6.166667
system.time(leadtimes <- sapply(1:103, f, 0.85, 2))
## user system elapsed
## 1.28 0.00 1.30
。
NA
你只需要确保为形状参数选择合理的上限(这里我选择了10000,这比慷慨更多)。请注意,如果您不选择足够高的上限,则某些返回值将为{{1}}。