# Function to discretize a CTMC given a time step
discretize_CTMC <- function(Q, dt) {
  # Q: Continuous-time transition rate matrix
  # dt: Time step for discretization
  
  n_states <- nrow(Q)
  P <-(Q * dt)
  P_discrete <- matrix(0, nrow = n_states, ncol = n_states)
  
  for (i in 1:n_states) {
    for (j in 1:n_states) {
      P_discrete[i, j] <- P[i, j] + (i == j)
    }
  }
  
  return(P_discrete)
}

# Define parameters for the continuous-time Markov chain
heal = 10 # average_duration
at1  = 3  # average_time_stage1
at2  = 7  # average_time_stage2

# Create the continuous-time transition rate matrix
Q <- matrix(data = c(-1/at1, 1/at1-1/heal, 0           , 1/heal,
                     0     , -1/at2      , 1/at2-1/heal, 1/heal,
                     0     , 0           , -1/heal     , 1/heal,
                     0     , 0           , 0           , 0), nrow = 4, byrow = TRUE)

# Discretize the continuous-time Markov chain using a time step
dt <- 1  # Time step (1 day)
P_discrete <- discretize_CTMC(Q, dt)

# define CTMC
CTMC= new("markovchain",states=c("1","2","3","H"),
          transitionMatrix=P_discrete, name="Stages")
initialState = c(1,0,0,0)
probFever=c(0.1,0.5,0.8,0)

#show(CTMC)

plot(CTMC,package="diagram")

timesteps <- 76
dis.df <- data.frame( "timestep" = numeric(),
 "S1" = numeric(), "S2" = numeric(), "S3" = numeric(),
 "H" = numeric(), "PF" = numeric(), stringsAsFactors=FALSE)

for (i in 0:timesteps) {
  dis.df[nrow(dis.df) + 1, 1:5] <- as.list(c(i,round(as.numeric(initialState * CTMC ^ i),3)))
  dis.df[i+1, 6] <- t(as.vector(dis.df[i + 1, 2:5],mode = "numeric")) %*% probFever
}
#dis.df

#plot(dis.df$timestep,dis.df$S1)
#points(dis.df$timestep,dis.df$S2, col="yellow")
#points(dis.df$timestep,dis.df$S3, col="red")
#points(dis.df$timestep,dis.df$H, col="green")
#points(dis.df$timestep,dis.df$PF, col="blue")

What is the probability that the patient is still sick after 8 days for different discretization time steps (e.g. 2, 1, 0.5, 0.25, 0.1)?

# Define time steps
time_steps <- c(2, 1, 0.5, 0.25, 0.1)

# Initialize results data frame
results <- data.frame("Time Step" = numeric(),
                      "Probability Still Sick" = numeric(),"Probability_Fever_9th_Day" = numeric(), "ExpectedDuration" = numeric(), stringsAsFactors = FALSE)

# Loop through different time steps
for (dt in time_steps) {
  # Discretize the continuous-time Markov chain using the current time step
  P_discrete <- discretize_CTMC(Q, dt)
  
  # Create the Markov chain object
  CTMC <- new("markovchain", states = c("1", "2", "3", "H"),
              transitionMatrix = P_discrete, name = "Stages")
  
  # Calculate the probability that the patient is still sick after 8 days
  prob_still_sick <- sum(as.numeric(initialState * CTMC ^ 8)[1:3])
  
  prob_fever_9th_day <- t(as.numeric(initialState * CTMC ^ 9) %*% probFever)
  
  expected_duration <- 0
  curr_prob = as.numeric(initialState * CTMC ^ 0)
  while (curr_prob[4] < 0.99) {
    expected_duration = expected_duration + 1
    curr_prob = as.numeric(initialState * CTMC ^ expected_duration)
  }
  
  # Record the results
  results[nrow(results)+1,]=c(dt, round(prob_still_sick,3), round(prob_fever_9th_day,3), expected_duration)
}

# Display the results
results[,1:2]
##   Time.Step Probability.Still.Sick
## 1      2.00                  0.168
## 2      1.00                  0.430
## 3      0.50                  0.663
## 4      0.25                  0.817
## 5      0.10                  0.923

What is the probability of measuring fever on the 9th day for different discretization time steps (e.g. 2, 1, 0.5, 0.25, 0.1)?

results[,c(1,3)]
##   Time.Step Probability_Fever_9th_Day
## 1      2.00                     0.090
## 2      1.00                     0.210
## 3      0.50                     0.251
## 4      0.25                     0.220
## 5      0.10                     0.163

What is the expected duration until healing with probability 99% for different discretization time steps (e.g. 2, 1, 0.5, 0.25, 0.1)?

results[,c(1,4)]
##   Time.Step ExpectedDuration
## 1      2.00               21
## 2      1.00               44
## 3      0.50               90
## 4      0.25              182
## 5      0.10              459
LS0tDQp0aXRsZTogIkFETSBBc3NpZ25tZW50IDIiDQphdXRob3I6ICJEb21pbmlrIERpZWRyaWNoIg0KZGF0ZTogImByIFN5cy5EYXRlKClgIg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIGNvZGVfZG93bmxvYWQ6IHllcw0KICAgIGNvZGVfZm9sZGluZzogaGlkZSANCi0tLQ0KDQpgYGB7ciBpbmNsdWRlPUZBTFNFfQ0KbGlicmFyeShtYXJrb3ZjaGFpbikNCmBgYA0KDQpgYGB7cn0NCg0KIyBGdW5jdGlvbiB0byBkaXNjcmV0aXplIGEgQ1RNQyBnaXZlbiBhIHRpbWUgc3RlcA0KZGlzY3JldGl6ZV9DVE1DIDwtIGZ1bmN0aW9uKFEsIGR0KSB7DQogICMgUTogQ29udGludW91cy10aW1lIHRyYW5zaXRpb24gcmF0ZSBtYXRyaXgNCiAgIyBkdDogVGltZSBzdGVwIGZvciBkaXNjcmV0aXphdGlvbg0KICANCiAgbl9zdGF0ZXMgPC0gbnJvdyhRKQ0KICBQIDwtKFEgKiBkdCkNCiAgUF9kaXNjcmV0ZSA8LSBtYXRyaXgoMCwgbnJvdyA9IG5fc3RhdGVzLCBuY29sID0gbl9zdGF0ZXMpDQogIA0KICBmb3IgKGkgaW4gMTpuX3N0YXRlcykgew0KICAgIGZvciAoaiBpbiAxOm5fc3RhdGVzKSB7DQogICAgICBQX2Rpc2NyZXRlW2ksIGpdIDwtIFBbaSwgal0gKyAoaSA9PSBqKQ0KICAgIH0NCiAgfQ0KICANCiAgcmV0dXJuKFBfZGlzY3JldGUpDQp9DQoNCiMgRGVmaW5lIHBhcmFtZXRlcnMgZm9yIHRoZSBjb250aW51b3VzLXRpbWUgTWFya292IGNoYWluDQpoZWFsID0gMTAgIyBhdmVyYWdlX2R1cmF0aW9uDQphdDEgID0gMyAgIyBhdmVyYWdlX3RpbWVfc3RhZ2UxDQphdDIgID0gNyAgIyBhdmVyYWdlX3RpbWVfc3RhZ2UyDQoNCiMgQ3JlYXRlIHRoZSBjb250aW51b3VzLXRpbWUgdHJhbnNpdGlvbiByYXRlIG1hdHJpeA0KUSA8LSBtYXRyaXgoZGF0YSA9IGMoLTEvYXQxLCAxL2F0MS0xL2hlYWwsIDAgICAgICAgICAgICwgMS9oZWFsLA0KICAgICAgICAgICAgICAgICAgICAgMCAgICAgLCAtMS9hdDIgICAgICAsIDEvYXQyLTEvaGVhbCwgMS9oZWFsLA0KICAgICAgICAgICAgICAgICAgICAgMCAgICAgLCAwICAgICAgICAgICAsIC0xL2hlYWwgICAgICwgMS9oZWFsLA0KICAgICAgICAgICAgICAgICAgICAgMCAgICAgLCAwICAgICAgICAgICAsIDAgICAgICAgICAgICwgMCksIG5yb3cgPSA0LCBieXJvdyA9IFRSVUUpDQoNCiMgRGlzY3JldGl6ZSB0aGUgY29udGludW91cy10aW1lIE1hcmtvdiBjaGFpbiB1c2luZyBhIHRpbWUgc3RlcA0KZHQgPC0gMSAgIyBUaW1lIHN0ZXAgKDEgZGF5KQ0KUF9kaXNjcmV0ZSA8LSBkaXNjcmV0aXplX0NUTUMoUSwgZHQpDQoNCiMgZGVmaW5lIENUTUMNCkNUTUM9IG5ldygibWFya292Y2hhaW4iLHN0YXRlcz1jKCIxIiwiMiIsIjMiLCJIIiksDQogICAgICAgICAgdHJhbnNpdGlvbk1hdHJpeD1QX2Rpc2NyZXRlLCBuYW1lPSJTdGFnZXMiKQ0KaW5pdGlhbFN0YXRlID0gYygxLDAsMCwwKQ0KcHJvYkZldmVyPWMoMC4xLDAuNSwwLjgsMCkNCg0KI3Nob3coQ1RNQykNCg0KcGxvdChDVE1DLHBhY2thZ2U9ImRpYWdyYW0iKQ0KDQp0aW1lc3RlcHMgPC0gNzYNCmRpcy5kZiA8LSBkYXRhLmZyYW1lKCAidGltZXN0ZXAiID0gbnVtZXJpYygpLA0KICJTMSIgPSBudW1lcmljKCksICJTMiIgPSBudW1lcmljKCksICJTMyIgPSBudW1lcmljKCksDQogIkgiID0gbnVtZXJpYygpLCAiUEYiID0gbnVtZXJpYygpLCBzdHJpbmdzQXNGYWN0b3JzPUZBTFNFKQ0KDQpmb3IgKGkgaW4gMDp0aW1lc3RlcHMpIHsNCiAgZGlzLmRmW25yb3coZGlzLmRmKSArIDEsIDE6NV0gPC0gYXMubGlzdChjKGkscm91bmQoYXMubnVtZXJpYyhpbml0aWFsU3RhdGUgKiBDVE1DIF4gaSksMykpKQ0KICBkaXMuZGZbaSsxLCA2XSA8LSB0KGFzLnZlY3RvcihkaXMuZGZbaSArIDEsIDI6NV0sbW9kZSA9ICJudW1lcmljIikpICUqJSBwcm9iRmV2ZXINCn0NCiNkaXMuZGYNCg0KI3Bsb3QoZGlzLmRmJHRpbWVzdGVwLGRpcy5kZiRTMSkNCiNwb2ludHMoZGlzLmRmJHRpbWVzdGVwLGRpcy5kZiRTMiwgY29sPSJ5ZWxsb3ciKQ0KI3BvaW50cyhkaXMuZGYkdGltZXN0ZXAsZGlzLmRmJFMzLCBjb2w9InJlZCIpDQojcG9pbnRzKGRpcy5kZiR0aW1lc3RlcCxkaXMuZGYkSCwgY29sPSJncmVlbiIpDQojcG9pbnRzKGRpcy5kZiR0aW1lc3RlcCxkaXMuZGYkUEYsIGNvbD0iYmx1ZSIpDQoNCmBgYA0KDQoNCiMjIFdoYXQgaXMgdGhlIHByb2JhYmlsaXR5IHRoYXQgdGhlIHBhdGllbnQgaXMgc3RpbGwgc2ljayBhZnRlciA4IGRheXMgZm9yIGRpZmZlcmVudCBkaXNjcmV0aXphdGlvbiB0aW1lIHN0ZXBzIChlLmcuIDIsIDEsIDAuNSwgMC4yNSwgMC4xKT8gDQoNCg0KYGBge3J9DQojIERlZmluZSB0aW1lIHN0ZXBzDQp0aW1lX3N0ZXBzIDwtIGMoMiwgMSwgMC41LCAwLjI1LCAwLjEpDQoNCiMgSW5pdGlhbGl6ZSByZXN1bHRzIGRhdGEgZnJhbWUNCnJlc3VsdHMgPC0gZGF0YS5mcmFtZSgiVGltZSBTdGVwIiA9IG51bWVyaWMoKSwNCiAgICAgICAgICAgICAgICAgICAgICAiUHJvYmFiaWxpdHkgU3RpbGwgU2ljayIgPSBudW1lcmljKCksIlByb2JhYmlsaXR5X0ZldmVyXzl0aF9EYXkiID0gbnVtZXJpYygpLCAiRXhwZWN0ZWREdXJhdGlvbiIgPSBudW1lcmljKCksIHN0cmluZ3NBc0ZhY3RvcnMgPSBGQUxTRSkNCg0KIyBMb29wIHRocm91Z2ggZGlmZmVyZW50IHRpbWUgc3RlcHMNCmZvciAoZHQgaW4gdGltZV9zdGVwcykgew0KICAjIERpc2NyZXRpemUgdGhlIGNvbnRpbnVvdXMtdGltZSBNYXJrb3YgY2hhaW4gdXNpbmcgdGhlIGN1cnJlbnQgdGltZSBzdGVwDQogIFBfZGlzY3JldGUgPC0gZGlzY3JldGl6ZV9DVE1DKFEsIGR0KQ0KICANCiAgIyBDcmVhdGUgdGhlIE1hcmtvdiBjaGFpbiBvYmplY3QNCiAgQ1RNQyA8LSBuZXcoIm1hcmtvdmNoYWluIiwgc3RhdGVzID0gYygiMSIsICIyIiwgIjMiLCAiSCIpLA0KICAgICAgICAgICAgICB0cmFuc2l0aW9uTWF0cml4ID0gUF9kaXNjcmV0ZSwgbmFtZSA9ICJTdGFnZXMiKQ0KICANCiAgIyBDYWxjdWxhdGUgdGhlIHByb2JhYmlsaXR5IHRoYXQgdGhlIHBhdGllbnQgaXMgc3RpbGwgc2ljayBhZnRlciA4IGRheXMNCiAgcHJvYl9zdGlsbF9zaWNrIDwtIHN1bShhcy5udW1lcmljKGluaXRpYWxTdGF0ZSAqIENUTUMgXiA4KVsxOjNdKQ0KICANCiAgcHJvYl9mZXZlcl85dGhfZGF5IDwtIHQoYXMubnVtZXJpYyhpbml0aWFsU3RhdGUgKiBDVE1DIF4gOSkgJSolIHByb2JGZXZlcikNCiAgDQogIGV4cGVjdGVkX2R1cmF0aW9uIDwtIDANCiAgY3Vycl9wcm9iID0gYXMubnVtZXJpYyhpbml0aWFsU3RhdGUgKiBDVE1DIF4gMCkNCiAgd2hpbGUgKGN1cnJfcHJvYls0XSA8IDAuOTkpIHsNCiAgICBleHBlY3RlZF9kdXJhdGlvbiA9IGV4cGVjdGVkX2R1cmF0aW9uICsgMQ0KICAgIGN1cnJfcHJvYiA9IGFzLm51bWVyaWMoaW5pdGlhbFN0YXRlICogQ1RNQyBeIGV4cGVjdGVkX2R1cmF0aW9uKQ0KICB9DQogIA0KICAjIFJlY29yZCB0aGUgcmVzdWx0cw0KICByZXN1bHRzW25yb3cocmVzdWx0cykrMSxdPWMoZHQsIHJvdW5kKHByb2Jfc3RpbGxfc2ljaywzKSwgcm91bmQocHJvYl9mZXZlcl85dGhfZGF5LDMpLCBleHBlY3RlZF9kdXJhdGlvbikNCn0NCg0KIyBEaXNwbGF5IHRoZSByZXN1bHRzDQpyZXN1bHRzWywxOjJdDQpgYGANCg0KDQojIyBXaGF0IGlzIHRoZSBwcm9iYWJpbGl0eSBvZiBtZWFzdXJpbmcgZmV2ZXIgb24gdGhlIDl0aCBkYXkgZm9yIGRpZmZlcmVudCBkaXNjcmV0aXphdGlvbiB0aW1lIHN0ZXBzIChlLmcuIDIsIDEsIDAuNSwgMC4yNSwgMC4xKT8gDQoNCg0KYGBge3J9DQpyZXN1bHRzWyxjKDEsMyldDQpgYGANCg0KDQoNCiMjIFdoYXQgaXMgdGhlIGV4cGVjdGVkIGR1cmF0aW9uIHVudGlsIGhlYWxpbmcgd2l0aCBwcm9iYWJpbGl0eSA5OSUgZm9yIGRpZmZlcmVudCBkaXNjcmV0aXphdGlvbiB0aW1lIHN0ZXBzIChlLmcuIDIsIDEsIDAuNSwgMC4yNSwgMC4xKT8NCg0KDQpgYGB7cn0NCnJlc3VsdHNbLGMoMSw0KV0NCmBgYA0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQo=