在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) { :...
答案 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)