在“qbeta”中可能没有达到完全的精度
Posted
技术标签:
【中文标题】在“qbeta”中可能没有达到完全的精度【英文标题】:full precision may not have been achieved in 'qbeta' 【发布时间】:2013-06-08 19:36:54 【问题描述】:我在使用 Windows 7 Ultimate(Intel Core i5-2400 3GHz 处理器和 8.00GB 内存)的 PC 上运行 R 版本 2.14.0。如果需要其他规格,请告诉我。
我正在尝试模拟相关的 beta 分布式数据。我使用的方法是本文所写内容的扩展:
http://onlinelibrary.wiley.com/doi/10.1002/asmb.901/pdf
-
基本上,我首先模拟多元正态数据(使用 MASS 中的
mvrnorm()
函数)。
然后我使用pnorm()
对这些数据应用概率变换,这样我的新数据向量就存在于 (0,1) 上。并且根据前面的说法仍然是相关的。
然后给定这些概率转换数据,我应用具有特定 shape1 和 shape2 参数的qbeta()
函数,以获取具有特定均值和离散属性的相关 beta 数据。
我知道存在其他生成相关 beta 数据的方法。我对为什么qbeta()
导致此方法对于某些“种子”失败很感兴趣。以下是我收到的错误消息。
Warning message:
In qbeta(probit_y0, shape1 = a0, shape2 = b0) :
full precision may not have been achieved in 'qbeta'
这是什么意思?如何避免?当它确实发生在更大的模拟环境中时,确保此问题不会终止整个源(使用 source())模拟代码的最佳方法是什么?
我为 1:1000 的整数种子运行了以下代码。 Seed=899 是唯一给我带来问题的值。虽然如果它在这里有问题,它也不可避免地会对其他种子产生问题。
library(MASS)
set.seed(899)
n0 <- 25
n1 <- 25
a0 <- 0.25
b0 <- 4.75
a1 <- 0.25
b1 <- 4.75
varcov_mat <- matrix(rep(0.25,n0*n0),ncol=n0)
diag(varcov_mat) <- 1
y0 <- mvrnorm(1,mu=rep(0,n0),Sigma=varcov_mat)
y1 <- mvrnorm(1,mu=rep(0,n1),Sigma=varcov_mat)
probit_y0 <- pnorm(y0)
probit_y1 <- pnorm(y1)
beta_y0 <- qbeta(probit_y0, shape1=a0, shape2=b0)
beta_y1 <- qbeta(probit_y1, shape1=a1, shape2=b1)
上面的代码是一个更大的模拟项目的一个片段。但是 qbeta() 警告信息现在让我很头疼。
非常感谢该小组可以提供的任何帮助。
干杯 克里斯
【问题讨论】:
我没有收到 R 3.0.1 的警告。考虑更新 R。 R 2.15.1 上没有警告 谢谢@Roland。我下载了最新版本的 R 3.0.1(32 位)。我运行了与上面相同的代码...set.seed(216) 并得到相同的错误:警告消息:在 qbeta(probit_y1, shape1 = a1, shape2 = b1) 中:在 'qbeta' 中可能没有达到完全精度 我在 32 位 R 3.0.1 上遇到了同样的问题,但 64 位版本似乎没问题。除非您有一些挑剔的遗留代码,否则没有理由使用 32 位版本,因此切换会为您解决问题。 键入abs( pbeta(beta_y0, shape1=a0, shape2=b0) - probit_y0 )
进行检查。如果没有警告并且您获得的数字非常少,那么beta_v0
是正确的。
【参考方案1】:
错误的原因是用于计算 qbeta 的算法对于这些参数值没有收敛。
R 使用 AS 109 计算 qbeta(Cran,GW,KJ Martin 和 GE Thomas (1977)。备注 AS R19 和算法 AS 109,应用统计,26, 111–114,以及后续备注(AS83 和更正)。 )。 R 尝试计算 1000 次迭代中的值。如果它不能在 1000 次迭代中,您会收到您看到的错误消息。
这是qbeta的代码。
【讨论】:
以上是关于在“qbeta”中可能没有达到完全的精度的主要内容,如果未能解决你的问题,请参考以下文章
POJ 3181 Dollar Dayz ( 完全背包 && 大数高精度 )