ODE 中的潜在索引问题?

Posted

技术标签:

【中文标题】ODE 中的潜在索引问题?【英文标题】:Potential indexing issue in ODE? 【发布时间】:2022-01-22 22:03:22 【问题描述】:

根据@tpetzoldt 的建议,我将在之前的讨论 (Parameter values as a function of another vector. deSolve) 之后将其作为一个问题打开。

我想要实现的是能够在每个时间步长上通过DailyTemperature 的向量集成模型,然后每天的相应参数值是来自其他温度输出数据帧的值的函数。

library(deSolve)
set.seed(1)

deriv <- function(t, state, pars) 
  
  pars <- parameters[match(DailyTemperature[floor(t + 1)],parameters$TraitTemperature),2:5]
  #print(pars)
  
  with(as.list(c(state, pars)), 
    d_x <- alpha * x - beta * x * y
    d_y <- delta * beta * x * y - gamma * y
    list(c(x = d_x, y = d_y), alpha=alpha, beta=beta, gamma=gamma, delta=delta)
  )



state <- c(x = 1000, y = 10)
times = seq(0, 50, by = 1)

# Parameter datasets 
parameters <- data.frame(
  TraitTemperature = seq(0.1,40,0.1),
  alpha = rtruncnorm(40,a=0,b=1,mean = 1,sd=2),
  beta =  rtruncnorm(40,a=0,b=1,mean = 1,sd=2),
  delta =  rtruncnorm(40,a=0,b=1,mean = 1,sd=2),
  gamma = seq(0.025,1,0.025)
)

# random daily temperature dataset 
DailyTemperature <- round(runif(51, 0, 40),1) # one more because start zero
DailyTemperature

out <- ode(y = state, times = times, func = deriv, parms = pars)
plot(out)
out

我实际上开始认为这是参数值而不是代码的问题。无论如何,我很想知道我的索引是否正确?

【问题讨论】:

感谢您使用更新的代码示例提出新问题,即使标题“索引问题”有些误导。这不是一个“问题”。正确的主题是,如何组织索引(或表查找)。另外,参数的定义确实有问题:rtruncnorm是什么?我猜你的意思是trunc(rnorm())。还有,a=0, b=1 是什么? 【参考方案1】:

上面的代码有几个问题:

rtruncnorm 的行似乎完全错位了。在这里,我假设 alpha、beta、gamma 线性依赖于温度加上一个随机分量(在这种情况下我并不真正理解),但如果我们专注于编程方法,这并不重要。 状态和参数值比较大。由于这些术语本质上是指数级的(最好看到alpha * x,这是指数级增长),人口可能会爆炸或消失。这可以通过仔细平衡参数和状态变量来防止。 match 可能由于舍入错误而出现问题,即使使用了 roundtrunc。通常最好检查最小距离,而不是测试相等性。例如,这可以通过which.min 来完成

综合起来,我们可以这样做:

library(deSolve)
set.seed(1)

deriv <- function(t, state, pars) 
  pars <- parameters[
    which.min(abs(DailyTemperature[floor(t + 1)] - parameters$TraitTemperature)), 
    1:5
  ]
  with(as.list(c(state, pars)), 
    d_x <- alpha * x - beta * x * y
    d_y <- delta * beta * x * y - gamma * y

    list(c(x = d_x, y = d_y), 
         alpha = alpha, beta = beta, gamma = gamma, delta = delta, 
         ## some extra output for debugging
         DailyTemperature = DailyTemperature[floor(t + 1)],
         TraitTemperature = TraitTemperature
    )
  )



state <- c(x = 10, y = 5)
times = seq(0, 150, by = 1)
TraitTemperature = seq(0.1, 40, 0.1)

## here we assume a linear increase of the parameters with temperature
parameters <- data.frame(
  TraitTemperature = TraitTemperature,
  alpha = 1.0 + 0.01 * TraitTemperature + rnorm(40, mean = 0, sd = 0.01),
  beta =  0.2 + 0.01 * TraitTemperature + rnorm(40, mean = 0, sd = 0.01),
  delta = 0.2 + 0.01 * TraitTemperature + rnorm(40, mean = 0, sd = 0.01),
  gamma = seq(0.025, 1, 0.025)
)

## which.min will also work without rounding the temperature

#DailyTemperature <- round(runif(length(times), 0, 40), 1)
DailyTemperature <- runif(length(times), 0, 40)
DailyTemperature

out <- ode(y = state, times = times, func = deriv, parms = pars)
plot(out)
head(out)

我想补充一点,还有其他(相当快的)查表方法。

【讨论】:

以上是关于ODE 中的潜在索引问题?的主要内容,如果未能解决你的问题,请参考以下文章

《搜索和推荐中的深度匹配》——2.3 搜索中的潜在空间模型

MATLAB 中的 Ode45

scipy中的复杂ODE系统

使用电子邮件 Outlook 中的链接触发 VBA 代码

Oracle Database 19c中的自动索引

奇异值分解