Advertisement
cyphric

Untitled

May 18th, 2022
252
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.53 KB | None | 0 0
  1. clear all; close all; clc
  2. %Constants and instantiating
  3. ger_inf=readtable("germany_infected.csv");ger_rec=readtable("germany_removed.csv");
  4. ger_inf=ger_inf{:,:}; ger_rec=ger_rec{:,:}; %Turn our tables into vectors
  5. ger_pop=83000000;
  6.  
  7. ger_sus=ones(height(ger_inf),1)*ger_pop;
  8. ger_sus=ger_sus-ger_inf-ger_rec;
  9. phi=0.995; alpha=2; %Given from problem statement
  10. a=2; beta = 3; b = 3;
  11.  
  12. %Calculate our deltas using our susceptible and infected individuals
  13. %Where diff(ger_sus) is the difference each day
  14. deltaS = [ger_pop-ger_sus(1,1);abs(diff(ger_sus))];
  15. deltaI = -ger_inf(1,1);
  16. delta_S = ger_pop - ger_sus(1,1)-ger_inf(1,1);
  17. delta_for_beta_1 = -deltaI + sum(diff(ger_inf)); delta_for_beta_2 = delta_S - sum(diff(ger_sus));
  18. beta_beta = delta_for_beta_1 + delta_for_beta_2;
  19.  
  20. g = @(lambda,Y,kappa) sum(gammaln(kappa+Y)-gammaln(Y+1)-gammaln(kappa)+kappa*log(1-phi)+Y*log(phi)); %Draw for t
  21.  
  22. %Tuning parameters
  23. breakpoint = 3;
  24. N = 15000;
  25. M = 2; sigma = 0.005;
  26. %Initialization
  27. brk_pts = round(linspace(1,length(ger_inf),breakpoint+2));
  28. lambdas = ones(1,breakpoint+1); %Starting guess for lambda
  29. p_ir_vec = zeros(N,1);
  30. params = zeros(breakpoint*2+2,1);
  31. lambda_vec = zeros(N,breakpoint+1); %Lambda needs to be n+1
  32. suggested_breakpoint = zeros(N,breakpoint);
  33.  
  34. for i = 1:N
  35. dummy = 0;
  36. kappas = [];
  37. c = 1;
  38. for j = 1:length(params)
  39.  
  40. epsilon_1 = normrnd(0,1);
  41. epsilon_M = randi([-M,M]);
  42. %Starting with lambda, we have that lambdastar = lambda +
  43. %sigma*epsilon, so we need to update our alpha using kappa with
  44. %lambdastar, we start with just calculating lambda as:
  45. if j <= breakpoint+1
  46.  
  47.  
  48. fl_hol = 1-exp(-lambdas(1,j)*ger_inf(brk_pts(1,j):brk_pts(1,j+1),:)/ger_pop);
  49. kappa1 = (1/phi-1)*ger_sus(brk_pts(1,j):brk_pts(1,j+1),:).*fl_hol;
  50. lambda_star = lambdas(1,j) + sigma*epsilon_1;
  51.  
  52. if lambda_star < 0 %Don't bother with negative lambda_stars
  53. lambda_star = lambdas(1,j);
  54. end
  55.  
  56.  
  57. fl_hol = 1-exp(-lambda_star*ger_inf(brk_pts(1,j):brk_pts(1,j+1),:)/ger_pop);
  58. kappa2 = (1/phi-1).*ger_sus(brk_pts(1,j):brk_pts(1,j+1),:).*fl_hol;
  59.  
  60. U = rand(1); %draw from uniform distribution
  61. %disp(j);
  62. delta_dummy = deltaS(brk_pts(1,j):brk_pts(1,j+1),:);
  63. alpha_prob = min(1,exp(dummy+(prob(lambda_star,delta_dummy,kappa2))-(dummy+(prob(lambdas(1,j),delta_dummy,kappa1)))));
  64.  
  65. if U <= alpha_prob
  66. %Accept lambdastar if U <= alpha and update our dummy
  67. lambdas(1,j) = lambda_star;
  68. dummy = dummy + prob(lambda_star,delta_dummy,kappa2);
  69. lambda_vec(i,j) = lambda_star;
  70. else
  71. %If we reject lambda_star we update our dummy variable with our
  72. %original kappa1
  73. lambda_vec(i,j) = lambdas(1,j);
  74. dummy = dummy + prob(lambdas(1,j),delta_dummy,kappa1);
  75. end
  76.  
  77.  
  78.  
  79. elseif breakpoint+1 < j && j <= 2*breakpoint+1
  80. %Looking at t now, t_star is given as t_star = t_i + epsilon_M
  81. %where epsilon_M is uniformly distributed on +-M.
  82. U = rand(1);
  83. t_star = brk_pts(1,c+1) + epsilon_M;
  84.  
  85. if brk_pts(1,c)>t_star || brk_pts(1,c+2) < t_star
  86. t_star = brk_pts(1,c+1); %If we're between two breakpts we set t_star to simply be the mid-point of the breakpts
  87. end
  88.  
  89. fl_hol=1-exp(-lambdas(1,c)*ger_inf(brk_pts(1,c):brk_pts(1,c+1),:)/ger_pop);
  90. kappa1=(1/phi-1)*ger_sus(brk_pts(1,c):brk_pts(1,c+1),:).*fl_hol;
  91.  
  92. %Generate Kappa2 but now using our suggested t_star as new
  93. %breakpoint
  94. fl_hol=1-exp(-lambdas(1,c)*ger_inf(brk_pts(1,c):t_star,:)/ger_pop);
  95. kappa2=(1/phi-1)*ger_sus(brk_pts(1,c):t_star,:).*fl_hol;
  96.  
  97.  
  98. deltas_temp1=deltaS(brk_pts(1,c):brk_pts(1,c+1),:);
  99. deltas_temp2=deltaS(brk_pts(1,c):t_star,:);
  100.  
  101.  
  102. prob_1=inverseProb(deltas_temp2,kappa2);
  103. prob_2=inverseProb(deltas_temp1,kappa1);
  104.  
  105.  
  106. %Repeat after drawing from the first section up to t_star
  107. fl_hol=1-exp(-lambdas(1,c+1)*ger_inf(brk_pts(1,c+1):brk_pts(1,c+2),:)/ger_pop);
  108. kappa1=(1/phi-1)*ger_sus(brk_pts(1,c+1):brk_pts(1,c+2),:).*fl_hol;
  109.  
  110.  
  111. fl_hol=1-exp(-lambdas(1,c+1)*ger_inf(t_star:brk_pts(1,c+2),:)/ger_pop);
  112. kappa2=(1/phi-1)*ger_sus(t_star:brk_pts(1,c+2),:).*fl_hol;
  113.  
  114.  
  115. deltas_temp1=deltaS(brk_pts(1,c+1):brk_pts(1,c+2),:);
  116. deltas_temp2=deltaS(t_star:brk_pts(1,c+2),:);
  117.  
  118. prob_1=prob_1+inverseProb(deltas_temp2,kappa2);
  119. prob_2=prob_2+inverseProb(deltas_temp1,kappa1);
  120.  
  121. alpha_prob = min(1,exp(prob_1-prob_2));
  122.  
  123. if U <= alpha_prob
  124. %Accepted breakpoint
  125. brk_pts(1,c+1) = t_star;
  126.  
  127. else
  128. brk_pts(1,c+1) = brk_pts(1,c+1);
  129. suggested_breakpoint(i,c) = t_star;
  130. c = c+1;
  131. end
  132.  
  133. elseif j > 2*breakpoint+1 && j <=2*breakpoint+2
  134. p_ir = betarnd(beta_beta-a,sum(ger_inf)-beta_beta+b);
  135. p_ir_vec(i,1)=p_ir;
  136.  
  137. end
  138.  
  139. delta_I = -ger_inf(j+1,1)+ger_inf(j,1);
  140. delta_S = -ger_sus(j+1,1)+ger_sus(j,1);
  141. end
  142. end
  143.  
  144.  
  145.  
  146. %Plots
  147.  
  148. figure(1)
  149. plot(suggested_breakpoint(:,1))
  150. hold on
  151. plot(suggested_breakpoint(:,2))
  152. hold on
  153. plot(suggested_breakpoint(:,3))
  154. legend('t_1','t_2','t_3')
  155. xlabel("Iterations")
  156. ylabel("Proposed breakpoint")
  157. title("German data, 3 Breakpoints")
  158.  
  159.  
  160.  
  161. figure(2)
  162. plot(lambda_vec(:,1))
  163. hold on
  164. plot(lambda_vec(:,2))
  165. hold on
  166. plot(lambda_vec(:,3))
  167. hold on
  168. plot(lambda_vec(:,4))
  169. legend('lambda_1','lambda_2','lambda_3','lambda_4')
  170. xlabel("Iterations")
  171. ylabel("Proposed Lambdas")
  172. title("German data, 4 lambdas")
  173.  
  174.  
  175.  
  176. %p_ir = betarnd(beta_beta - a, sum(ger_inf)-beta_beta+b);
  177. %p_ir_vec = [p_ir_vec, p_ir];
  178.  
  179. function f = prob(lambda,Y,kappa)
  180. alpha = 2;
  181. beta = 3;
  182. phi = 0.995;
  183. %Density function
  184. f = alpha*log(beta)-gammaln(alpha)+(alpha-1)*log(lambda)-beta*lambda+sum(gammaln(kappa+Y)-gammaln(Y+1)-gammaln(kappa)+kappa*log(1-phi)+Y*log(phi));
  185. end
  186.  
  187. function g = inverseProb(Y,kappa)
  188.  
  189. phi = 0.995;
  190. %Transform function when sampling for t
  191. g = sum(gammaln(kappa+Y)-gammaln(Y+1)-gammaln(kappa)+kappa*log(1-phi)+Y*log(phi));
  192. end
  193.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement