R函数loglik()返回-inf?

R函数loglik()返回-inf?,r,function,simulation,modeling,R,Function,Simulation,Modeling,在R中模拟SIR模型。我有一个数据集,我正试图用该模型精确绘制。我现在用的是粒子滤波函数,然后想用相应的logLik方法对结果进行处理。当我这样做时,我得到[1]-Inf作为结果。我在文档中找不到这是为什么以及如何避免它。我的模型参数是否不够精确?还有什么不对劲吗 我的函数如下所示: SIRsim%>% pfilterNp=5000->pf 洛格利克夫 从一个在线课程名为“盛宴的可能性”中,这是本课程的R脚本。但是,代码在这里工作。。。我不知道如何用它重现我的具体问题,不幸的是,我无法共享我正在

在R中模拟SIR模型。我有一个数据集,我正试图用该模型精确绘制。我现在用的是粒子滤波函数,然后想用相应的logLik方法对结果进行处理。当我这样做时,我得到[1]-Inf作为结果。我在文档中找不到这是为什么以及如何避免它。我的模型参数是否不够精确?还有什么不对劲吗

我的函数如下所示: SIRsim%>% pfilterNp=5000->pf 洛格利克夫

从一个在线课程名为“盛宴的可能性”中,这是本课程的R脚本。但是,代码在这里工作。。。我不知道如何用它重现我的具体问题,不幸的是,我无法共享我正在使用的数据集或代码,因为它是用于学术研究的

library(tidyverse)
library(pomp)
options(stringsAsFactors=FALSE)
stopifnot(packageVersion("pomp")>="3.0")
set.seed(1350254336)

library(tidyverse)
library(pomp)

sir_step <- Csnippet("
double dN_SI = rbinom(S,1-exp(-Beta*I/N*dt));
double dN_IR = rbinom(I,1-exp(-mu_IR*dt));
S -= dN_SI;
I += dN_SI - dN_IR;
R += dN_IR;
H += dN_IR;
")

sir_init <- Csnippet("
S = nearbyint(eta*N);
I = 1;
R = nearbyint((1-eta)*N);
H = 0;
")

dmeas <- Csnippet("
lik = dbinom(reports,H,rho,give_log);
")

rmeas <- Csnippet("
reports = rbinom(H,rho);
")

read_csv("https://kingaa.github.io/sbied/pfilter/Measles_Consett_1948.csv") 
%>%
  select(week,reports=cases) %>%
  filter(week<=42) %>%
  pomp(
    times="week",t0=0,
    rprocess=euler(sir_step,delta.t=1/7),
    rinit=sir_init,
    rmeasure=rmeas,
    dmeasure=dmeas,
    accumvars="H",
    statenames=c("S","I","R","H"),
    paramnames=c("Beta","mu_IR","eta","rho","N"),
    params=c(Beta=15,mu_IR=0.5,rho=0.5,eta=0.06,N=38000)
  ) -> measSIR

measSIR %>%
  pfilter(Np=5000) -> pf
logLik(pf)

library(doParallel)
library(doRNG)
registerDoParallel()
registerDoRNG(652643293)
foreach (i=1:10, .combine=c) %dopar% {
  measSIR %>% pfilter(Np=5000)
} -> pf
logLik(pf) -> ll
logmeanexp(ll,se=TRUE)
如果我在上面的代码中设置Beta=100,我可以得到一个负的无限对数似然

将测量错误片段替换为以下内容:


dmeas我们很乐意帮助你,但是如果没有。。。想必这是从庞然大物包装中得到的???对我将添加一个带有示例代码的编辑。对其进行了更新,希望对您有所帮助。顺便说一句,我是新来的,如果发布方式仍然不太好,那么很抱歉>:此代码很好,但我无法重现此问题。当我在R-devel,pomp版本3.2上运行这段代码时,我得到了有限的日志可能性,第一个logLik调用为-268.7781,并行化代码的类似值。您是否已从干净的R会话运行此操作?如果并行化的内容与您的问题不相关,您可以通过删除它来简化您的问题。pomp软件包通常假定您对概率和随机模型拟合具有相当高的知识/成熟度…非常感谢您的详细回答!!我将在接下来的一段时间里完成它。我有一个后续问题:在我使用的csv中,有一天的案例数为0。我的模拟那天没有0个案例。这就是你所说的,当潜在的真实感染数为零时,你不知何故得到了一个不可能的情况,比如报告的病例数为正数?你能详细说明调试代码的哪一部分暗示报告的病例数为正数,但感染数为零吗?我假设有两份报告。H是我的累加器变量,它等于0。这就是问题所在吗?是的,没错,当数据中没有案例时,在模拟过程中有>0个案例没有错。问题是在模拟过程中没有感染的情况下,数据中有>0个病例。非常感谢!我对使用R非常陌生,所以有一些额外的上下文是非常有用的,我主要是学习了上面提到的在线课程,但它并没有给出代码可能会出错的例子。我真的很感谢你的回答!!
(t = 3, reports = 2, S = 2280, I = 0, R = 35721, H = 0, Beta = 100, 
    mu_IR = 0.5, rho = 0.5, eta = 0.06, N = 38000, log = TRUE)
Browse[1]> debug at /tmp/SO65554258.R!ZlSILG#7: return(lik)
Browse[2]> reports
[1] 2
Browse[2]> H
[1] 0
Browse[2]> rho
[1] 0.5