Logistic curve fitting in epidemiology: Difference between revisions

Added Wren
(Added Wren)
Line 283:
The r for the world Covid-19 data is: [0.11230218] , with covariance of [[2.46164331e-08]]
The calculated R0 is then [3.8482793]
</pre>
 
=={{header|Wren}}==
{{trans|Phix}}
<lang ecmascript>var K = 7800000000 // approx world population
var n0 = 27 // number of cases at day 0
 
var y = [
27, 27, 27, 44, 44, 59, 59, 59, 59, 59, 59, 59, 59, 60, 60,
61, 61, 66, 83, 219, 239, 392, 534, 631, 897, 1350, 2023,
2820, 4587, 6067, 7823, 9826, 11946, 14554, 17372, 20615,
24522, 28273, 31491, 34933, 37552, 40540, 43105, 45177,
60328, 64543, 67103, 69265, 71332, 73327, 75191, 75723,
76719, 77804, 78812, 79339, 80132, 80995, 82101, 83365,
85203, 87024, 89068, 90664, 93077, 95316, 98172, 102133,
105824, 109695, 114232, 118610, 125497, 133852, 143227,
151367, 167418, 180096, 194836, 213150, 242364, 271106,
305117, 338133, 377918, 416845, 468049, 527767, 591704,
656866, 715353, 777796, 851308, 928436, 1000249, 1082054,
1174652
]
 
var exp = Fn.new { |x|
var e = 2.718281828459045
return e.pow(x)
}
 
var f = Fn.new { |r|
var sq = 0
for (i in 0...y.count) {
var eri = exp.call(r*i)
var dst = (n0*eri)/(1+n0*(eri-1)/K) - y[i]
sq = sq + dst * dst
}
return sq
}
 
var solve = Fn.new { |f, guess, epsilon|
var f0 = f.call(guess)
var delta = guess
var factor = 2 // double until f0 best then halve until delta <= epsilon
while (delta > epsilon) {
var nf = f.call(guess - delta)
if (nf < f0) {
f0 = nf
guess = guess - delta
} else {
nf = f.call(guess + delta)
if (nf < f0) {
f0 = nf
guess = guess + delta
} else {
factor = 0.5
}
}
delta = delta * factor
}
return guess
}
 
var r = (solve.call(f, 0.5, 0) * 1e10).round / 1e10
var R0 = (exp.call(12 * r) * 1e8).round / 1e8
System.print("r = %(r), R0 = %(R0)")</lang>
 
{{out}}
<pre>
r = 0.1123021757, R0 = 3.84827928
</pre>
9,479

edits