我正在查看一些已发布的R代码,其中作者正在使用最大似然估计将ODE模型与一些数据进行匹配.我不明白为什么他们要适应参数的转换值-我希望在课堂上使用此代码进行练习,所以我必须能够解释为什么代码是这样编写的.

代码如下:

# Necessary libraries
library(stats4)
library(deSolve)
library(chron)
library(bbmle)

# Read the data
ebola <- read.csv("data_WHO_SierraLeone_mle.csv",skip=3)

# Select only incidence counts between these two time points
begin <- chron("25 May 2014", format=c(dates = "day mon year"))
end <- chron("13 Sep 2015", format=c(dates = "day mon year"))
timepoints <- seq(begin,end,7)
ebola <- as.data.frame(cbind(timepoints,ebola[21:89,2:5]))

# Add last two entries of situation report to patient data base
ebola[68:69,4:5] <- ebola[68:69,2:3]
ebola <- ebola[,-2:-3]
ebola[,2] <- ebola[,2]+ebola[,3]
ebola[,3] <- cumsum(ebola[,2])
names(ebola) <- c("Date","Cases","Cumulative")

# Definition of the SEIR model
SEIR <- function(t, x, parms) {
    with(as.list(c(parms,x)),{
        # Exponential reduction in transmission rate
        ifelse(t < tau1, beta <- beta0, beta <- beta1 + (beta0-beta1)*exp(-k*(t-tau1)))
        # Density-dependent transmission
        N <- S + E + I + R + D
        dS <- - beta/N*S*I
        dE <- beta/N*S*I - sigma*E
        dI <- sigma*E - gamma*I
        dR <- (1-f)*gamma*I
        dD <- f*gamma*I
        dC <- sigma*E
        der <- c(dS,dE,dI,dR,dD,dC)
        list(der)
    })
}

# Negative log-likelihood
nll <- function(beta0,beta1,k,f,tau0,tau1,sigma,gamma,disp) {
    pars <- c(beta0=beta0,beta1=beta1,k=k,f=f,tau0=tau0,tau1=tau1,sigma=sigma,gamma=gamma,disp=disp)
    pars <- trans(pars)
    times <- c(0,min(data$times)+pars["tau0"]-7,data$times+pars["tau0"])
    simulation <- as.data.frame(ode(init,times,SEIR,parms=pars))
    ll <- sum(dnbinom(data$cases,size=pars["disp"]*diff(simulation$C)[-1],mu=diff(simulation$C)[-1],log=TRUE))
    return(-ll)
}

# Parameter transformation
trans <- function(pars) {
    pars["beta0"] <- exp(pars["beta0"])
    pars["beta1"] <- exp(pars["beta1"])
    pars["k"] <- exp(pars["k"])
    pars["f"] <- plogis(pars["f"])
    pars["tau0"] <- exp(pars["tau0"])
    pars["tau1"] <- exp(pars["tau1"])
    pars["disp"] <- exp(pars["disp"])
    return(pars)
}

# Prepare the data and set the initial values
data <- na.omit(ebola[c("Date","Cases")])
names(data) <- c("times","cases")
data$times <- data$times - data$times[1]
N <- 6.316e6      
init <- c(S = N - 1, E = 0, I = 1, R = 0, D = 0, C = 0)

# Fit the model to the data
fixed <- c(sigma = 1/11.4, gamma = 1/(15.3-11.4), f = qlogis(0.69), tau0 = log(32))
free <- c(beta0 = log(2.02/(15.3-11.4)), beta1 = log(0.5/(15.3-11.4)), tau1 = log(32), k = log(0.01), disp = log(0.18))
fit <- mle2(nll,start=as.list(free),fixed=as.list(fixed),method="Nelder-Mead",control=list(maxit=1e3))
summary(fit)
trans(coef(fit))

我的期望是,您只需输入自由参数(beta0、beta1、tau1、k、disp)的值并计算负对log可能性,而不是输入转换后的参数,取消转换,然后计算NLL.不确定这有什么区别.

归因:https://doi.org/10.1371/journal.pntd.0004676(S2附录包含模型正在适应的数据)

推荐答案

通过对log变换,可以保证参数的正性.然后,优化器可以在(-Inf,Inf)之间范围内的log转换规模上工作,而模型的参数在(0,Inf)范围内.

与此类似,plogis转换有助于将f保持在区间(0,1)内.

这有助于稳定优化,因为它避免了不切实际的参数值和潜在的数字错误.

x <- seq(-5, 1, 0.01)
plot(x, exp(x), type="l", xlab="optimizer", ylab="ode model", main="exp")

x <- seq(-5, 5, 0.1)
plot(x, plogis(x), type="l", xlab="optimizer", ylab="ode model", main="sigmoidal")

logistic and log/exp transformations

R相关问答推荐

将Multilinetring合并到一个线串中,使用sf生成规则间隔的点

多个ggpredicate对象的平均值

如何使用geom_sf在边界显示两种 colored颜色 ?

如何将在HW上运行的R中的消息(错误、警告等)作为批处理任务输出

使用R中的Shapetime裁剪格栅文件

使用strsplit()将向量操作为数据框

在df中保留原始变量和新变量

一小时满足条件的日期的 Select

R中边际效应包中Logistic回归的交互作用风险比

展开对数比例绘图的轴(添加填充)

有没有可能用shiny 的书签恢复手风琴面板?

在gggraph中显示来自不同数据帧的单个值

如何将这个小列表转换为数据帧?

`-`是否也用于数据帧,有时使用引用调用?

用多边形替换地块点

Conditional documentr::R中数据帧的summarize()

基于R中的辅助向量中的值有条件地连接向量中的字符串

R没有按顺序显示我的有序系数?

R:水平旋转图

对数据帧中的列进行子集设置以通过迭代创建新的数据帧