diff --git a/README.md b/README.md index c91658a..f57ca0b 100644 --- a/README.md +++ b/README.md @@ -353,7 +353,7 @@ xinit = simulate_states_init(map = env_init, model_move = model_move, datasets = datasets_fwd, model_obs_types = model_obs_types, - n_particle = 20_000, + n_particle = 2000, direction = "forward", output = "Vector"); @@ -373,7 +373,7 @@ xinit = simulate_states_init(map = env_init, model_move = model_move, datasets = datasets_bwd, model_obs_types = model_obs_types, - n_particle = 20_000, + n_particle = 2000, direction = "backward", output = "Vector"); @@ -390,60 +390,123 @@ The filter returns a `NamedTuple` that defines the time steps of the simulation, the simulated `State`s and other algorithm diagnostics. ``` julia -fwd -#> Patter.Particles(StateXY[StateXY(45.86025619506836, 709442.1497468759, 6.253006886936354e6) StateXY(44.46761703491211, 709332.1390635285, 6.252801146476332e6) … StateXY(161.7117919921875, 708114.3959652106, 6.255127655122086e6) StateXY(181.935302734375, 708769.6451302449, 6.255796490835802e6); StateXY(84.4729232788086, 709242.1497468759, 6.253506886936354e6) StateXY(68.53315734863281, 709242.1423982539, 6.253292068158658e6) … StateXY(194.80943298339844, 707801.5033526948, 6.255366971646948e6) StateXY(167.0137939453125, 708604.2128538049, 6.255100657586215e6); … ; StateXY(52.994747161865234, 709242.1497468759, 6.253006886936354e6) StateXY(47.834678649902344, 709259.8437022136, 6.252899700530086e6) … StateXY(184.45875549316406, 708772.2614253716, 6.255958962564314e6) StateXY(161.7117919921875, 708099.0028210192, 6.25512253584319e6); StateXY(55.42852783203125, 709442.1497468759, 6.253406886936354e6) StateXY(46.084407806396484, 709122.7430863595, 6.252603630971435e6) … StateXY(180.6695556640625, 708052.3013590107, 6.255278958512679e6) StateXY(198.59591674804688, 708290.0902363085, 6.25579496191721e6)], 720×4 DataFrame -#> Row │ timestep timestamp ess maxlp -#> │ Int64 DateTime Float64 Float64 -#> ─────┼────────────────────────────────────────────────────── -#> 1 │ 1 2016-03-17T01:50:00 8632.84 -4.93421 -#> 2 │ 2 2016-03-17T01:52:00 4290.88 -9.84869 -#> 3 │ 3 2016-03-17T01:54:00 2529.52 -14.7808 -#> 4 │ 4 2016-03-17T01:56:00 1656.77 -19.7892 -#> 5 │ 5 2016-03-17T01:58:00 990.413 -24.9454 -#> 6 │ 6 2016-03-17T02:00:00 13476.5 -4.89552 -#> 7 │ 7 2016-03-17T02:02:00 8417.5 -9.51912 -#> 8 │ 8 2016-03-17T02:04:00 5701.01 -14.9398 -#> ⋮ │ ⋮ ⋮ ⋮ ⋮ -#> 714 │ 714 2016-03-18T01:36:00 5437.28 -102.667 -#> 715 │ 715 2016-03-18T01:38:00 4906.03 -107.348 -#> 716 │ 716 2016-03-18T01:40:00 4427.57 -112.013 -#> 717 │ 717 2016-03-18T01:42:00 4007.73 -116.672 -#> 718 │ 718 2016-03-18T01:44:00 3705.9 -121.407 -#> 719 │ 719 2016-03-18T01:46:00 3437.94 -126.078 -#> 720 │ 720 2016-03-18T01:48:00 3176.48 -130.749 -#> 705 rows omitted, 1×6 DataFrame +# Forward run outputs +fwd.states +#> 1000×720 Matrix{StateXY}: +#> StateXY(45.8829, 7.09342e5, 6.25291e6) … StateXY(188.847, 708556.0, 6.25564e6) +#> StateXY(66.5209, 7.09142e5, 6.25311e6) StateXY(197.758, 7.08354e5, 6.25569e6) +#> StateXY(41.503, 7.09542e5, 6.25291e6) StateXY(148.489, 7.08357e5, 6.25413e6) +#> StateXY(83.2153, 7.09042e5, 6.25321e6) StateXY(185.685, 7.07762e5, 6.25459e6) +#> StateXY(36.0976, 7.09742e5, 6.25271e6) StateXY(156.188, 707140.0, 6.25435e6) +#> StateXY(139.183, 7.08642e5, 6.25351e6) … StateXY(154.859, 7.08873e5, 6.25503e6) +#> StateXY(46.8558, 7.08942e5, 6.25251e6) StateXY(194.684, 7.07544e5, 6.25516e6) +#> StateXY(46.5354, 7.09242e5, 6.25281e6) StateXY(193.147, 7.08309e5, 6.25625e6) +#> StateXY(58.245, 7.09042e5, 6.25291e6) StateXY(191.794, 7.07576e5, 6.25459e6) +#> StateXY(84.4729, 7.09242e5, 6.25351e6) StateXY(143.758, 7.0913e5, 6.25544e6) +#> ⋮ ⋱ +#> StateXY(60.0933, 7.09342e5, 6.25331e6) StateXY(157.43, 708992.0, 6.25539e6) +#> StateXY(68.5332, 7.09242e5, 6.25331e6) StateXY(179.343, 7.07264e5, 6.25473e6) +#> StateXY(55.2068, 7.09642e5, 6.25361e6) StateXY(199.453, 707926.0, 6.25602e6) +#> StateXY(56.538, 7.09342e5, 6.25321e6) StateXY(186.857, 7.08449e5, 6.25551e6) +#> StateXY(45.8603, 7.09442e5, 6.25301e6) … StateXY(162.852, 7.08859e5, 6.25523e6) +#> StateXY(53.0317, 7.09142e5, 6.25291e6) StateXY(168.835, 7.08599e5, 6.25697e6) +#> StateXY(51.6534, 7.09442e5, 6.25331e6) StateXY(192.736, 7.0906e5, 6.25679e6) +#> StateXY(45.8829, 7.09342e5, 6.25291e6) StateXY(151.282, 7.08221e5, 6.25496e6) +#> StateXY(59.7652, 7.09142e5, 6.25301e6) StateXY(135.019, 7.0876e5, 6.25355e6) +fwd.diagnostics +#> 720×4 DataFrame +#> Row │ timestep timestamp ess maxlp +#> │ Int64 DateTime Float64 Float64 +#> ─────┼──────────────────────────────────────────────────── +#> 1 │ 1 2016-03-17T01:50:00 871.187 -4.93421 +#> 2 │ 2 2016-03-17T01:52:00 1271.23 -4.91272 +#> 3 │ 3 2016-03-17T01:54:00 778.974 -9.82767 +#> 4 │ 4 2016-03-17T01:56:00 951.343 -4.55033 +#> 5 │ 5 2016-03-17T01:58:00 968.929 -4.91832 +#> 6 │ 6 2016-03-17T02:00:00 1318.74 -4.90221 +#> 7 │ 7 2016-03-17T02:02:00 823.489 -9.58653 +#> 8 │ 8 2016-03-17T02:04:00 933.039 -4.92097 +#> ⋮ │ ⋮ ⋮ ⋮ ⋮ +#> 714 │ 714 2016-03-18T01:36:00 1358.2 -37.2712 +#> 715 │ 715 2016-03-18T01:38:00 1242.68 -41.9696 +#> 716 │ 716 2016-03-18T01:40:00 1115.1 -46.6278 +#> 717 │ 717 2016-03-18T01:42:00 1008.86 -51.2927 +#> 718 │ 718 2016-03-18T01:44:00 930.228 -55.9539 +#> 719 │ 719 2016-03-18T01:46:00 1898.44 -4.658 +#> 720 │ 720 2016-03-18T01:48:00 1783.25 -9.31601 +#> 705 rows omitted +fwd.callstats +#> 1×6 DataFrame #> Row │ timestamp routine n_particle n_iter convergen ⋯ #> │ DateTime String Int64 Int64 Bool ⋯ #> ─────┼────────────────────────────────────────────────────────────────────────── -#> 1 │ 2025-02-12T22:12:47.147 filter: forward 20000 1 tr ⋯ -#> 2 columns omitted) -bwd -#> Patter.Particles(StateXY[StateXY(49.4275016784668, 709324.1163580867, 6.253028124107477e6) StateXY(68.53315734863281, 709241.3948847565, 6.253342095053049e6) … StateXY(138.89321899414062, 706722.7448082464, 6.249915966639847e6) StateXY(173.4532470703125, 708642.1497468759, 6.256906886936354e6); StateXY(41.503028869628906, 709585.2438444953, 6.2528651300111655e6) StateXY(74.88350677490234, 709036.702483497, 6.25307183254941e6) … StateXY(191.70333862304688, 708767.7636548029, 6.256542599757547e6) StateXY(158.78671264648438, 710142.1497468759, 6.269206886936354e6); … ; StateXY(80.03239440917969, 709130.1679870245, 6.253335135064113e6) StateXY(49.4275016784668, 709373.6902113371, 6.253015510400326e6) … StateXY(156.60055541992188, 708295.4359693856, 6.255025663692517e6) StateXY(186.96072387695312, 708342.1497468759, 6.267806886936354e6); StateXY(68.53315734863281, 709260.0354130833, 6.25330259580512e6) StateXY(52.982757568359375, 709357.0268316997, 6.25310554681857e6) … StateXY(175.41598510742188, 708388.3795827446, 6.266007418013366e6) StateXY(189.5762176513672, 708542.1497468759, 6.267606886936354e6)], 720×4 DataFrame +#> 1 │ 2025-02-12T22:37:48.450 filter: forward 2000 1 tr ⋯ +#> 2 columns omitted +fwd.callstats.convergence +#> 1-element Vector{Bool}: +#> 1 +fwd.callstats.time +#> 1-element Vector{Float64}: +#> 0.648 + +# Backward run outputs +bwd.states +#> 1000×720 Matrix{StateXY}: +#> StateXY(1.85675e-314, 2.51161e-314, 2.75044e-314) … StateXY(176.919, 7.07942e5, 6.26601e6) +#> StateXY(2.17775e-314, 1.97536e-317, 0.0) StateXY(178.939, 7.09242e5, 6.26781e6) +#> StateXY(-1.2162e6, -1.21608e6, -1.21596e6) StateXY(180.867, 7.09042e5, 6.26631e6) +#> StateXY(-1.21584e6, -1.21572e6, -1.2156e6) StateXY(132.345, 7.11142e5, 6.27061e6) +#> StateXY(-1.21548e6, -1.21536e6, -1.21524e6) StateXY(149.448, 7.09242e5, 6.25831e6) +#> StateXY(-1.21512e6, -1.215e6, -1.21488e6) … StateXY(155.992, 7.09842e5, 6.26861e6) +#> StateXY(-1.21476e6, -1.21464e6, -1.21452e6) StateXY(191.569, 7.07442e5, 6.26681e6) +#> StateXY(-1.2144e6, -1.21428e6, -1.21416e6) StateXY(178.48, 7.07342e5, 6.26711e6) +#> StateXY(-1.21404e6, -1.21392e6, -1.2138e6) StateXY(183.963, 7.07542e5, 6.26721e6) +#> StateXY(-1.21368e6, -1.21356e6, -1.21344e6) StateXY(144.53, 7.06742e5, 6.25011e6) +#> ⋮ ⋱ +#> StateXY(-860160.0, -860040.0, -859920.0) StateXY(162.061, 7.07942e5, 6.26531e6) +#> StateXY(-859800.0, -859680.0, -859560.0) StateXY(190.686, 7.08342e5, 6.26681e6) +#> StateXY(-859440.0, -859320.0, -859200.0) StateXY(186.824, 7.08642e5, 6.25571e6) +#> StateXY(-859080.0, -858960.0, -858840.0) StateXY(167.287, 7.08242e5, 6.26821e6) +#> StateXY(-858720.0, -858600.0, -858480.0) … StateXY(188.622, 7.08842e5, 6.25691e6) +#> StateXY(-858360.0, -858240.0, -858120.0) StateXY(191.973, 7.06142e5, 6.24931e6) +#> StateXY(-858000.0, -857880.0, -857760.0) StateXY(181.723, 7.08342e5, 6.25641e6) +#> StateXY(-857640.0, -857520.0, -857400.0) StateXY(186.239, 7.08642e5, 6.26641e6) +#> StateXY(-857280.0, -857160.0, -857040.0) StateXY(148.615, 7.04442e5, 6.24911e6) +bwd.diagnostics +#> 720×4 DataFrame #> Row │ timestep timestamp ess maxlp #> │ Int64 DateTime Float64 Float64 #> ─────┼──────────────────────────────────────────────────── -#> 1 │ 1 2016-03-17T01:50:00 629.83 -36.0651 -#> 2 │ 2 2016-03-17T01:52:00 1039.02 -31.1403 -#> 3 │ 3 2016-03-17T01:54:00 1812.93 -25.9866 -#> 4 │ 4 2016-03-17T01:56:00 2935.19 -20.2427 -#> 5 │ 5 2016-03-17T01:58:00 4716.56 -14.6123 -#> 6 │ 6 2016-03-17T02:00:00 7527.78 -9.60555 -#> 7 │ 7 2016-03-17T02:02:00 9471.85 -4.54043 -#> 8 │ 8 2016-03-17T02:04:00 663.9 -39.7029 +#> 1 │ 1 2016-03-17T01:50:00 NaN NaN +#> 2 │ 2 2016-03-17T01:52:00 NaN NaN +#> 3 │ 3 2016-03-17T01:54:00 NaN NaN +#> 4 │ 4 2016-03-17T01:56:00 NaN NaN +#> 5 │ 5 2016-03-17T01:58:00 NaN NaN +#> 6 │ 6 2016-03-17T02:00:00 NaN NaN +#> 7 │ 7 2016-03-17T02:02:00 NaN NaN +#> 8 │ 8 2016-03-17T02:04:00 NaN NaN #> ⋮ │ ⋮ ⋮ ⋮ ⋮ -#> 714 │ 714 2016-03-18T01:36:00 9878.34 -32.6128 -#> 715 │ 715 2016-03-18T01:38:00 10266.6 -27.9485 -#> 716 │ 716 2016-03-18T01:40:00 11050.2 -23.2906 -#> 717 │ 717 2016-03-18T01:42:00 12267.2 -18.6321 -#> 718 │ 718 2016-03-18T01:44:00 13956.5 -13.974 -#> 719 │ 719 2016-03-18T01:46:00 16005.6 -9.31601 -#> 720 │ 720 2016-03-18T01:48:00 18811.5 -4.658 -#> 705 rows omitted, 1×6 DataFrame +#> 714 │ 714 2016-03-18T01:36:00 1025.64 -32.6163 +#> 715 │ 715 2016-03-18T01:38:00 1062.47 -27.9509 +#> 716 │ 716 2016-03-18T01:40:00 1144.41 -23.2914 +#> 717 │ 717 2016-03-18T01:42:00 1259.77 -18.6324 +#> 718 │ 718 2016-03-18T01:44:00 1435.05 -13.974 +#> 719 │ 719 2016-03-18T01:46:00 1625.19 -9.31601 +#> 720 │ 720 2016-03-18T01:48:00 1884.65 -4.658 +#> 705 rows omitted +bwd.callstats +#> 1×6 DataFrame #> Row │ timestamp routine n_particle n_iter converge ⋯ #> │ DateTime String Int64 Int64 Bool ⋯ #> ─────┼────────────────────────────────────────────────────────────────────────── -#> 1 │ 2025-02-12T22:12:49.063 filter: backward 20000 1 t ⋯ -#> 2 columns omitted) +#> 1 │ 2025-02-12T22:37:49.249 filter: backward 2000 1 fa ⋯ +#> 2 columns omitted +bwd.callstats.convergence +#> 1-element Vector{Bool}: +#> 0 +bwd.callstats.time +#> 1-element Vector{Float64}: +#> 0.352 ``` ## Particle smoother @@ -460,34 +523,68 @@ smo = particle_smoother_two_filter(timeline = timeline, xfwd = fwd.states[1:n_particle, :], xbwd = bwd.states[1:n_particle, :], model_move = model_move, - n_sim = 100); -smo -#> Patter.Particles(StateXY[StateXY(49.4275016784668, 709324.1163580867, 6.253028124107477e6) StateXY(91.54701232910156, 709078.0004575436, 6.253311913556286e6) … StateXY(150.06092834472656, 708160.3289271451, 6.254332516569155e6) StateXY(181.935302734375, 708769.6451302449, 6.255796490835802e6); StateXY(41.503028869628906, 709585.2438444953, 6.2528651300111655e6) StateXY(63.35368728637695, 709214.4805125415, 6.2532249261305975e6) … StateXY(198.8185272216797, 708183.017069019, 6.255871241093533e6) StateXY(167.0137939453125, 708604.2128538049, 6.255100657586215e6); … ; StateXY(48.40016174316406, 709163.4728786222, 6.25271263937561e6) StateXY(45.8829460144043, 709357.9380403345, 6.252939584043968e6) … StateXY(166.38294982910156, 708444.2746647486, 6.2551082914978415e6) StateXY(183.91612243652344, 707468.1932861817, 6.254355097287358e6); StateXY(47.79129409790039, 709430.136972388, 6.253122266539449e6) StateXY(68.53315734863281, 709258.605438284, 6.253340363569799e6) … StateXY(198.90406799316406, 707831.8869685325, 6.255975063517972e6) StateXY(185.88182067871094, 708081.4631690378, 6.255362176468334e6)], 720×4 DataFrame + vmap = nothing, + n_sim = 100, + cache = true); + +# Smooth outputs +smo.states +#> 750×720 Matrix{StateXY}: +#> StateXY(1.85675e-314, 2.51161e-314, 2.75044e-314) … StateXY(188.847, 708556.0, 6.25564e6) +#> StateXY(2.17775e-314, 1.97536e-317, 0.0) StateXY(197.758, 7.08354e5, 6.25569e6) +#> StateXY(-1.2162e6, -1.21608e6, -1.21596e6) StateXY(148.489, 7.08357e5, 6.25413e6) +#> StateXY(-1.21584e6, -1.21572e6, -1.2156e6) StateXY(185.685, 7.07762e5, 6.25459e6) +#> StateXY(-1.21548e6, -1.21536e6, -1.21524e6) StateXY(156.188, 707140.0, 6.25435e6) +#> StateXY(-1.21512e6, -1.215e6, -1.21488e6) … StateXY(154.859, 7.08873e5, 6.25503e6) +#> StateXY(-1.21476e6, -1.21464e6, -1.21452e6) StateXY(194.684, 7.07544e5, 6.25516e6) +#> StateXY(-1.2144e6, -1.21428e6, -1.21416e6) StateXY(193.147, 7.08309e5, 6.25625e6) +#> StateXY(-1.21404e6, -1.21392e6, -1.2138e6) StateXY(191.794, 7.07576e5, 6.25459e6) +#> StateXY(-1.21368e6, -1.21356e6, -1.21344e6) StateXY(143.758, 7.0913e5, 6.25544e6) +#> ⋮ ⋱ +#> StateXY(-950160.0, -950040.0, -949920.0) StateXY(156.14, 7.07771e5, 6.2541e6) +#> StateXY(-949800.0, -949680.0, -949560.0) StateXY(188.297, 7.07872e5, 6.25514e6) +#> StateXY(-949440.0, -949320.0, -949200.0) StateXY(147.888, 7.07284e5, 6.25544e6) +#> StateXY(-949080.0, -948960.0, -948840.0) StateXY(145.139, 7.08266e5, 6.2545e6) +#> StateXY(-948720.0, -948600.0, -948480.0) … StateXY(175.94, 7.07905e5, 6.25489e6) +#> StateXY(-948360.0, -948240.0, -948120.0) StateXY(197.11, 7.07837e5, 6.25553e6) +#> StateXY(-948000.0, -947880.0, -947760.0) StateXY(184.627, 7.08884e5, 6.25712e6) +#> StateXY(-947640.0, -947520.0, -947400.0) StateXY(188.208, 7.0792e5, 6.25527e6) +#> StateXY(-947280.0, -947160.0, -947040.0) StateXY(137.22, 7.08909e5, 6.25457e6) +smo.diagnostics +#> 720×4 DataFrame #> Row │ timestep timestamp ess maxlp #> │ Int64 DateTime Float64 Float64 #> ─────┼───────────────────────────────────────────────── #> 1 │ 1 2016-03-17T01:50:00 750.0 NaN -#> 2 │ 2 2016-03-17T01:52:00 661.27 NaN -#> 3 │ 3 2016-03-17T01:54:00 601.97 NaN -#> 4 │ 4 2016-03-17T01:56:00 406.421 NaN -#> 5 │ 5 2016-03-17T01:58:00 667.998 NaN -#> 6 │ 6 2016-03-17T02:00:00 639.354 NaN -#> 7 │ 7 2016-03-17T02:02:00 444.735 NaN -#> 8 │ 8 2016-03-17T02:04:00 626.99 NaN +#> 2 │ 2 2016-03-17T01:52:00 NaN NaN +#> 3 │ 3 2016-03-17T01:54:00 NaN NaN +#> 4 │ 4 2016-03-17T01:56:00 NaN NaN +#> 5 │ 5 2016-03-17T01:58:00 NaN NaN +#> 6 │ 6 2016-03-17T02:00:00 NaN NaN +#> 7 │ 7 2016-03-17T02:02:00 NaN NaN +#> 8 │ 8 2016-03-17T02:04:00 NaN NaN #> ⋮ │ ⋮ ⋮ ⋮ ⋮ -#> 714 │ 714 2016-03-18T01:36:00 154.892 NaN -#> 715 │ 715 2016-03-18T01:38:00 142.048 NaN -#> 716 │ 716 2016-03-18T01:40:00 150.02 NaN -#> 717 │ 717 2016-03-18T01:42:00 160.671 NaN -#> 718 │ 718 2016-03-18T01:44:00 189.521 NaN -#> 719 │ 719 2016-03-18T01:46:00 160.545 NaN +#> 714 │ 714 2016-03-18T01:36:00 118.385 NaN +#> 715 │ 715 2016-03-18T01:38:00 127.608 NaN +#> 716 │ 716 2016-03-18T01:40:00 143.037 NaN +#> 717 │ 717 2016-03-18T01:42:00 136.04 NaN +#> 718 │ 718 2016-03-18T01:44:00 148.45 NaN +#> 719 │ 719 2016-03-18T01:46:00 150.694 NaN #> 720 │ 720 2016-03-18T01:48:00 750.0 NaN -#> 705 rows omitted, 1×6 DataFrame +#> 705 rows omitted +smo.callstats +#> 1×6 DataFrame #> Row │ timestamp routine n_particle n_iter con ⋯ #> │ DateTime String Int64 Float64 Boo ⋯ #> ─────┼────────────────────────────────────────────────────────────────────────── -#> 1 │ 2025-02-12T22:12:51.120 smoother: two-filter 750 NaN ⋯ -#> 2 columns omitted) +#> 1 │ 2025-02-12T22:37:50.663 smoother: two-filter 750 NaN ⋯ +#> 2 columns omitted +smo.callstats.convergence +#> 1-element Vector{Bool}: +#> 0 +smo.callstats.time +#> 1-element Vector{Float64}: +#> 16.03 ``` # Mapping @@ -516,6 +613,7 @@ ud <- map_dens(.map = map, .coord = smo$states, .sigma = bw.h, .verbose = FALSE)$ud +#> Warning: 84660 points were rejected as lying outside the specified window # Add home range map_hr_home(ud, .add = TRUE) diff --git a/docs/figures/README-unnamed-chunk-13-2.png b/docs/figures/README-unnamed-chunk-13-2.png index 808cb41..ac499bc 100644 Binary files a/docs/figures/README-unnamed-chunk-13-2.png and b/docs/figures/README-unnamed-chunk-13-2.png differ