【问题标题】:Error in if (randomNumber <= p) { : missing value where TRUE/FALSE neededif (randomNumber <= p) { 中的错误:需要 TRUE/FALSE 的缺失值
【发布时间】:2019-12-29 21:17:30
【问题描述】:

我在 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 &lt;= p) { :...

【问题讨论】:

  • 请编辑您的问题以包含一个最小但可重现的示例,即仅提供重现问题所必需且足够的详细信息。目前的问题有点宽泛,因为它需要一个人浏览整个代码。

标签: r function loops if-statement


【解决方案1】:

您的问题不是在零上调用nextEventType(t),因为这永远不会发生。但是,每当nextEventType(t) 的值大于 195 时,都会发生相同的错误。此时,术语 pgamma(t, shape=par_1[1], scale=par_1[2]) 非常接近 R 计算 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

这只会发生在非常极端的情况下,当您碰巧在nextEventTime(t) 中抽取 > 195 时,这种情况只会在 30,000 次随机抽取中发生一次。这就是为什么运行 10 次时看不到它,但运行 20,000 次时通常会看到。

random_draws <- numeric()
for(i in 1:1000000) random_draws[i] <- nextEventTime(0)
length(which(random_draws > 195))
# > [1] 28

【讨论】:

    猜你喜欢
    • 2016-07-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-27
    • 1970-01-01
    • 2021-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多