2017-04-07 1 views
0

Matlab에서 R로 함수를 재현하려고합니다. 나는 R에 대한 많은 경험이 없으므로 코드의 일부를 이해하기가 어렵다. 다음 temp.mat <- matrix(c(1,0,1,0,1-p,p),3,2,byrow=TRUE) initial.state.vec <- rep(0,7) initial.state.vec[c(type,type+1)] <- temp.mat[type,]R에서 Matlab으로 함수를 변환

내 MATLAB 코드가있는 나는 R 코드를 재현하는 시도한다 : 나는 다음과 같은 코드의 라인과 그 의미를 이해하는 데 어려움을 겪고

# Model Calculations 
# ================== 
# 
# Function to determine length of stay df. 
# 
# t = time since hospital admission in days 
# age = age at admision in years 
# type = type of stroke (1. Haemorhagic, 2. Cerebral Infarction, 3. TIA) 
# 
los.df <- Vectorize(function(t, age, type,dest){ 
    par <- c(6.63570, -0.03652, -3.06931, 0.07153, -8.66118, 
    0.08801, 22.10156, 2.48820, 1.56162, 1.27849, 
    11.76860, 3.41989, 63.92514) 
    alpha1 <- par[1] 
    beta1 <- par[2] 
    alpha2 <- par[3] 
    beta2 <- par[4] 
    theta0 <- par[5] 
    theta1 <- par[6] 
    mu1 <- par[7] 
    mu2 <- par[8] 
    mu3 <- par[9] 
    mu4 <- 0 
    nu1 <- 0 
    nu2 <- 0 
    nu3 <- par[10] 
    nu4 <- 0 
    rho1 <- 0 
    rho2 <- par[11] 
    rho3 <- par[12] 
    rho4 <- par[13] 
    # 
    p <- exp(-exp(theta0 + theta1*age)) 
    temp.mat <- matrix(c(1,0,1,0,1-p,p),3,2,byrow=TRUE) 
    initial.state.vec <- rep(0,7) 
    initial.state.vec[c(type,type+1)] <- temp.mat[type,] 
    # 
    lambda1 <- exp(alpha1 + beta1*age) 
    lambda2 <- exp(alpha2 + beta2*age) 
    Q <- matrix(0,7,7) 
    Q[1,] <- c(-(lambda1+mu1+nu1+rho1), lambda1, 0, 0, mu1, nu1, rho1) 
    Q[2,] <- c(0, -(lambda2+mu2+nu2+rho2), lambda2, 0, mu2, nu2, rho2) 
    Q[3,] <- c(0, 0, -(mu3+nu3+rho3), 0, mu3, nu3, rho3) 
    Q[4,] <- c(0, 0, 0, -(mu4+nu4+rho4), mu4, nu4, rho4) 
    Pt <- expm(t/365*Q) 
    Ft <- sum(as.numeric(initial.state.vec %*% Pt)[dest:dest]) 
    return(Ft) 
}) 

다음은 R 코드입니다 : I 출력을 플롯하면

function Ft = losdf(age, strokeType, dest) 

% function to determine length of stay in hospitaal of stroke patients 
% t = time since admission (days); 
% age = age of patient; 
% strokeType = 1. Haemorhagic, 2. Cerebral Infarction, 3. TIA; 
% dest = 5.Death 6.Nursing Home 7. Usual Residence; 

alpha1 = 6.63570; 
beta1 = -0.03652; 
alpha2 = -3.06931; 
beta2 = 0.07153; 
theta0 = -8.66118; 
theta1 = 0.08801; 
mu1 = 22.10156; 
mu2 = 2.48820; 
mu3 = 1.56162; 
mu4 = 0; 
nu1 = 0; 
nu2 = 0; 
nu3 = 1.27849; 
nu4 = 0; 
rho1 = 0; 
rho2 = 11.76860; 
rho3 = 3.41989; 
rho4 = 63.92514; 

Ft = zeros(365,1); 
for t = 1:1:365 
p = (exp(-exp(theta0 + (theta1.*age)))); 

if strokeType == 1 
    initialstatevec = [1 0 0 0 0 0 0]; 
elseif strokeType == 2 
    initialstatevec = [0 1 0 0 0 0 0]; 
else 
    initialstatevec = [0 0 (1-p) p 0 0 0]; 
end 

lambda1 = exp(alpha1 + (beta1.*age)); 
lambda2 = exp(alpha2 + (beta2.*age)); 

Q = [ -(lambda1+mu1+nu1+rho1) lambda1 0 0 mu1 nu1 rho1; 
0 -(lambda2+mu2+nu2+rho2) lambda2 0 mu2 nu2 rho2; 
0 0 -(mu3+nu3+rho3) 0 mu3 nu3 rho3; 
0 0 0 -(mu4+nu4+rho4) mu4 nu4 rho4; 
0 0 0 0 0 0 0; 
0 0 0 0 0 0 0; 
0 0 0 0 0 0 0]; 

Pt = expm(t./365.*Q); 
Pt = Pt(strokeType, dest); 
Ft(t) = sum(initialstatevec.*Pt); 

end 

, 그것은 R.에서와 같이 내가 잘못 가고 어디 식별 할 수 matlab에 나에게 같은 값을 제공하지 않습니다; 나는 Pt 값이 정확하다는 것을 안다. 내가 initialstatevec를 설정하거나 Ft (t)를 정의하는 데 오류가있을 수 있다고 생각합니까?

누구든지 내가 잘못 갔을 때 조언을 해줄 수 있다면 많은 도움이 될 것입니다.

답변

0

이 줄 temp.mat <- matrix(c(1,0,1,0,1-p,p),3,2,byrow=TRUE)은 3 행 2 열의 행렬을 만들고 행을 행으로 채워서 그에게주는 요소를 넣습니다.

의이 p = 0.5 말을하자 temp.mat은 다음과 같이이다 :

이 줄 initial.state.vec <- rep(0,7) 일곱 0의 벡터 생성

 [,1] [,2] 
[1,] 1.0 0.0 
[2,] 1.0 0.0 
[3,] 0.5 0.5 
: 1 : type의 값에 따라,

> initial.state.vec 
[1] 0 0 0 0 0 0 0 

그리고이 라인 initial.state.vec[c(type,type+1)] <- temp.mat[type,]을 , 2 또는 3, matrix의 type에 의해 색인 된 행을 vector의 특정 색인에 넣습니다.이 색인은 accordi로 계산됩니다 값은 type입니다. 의미는 다음과 같습니다.

type = 1의 경우 행렬의 첫 번째 행을 가져 와서 벡터의 첫 번째 및 두 번째 인덱스를 넣습니다. type = 2를 들어, 행렬의 2 행을 당신은 인덱스 2 및 3에 넣고 type = 3를 들어, 3 행을 당신은 type = 3와 인덱스 3, 4

예에 넣어 :

temp.mat[type,] 
[1] 0.5 0.5 

initial.state.vec 
[1] 0.0 0.0 0.5 0.5 0.0 0.0 0.0 

번역에 도움이되기를 바랍니다.

관련 문제