R 使用包desolve-状态可以由矩阵定义吗?

R 使用包desolve-状态可以由矩阵定义吗?,r,ode,R,Ode,我正在尝试使用deSolve对相当多的州进行建模。其中一个状态“foo”实际上由15个不同的状态组成,包括foo[1,1:5]、foo[2,1:5]和foo[3,1:5],因此我认为向函数传递一个状态矩阵最简单,而不是单独键入它们,然后我可以通过索引引用它们: par <- rep(NA,3) par_names <- c('alpha','prog','death_rate') names(par) <-par_names par['alpha'] <-

我正在尝试使用deSolve对相当多的州进行建模。其中一个状态“foo”实际上由15个不同的状态组成,包括foo[1,1:5]、foo[2,1:5]和foo[3,1:5],因此我认为向函数传递一个状态矩阵最简单,而不是单独键入它们,然后我可以通过索引引用它们:

  par <- rep(NA,3)
  par_names <- c('alpha','prog','death_rate')
  names(par) <-par_names
  par['alpha'] <- 0.7
  par['prog'] <- 0.8
  par['death_rate'] <- 0.3

  foo <- matrix(0,nrow = 3,ncol = 5)

  states <- foo

  my_func <- function(t,states,par){
    with(as.list(c(states,par)),{

      for (j in 1:5){
        dfoo[1,j] <-  par['alpha']*par['prog']*foo[1,j] - par['death_rate']*foo[1,j]
        dfoo[2,j] <- par['prog']*foo[1,j] - par['prog']*foo[2,j] - par['death_rate']*foo[2,j]
        dfoo[3,j] <- par['prog']*foo[2,j] - par['prog']*foo[3,j] - par['death_rate']*foo[3,j]
      }


      list(c(
        dfoo[]
      ))
    })
  }

  times <- seq(1,365,by=1)

  library(deSolve)

  alldata <- as.data.frame(ode(y=states,times=times,func=my_func,parms=par))

<代码> PAL> P>是的,你可以在你的状态中传递一个矩阵。但是每次
ode
调用您的函数时(第一次除外),它都会传递一个
向量,而不是
矩阵。但是你可以在函数的开头把它转换成矩阵

您使用不必要的扭曲来创建数据。此外,正如注释中指出的,您的函数似乎没有初始化
dfoo
。最后,函数中的
for
循环可以通过一些向量化操作更干净地处理。以下是一个例子:

my_func <- function(t,states,par){
    foo <- matrix(states, nrow = 3, ncol = 5)
    dfoo <- with(as.list(par), rbind(    
      (prog * alpha * foo[1,]) - (death_rate * foo[1,]),
      (prog * foo[-nrow(foo),]) - (prog * foo[-1,]) - (death_rate * foo[-1,])
    ))
    list(dfoo)
}

library(deSolve)
par <- c(alpha = 0.7, prog = 0.8, death_rate = 0.3)
states <- matrix(0,nrow = 3,ncol = 5)
ode <- ode(y=states, times=1:365, func=my_func, parms=par)
alldata <- as.data.frame(ode)

my_func错误消息说明了一切。
[好吧,很公平,你已经指出了,这是一个明显的错误。好吧,,,,我认为错误消息一打印出来就很明显了。我对这一点很陌生。但主要的问题是——它甚至可以做到吗?可以将函数的状态赋予矩阵吗?我在互联网上找不到任何东西说它可以或不能,但也许我没有读到它他说得对……啊,对不起,这根本不是我的本意!如果我正确理解了你的评论,我正在使用的函数在最后一行-ode()中给出。这就是你的意思吗?
my_func <- function(t,states,par){
    foo <- matrix(states, nrow = 3, ncol = 5)
    dfoo <- with(as.list(par), rbind(    
      (prog * alpha * foo[1,]) - (death_rate * foo[1,]),
      (prog * foo[-nrow(foo),]) - (prog * foo[-1,]) - (death_rate * foo[-1,])
    ))
    list(dfoo)
}

library(deSolve)
par <- c(alpha = 0.7, prog = 0.8, death_rate = 0.3)
states <- matrix(0,nrow = 3,ncol = 5)
ode <- ode(y=states, times=1:365, func=my_func, parms=par)
alldata <- as.data.frame(ode)