如下所示的a
和b
是相同的数量,但在R中以两种不同的方式计算。它们大多相同但有几个很大的差异。我无法弄清楚为什么会这样。
theta0 <- c(-0.4, 10)
OS.mean <- function(shape, rank, n=100){
term1 <- factorial(n)/(factorial(rank-1)*factorial(n-rank))
term2 <- beta(n-rank+1, rank) - beta(n-rank+shape+1, rank)
term1*term2/shape
}
OS.mean.theta0.100 <- OS.mean(theta0[1], rank=seq(1, 100, by=1))
Bias.MOP <- function(shape, scale, alpha){
scale*shape*OS.mean.theta0.100[alpha*100]/(1-(1-alpha)^shape) - scale
}
a <- rep(0, 98)
for(i in 2:99){
a[i-1] <- Bias.MOP(theta0[1], theta0[2], i/100)
}
plot(a)
b <- Bias.MOP(theta0[1], theta0[2], seq(0.02, 0.99, by=0.01))
plot(b)
a-b
另一个奇怪的事情如下。
b[13] # -0.8185083
Bias.MOP(theta0[1], theta0[2], 0.14) # -0.03333929
他们应该是一样的。但他们显然不是。为什么呢?
答案 0 :(得分:5)
问题是您要使用此行中的数字alpha*100
进行索引:
OS.mean.theta0.100[alpha*100]
当floating point error导致seq(0.02, 0.99, by=0.01)
甚至稍微小于2:99
中的相应整数时,您最终会从{{1}中提取错误的数字}。例如,请参阅:
theta0.100
快速解决方案是将x <- 1:10
x[5]
# [1] 5
x[6]
# [1] 6
x[5.99999999]
# [1] 5
更改为alpha*100
,如下所示,以确保您始终选择最近的整数。
round(alpha*100)