if(randomNumber <= p){:需要TRUE / FALSE时缺少值的错误

时间:2019-12-29 06:58:22

标签: r function loops if-statement

在R中运行此程序时遇到问题。 有人帮我解决这个问题吗??

par_1<-cbind(c(5.038159),c(3.899621))
par_2<-cbind(c(2.435457),c(13.89517))
tau<-365

  cdf2 <- function(x, help) {
    pgamma(x, shape=par_1[1], scale=par_1[2]) *
      pgamma(x, shape=par_2[1], scale=par_2[2])-help
  }

nextEventTime <- function(censoring) {
    randomNumber <- runif(n=1, min=0, max=1)
    pnew <- randomNumber * (1 - cdf2(censoring, 0)) + cdf2(censoring, 0)
    uniroot(f=cdf2, interval=c(0, 1000*tau), help=pnew)$root
  }
 hazardRate1 <- function(t) {
    dgamma(t, shape=par_1[1], scale=par_1[2]) /
      (1 - pgamma(t, shape=par_1[1], scale=par_1[2]))
  }
  hazardRate2 <- function(t) {
    dgamma(t, shape=par_2[1], scale=par_2[2]) /
      (1 - pgamma(t,shape=par_2[1], scale=par_2[2]))
  }
  nextEventType <- function(t) {
    p <- hazardRate1(t)/(hazardRate1(t)+hazardRate2(t))
    randomNumber <- runif(n=1, min=0, max=1)
    if (randomNumber <= p) {1} else {2}
    }


baris<-c(1:20000)
nexteventtime<-rep(0,time=20000)
nexteventype<-rep(0,time=20000)
dfnexteventime<-data.frame(baris,nexteventtime,nexteventype)
for(i in 1:nrow(dfnexteventime)){
dfnexteventime$nexteventtime[i]<-nextEventTime(dfnexteventime$nexteventtime[i])
dfnexteventime$nexteventype[i]<-nextEventType(dfnexteventime$nexteventtime[i])
}
View(dfnexteventime)

当我运行该程序时,该程序将出错并产生如下输出

Error in if (randomNumber <= p) { : missing value where TRUE/FALSE needed

我认为这个问题是因为nextEventType(t)函数中的t值不能为零(t!= 0)。 但是nextEventTime(dfnexteventime$nexteventtime[i])永远不会产生零值,当我运行这部分10次时,

baris<-c(1:20000)
nexteventtime<-rep(0,time=20000)
nexteventype<-rep(0,time=20000)
dfnexteventime<-data.frame(baris,nexteventtime,nexteventype)
for(i in 1:nrow(dfnexteventime)){
dfnexteventime$nexteventtime[i]<-nextEventTime(dfnexteventime$nexteventtime[i])
}

没有nextEventType函数。这部分永远不会产生0值。 所以,我感到困惑,这是什么问题?。

我希望结果nextEventType(t)产生非零值。 因为如果使用零值将是Error in if(ramdonNumber <= p) { :...

1 个答案:

答案 0 :(得分:1)

您的问题不是将nextEventType(t)调用为零,因为这永远不会发生。但是,每当nextEventType(t)的值大于195的情况下调用t时,都会发生相同的错误。这时,项pgamma(t, shape=par_1[1], scale=par_1[2])非常接近以至于R评估{{1} }归零,因此1 - pgamma(t, shape=par_1[1], scale=par_1[2])返回hazardRate1(t)。由于Inf试图将nextEventType(t)分配给p,因此从未定义Inf/Inf

p

这只会在非常极端的情况下发生,当您碰巧在> p <- hazardRate1(196)/(hazardRate1(196) + hazardRate2(196)) > p [1] NaN 中抽奖> 195时,每30,000次随机抽奖仅发生一次。这就是为什么您在运行10次后看不到它,但是却经常在运行20,000次时看到它。

nextEventTime(t)