2013-03-11 2 views
1

나는 나이 - 계층화 된 SEIR 모델을 코딩하려고합니다. 즉, 미분 방정식에서 나는 20 개의 연령대에 걸친 베타 * (비율 감염) * (수의 영향을 받기 쉬운)의 합계 인 대량 행동을위한 매개 변수를 가지고 있습니다. 전송 계수 (베타)는 접촉 행렬로부터 계산됩니다. 접촉 행렬은 연령 클래스 (행 = 사람 i, 열 = 사람 j)를 나타내는 20 개의 열과 행을 가지며 모든 연령대의 두 사람 사이의 접촉 확률을 포함합니다. 나는 그것을 설계하고 R로 읽어 들였다. 내 문제는 내가 어떻게 내 매개 변수 내에서 행렬을 사용할 수 있는지 모르겠다. 내가 너무 많이와 바보 전에를 사용할 수있는 경우deSolve 패키지의 매개 변수에 행렬이 포함될 수 있습니까?

Error in beta * S : non-numeric argument to binary operator 

, 내가 알고 싶습니다 : 행렬의/I가이 오류 때문에 작동하지 않는 썼다 아래이 코드는, 저는 믿습니다 이 행렬을이 모델의 매개 변수로 사용하십시오. $ beta.V20을 통해 ....

$beta.V1 
[1] 4e-04 4e-04 4e-04 4e-04 4e-04 4e-04 4e-04 4e-04 4e-04 4e-04 4e-04 
[12] 4e-04 4e-04 8e-03 8e-03 8e-03 8e-03 8e-03 8e-03 8e-03 

$beta.V2 
[1] 4e-04 4e-04 4e-04 4e-04 4e-04 4e-04 4e-04 4e-04 4e-04 4e-04 4e-04 
[12] 4e-04 4e-04 8e-03 8e-03 8e-03 8e-03 8e-03 8e-03 8e-03 

: 나는 매개 변수를 인쇄하는 경우

mat <-as.matrix(read.csv("H:/IBS 796R/contactmatrix.csv", header=F)) 

times <- seq(0,20,by=1/52) 
parameters <- c(mu=0,v=1/75,N=1,p=0,delta=2.4,beta=mat*0.04,sigma=1/8,gamma=1/15) 
xstart <- c(S=0.06,E=0,I=0.001,R=0) 

SEIR0 <- function(t,x,parameters){ 
    S=x[1] 
    E=x[2] 
    I=x[3] 
    R=x[4] 
    with(as.list(parameters), { 
     dS=v*S -beta*S*I/N -delta*S 
     dE=beta*S*1/N -E*(sigma+delta) 
     dI=sigma*E -I*(gamma+delta) 
     dR=gamma*I-delta*R 
     res=c(dS,dE,dI,dR) 
     list(res) 
    }) 
} 

out <- as.data.frame(lsoda(xstart,times,SEIR0,parameters)) 

또한,이 모습 베타입니다. 그래서 저는 20 개의 벡터를 만들고 20 개의 인자를 가진다고 생각합니다 ... 각각이 원래의 행렬 'mat'에 상수 0.04를 곱한 행이라고 생각합니까? 그러나, "매개 변수"밖에서 매트 * 0.04를 곱하면 예상되는 행렬을 얻습니다. 저는 deSolve를 사용하여 이러한 방정식을 실현하는 방법과 조금 어려움을 겪고 있으며 가능한지 여부에 대한 조언을 주시면 감사하겠습니다. 미리 감사드립니다.

답변

1

오류는이 라인에서 발생

dS=v*S -beta*S*I/N -delta*S 

non-numeric argument to binary operator 당신이 숫자로, 예를 들어 함수를 곱하려고 것을 의미한다. 당신은 여기 I*1

Error in I * 1 : non-numeric argument to binary operator` 

하여 재현 할 수있는, R은 '베타 버전을 찾을 수 있으며 베타 수학의 특수 기능 때문에 오류로 해석됩니다. 당신은 내가 당신도 귀하의 기능을 다시 쓸 수 있다고 생각

# a list 
list(mu=0,v=1/75,N=1,p=0,delta=2.4,beta=mat*0.04,sigma=1/8,gamma=1/15) 

## you get a vector mu,N,p,delta,beta1,bet2,... 
c(mu=0,v=1/75,N=1,p=0,delta=2.4,beta=mat*0.04,sigma=1/8,gamma=1/15) 

로 매개 변수를 정의해야합니다 : 이것은 위의 문제를 해결합니다

SEIR0 <- function(t,x,parameters){ 
    with(as.list(c(parameters, x)), { 
    dS = v*S -beta*S*I/N -delta*S ## matrix 
    dE = beta*S*1/N -E*(sigma+delta) ## matrix 
    dI = sigma*E -I*(gamma+delta) 
    dR = gamma*I-delta*R 
    res = c(dS,dE,dI,dR) 
    list(res)      ## different of the structure of xstart 
    }) 
} 

을하지만 ODE는하지 않습니다 SEIR0에 의해 반환 된 도함수가 초기 조건의 길이 인 xstart 벡터 (여기 4)와 같아야하므로 작동합니다.

나는 예를 들어 제안 :

res <- c(dS=mean(dS),dE=mean(dE),dI=dI,dR=dR) 
    list(res) 
관련 문제