【问题标题】:calculating hazard function for the standard normal distribution计算标准正态分布的风险函数
【发布时间】:2016-09-15 11:43:41
【问题描述】:

基于Mathematica UUPDE database 中给出的公式 我已经在 R 中绘制了标准正态分布的风险函数。

在一定范围内似乎是正确的;数值较大时会出现数值问题,见附图。以下是完整的 R 代码。

任何 cmets 将不胜感激。

PDF = function(x) {  1/(sqrt(2*pi))*exp(-x^2/2) }
erf <- function(x) 2 * pnorm(x * sqrt(2)) - 1
erfc <- function(x) 2 * pnorm(x * sqrt(2), lower = FALSE)
CDF = function(x) {  1/2 * (1 + erf(x/(sqrt(2)))) }
HF = function(x) { sqrt(2/pi)/(exp(x^2/2)*(2-erfc(-x/sqrt(2)))) }
SF = function(x) { 1 - 1/2 *erfc(-x/sqrt(2)) }

par(mar=c(3,3,1.5,0.5), oma=c(0,0,0,0), mgp=c(2,1,0))
par(mfrow = c(2, 2))

x = seq(from = -4,to = 10,by = .001)

##### PDF
a = PDF(x)
plot(x,a,'l',main='',ylab="PDF",xlab="x")
grid(nx = NULL,ny = NULL,col = "grey",lty = "dotted",lwd = par("lwd"),equilogs = TRUE)

##### CDF
a = CDF(x)
plot(x,a,'l',main='',ylab="CDF",xlab="x")
grid(nx = NULL,ny = NULL,col = "grey",lty = "dotted",lwd = par("lwd"),equilogs = TRUE)

##### HF
a = HF(x)
plot(x,a,'l',main='',ylab="HF",xlab="x")
grid(nx = NULL,ny = NULL,col = "grey",lty = "dotted",lwd = par("lwd"),equilogs = TRUE)

##### SF
a = SF(x)
plot(x,a,'l',main='',ylab="SF",xlab="x")
grid(nx = NULL,ny = NULL,col = "grey",lty = "dotted",lwd = par("lwd"),equilogs = TRUE)

【问题讨论】:

  • 您的问题是什么?您需要任意精度还是只对特定范围感兴趣?
  • 旁注:有趣的是您选择使用内置的普通 cdf 函数来获取 erf 函数,然后使用它来烘焙您自己的 cdf 函数。
  • @Roland 我只是对正确的风险函数图感兴趣,想知道哪里出了问题
  • @Dason,不可否认,在我这边使用 R 是一种非常低效的方式。

标签: r normal-distribution hazard


【解决方案1】:

风险函数是密度函数除以幸存者函数。您的代码的问题在于您从表面上理解了这个定义并进行了简单的除法运算;当分子和分母都是非常小的值(大约 1e-300)时,这发生在分布的尾部,这个操作在数值上变得不稳定。对于这类问题,更合适的解决方案是计算分子和分母的对数(它们是中等大小的负数,而不是微小的数字),从对数中减去对数分母-分子,然后取幂。

R 提供了您进行此计算所需的所有部分。您可以通过pnorm(x,lower=FALSE)获取幸存者功能;您可以分别在dnorm()pnorm() 中使用log=TRUElog.p=TRUE 来获得对数尺度上的密度和幸存者函数。所以:

HF <- function(x) {
   exp(dnorm(x,log=TRUE)-pnorm(x,lower=FALSE,log.p=TRUE))
}
curve(HF,from=-4,to=10)

如果对数密度和对数幸存函数可用,则此策略可以推广到计算任何分布的风险函数(通常对于分布 foo R 提供密度函数 dfoo 和 CDF pfoo可以在上面代替)。

【讨论】:

  • 谢谢,非常有用的 cmets!
  • 虽然这种情绪受到赞赏,但 * 弃用了 using comments to say "thank you";如果此答案有用,您可以投票(如果您有足够的声誉),并且无论如何如果它令人满意地回答了您的问题,我们鼓励您单击复选标记以接受它。
最近更新 更多