【问题标题】:Vectorised R functions向量化的 R 函数
【发布时间】:2015-10-19 19:32:18
【问题描述】:

如下所示的ab 是相同的数量,但在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

它们应该是相同的。但他们显然不是。为什么?

【问题讨论】:

  • 检查((2:99)/100) - seq(0.02, 0.99, by=0.01)
  • @Pascal 它们与 e-17 的差异非常接近。但是你会看到a-b 的一些条目是0.3。这正常吗?顺便问一下,哪种方法更好?
  • 杂项:为什么这些数字不相等
  • OP 没有评论订单 e-16 等的微小差异。他们评论的是订单 e-1 上的一些不同点:索引 13、28、56、57。跨度>
  • @20824 你知道的,你可以自己尝试所有这些东西..

标签: r


【解决方案1】:

问题是您在这一行中按数字 alpha*100 进行索引:

OS.mean.theta0.100[alpha*100]

floating point error 导致seq(0.02, 0.99, by=0.01) 甚至小于2:99 中的相应整数时,您最终会从theta0.100 中提取错误的数字。例如,参见:

x <- 1:10
x[5]
# [1] 5
x[6]
# [1] 6
x[5.99999999]
# [1] 5

一种快速的解决方案是将alpha*100 更改为round(alpha*100),如下所示,以确保您始终选择最接近的整数。

Bias.MOP <- function(shape, scale, alpha){
  scale*shape*OS.mean.theta0.100[round(alpha*100)]/(1-(1-alpha)^shape) - scale
}

【讨论】:

  • 谢谢。但是仍然没有修改我的功能,为什么b[13]Bias.MOP(theta0[1], theta0[2], 0.14)如此不同,好吗?它们应该是正确或错误的。对吗?
  • @20824 因为floating point error。试试.14 - seq(0.02, 0.99, by=0.01)[13]。您会期望它为 0,但事实并非如此。因此,OS.mean.theta0.100[alpha*100] 在这两个 alpha 中的选择会有所不同。
  • 是的。我知道了。再次感谢。其他软件在处理这类事情上是否比 R 更好。比如 Python 之类的?
  • @20824 No. 浮点错误为universalacrosslanguages。处理它的一种方法(除了意识到它)是不要在索引或等式中直接使用浮点计算的结果
  • @20824 例如,您可以将函数组织为scale*shape*OS.mean.theta0.100[alpha]/(1-(1-alpha / 100)^shape) - scale,然后将其传递给2:99。那会很完美。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-13
  • 2018-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多