The introduction employed a simplistic expemple of food web to familiarize the user with the basic commands and options of the EcoDiet package. Here we will use a more realistic example (although still artificial!) to run the different EcoDiet configurations, compare their results and hence higlight the complementarity in the different data used.
The data corresponds to 10 trophic groups with stomach content data, and very distinct isotopic measures.
realistic_stomach_data_path <- system.file("extdata", "realistic_stomach_data.csv",
package = "EcoDiet")
realistic_stomach_data <- read.csv(realistic_stomach_data_path)
knitr::kable(realistic_stomach_data)
X | Cod | Pout | Sardine | Shrimps | Crabs | Bivalves | Worms | Zooplankton | Phytoplankton | Detritus |
---|---|---|---|---|---|---|---|---|---|---|
Cod | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Pout | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Sardine | 9 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Shrimps | 4 | 4 | 29 | 0 | 24 | 0 | 0 | 0 | 0 | 0 |
Crabs | 1 | 24 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Bivalves | 0 | 3 | 0 | 0 | 11 | 0 | 0 | 0 | 0 | 0 |
Worms | 16 | 30 | 0 | 1 | 24 | 0 | 0 | 0 | 0 | 0 |
Zooplankton | 0 | 27 | 6 | 3 | 0 | 0 | 0 | 0 | 0 | 0 |
Phytoplankton | 0 | 0 | 14 | 10 | 0 | 16 | 0 | 20 | 0 | 0 |
Detritus | 0 | 0 | 0 | 12 | 19 | 18 | 18 | 0 | 0 | 0 |
full | 21 | 30 | 29 | 19 | 29 | 27 | 18 | 20 | 0 | 0 |
realistic_biotracer_data_path <- system.file("extdata", "realistic_biotracer_data.csv",
package = "EcoDiet")
realistic_biotracer_data <- read.csv(realistic_biotracer_data_path)
knitr::kable(realistic_biotracer_data[c(1:3, 31:33, 61:63), ])
group | d13C | d15N | |
---|---|---|---|
1 | Cod | -12.94144 | 19.18913 |
2 | Cod | -14.96070 | 20.23939 |
3 | Cod | -13.77822 | 19.48809 |
31 | Pout | -13.47127 | 18.57353 |
32 | Pout | -13.16888 | 17.58714 |
33 | Pout | -14.23085 | 17.38938 |
61 | Sardine | -14.56111 | 16.95231 |
62 | Sardine | -15.04729 | 17.15197 |
63 | Sardine | -14.63688 | 16.90906 |
library(EcoDiet)
plot_data(biotracer_data = realistic_biotracer_data,
stomach_data = realistic_stomach_data)
#> Warning: Use of `biotracer_data$group` is discouraged.
#> ℹ Use `group` instead.
Yes, we are aware that isotopic data is usually messier, but isn’t it a beautiful plot?
We define the configuration we are in, and preprocess the data:
literature_configuration <- FALSE
data <- preprocess_data(biotracer_data = realistic_biotracer_data,
trophic_discrimination_factor = c(0.8, 3.4),
literature_configuration = literature_configuration,
stomach_data = realistic_stomach_data)
#> The model will investigate the following trophic links:
#> Bivalves Cod Crabs Detritus Phytoplankton Pout Sardine Shrimps
#> Bivalves 0 0 1 0 0 1 0 0
#> Cod 0 0 0 0 0 0 0 0
#> Crabs 0 1 0 0 0 1 0 0
#> Detritus 1 0 1 0 0 0 0 1
#> Phytoplankton 1 0 0 0 0 0 1 1
#> Pout 0 1 0 0 0 0 0 0
#> Sardine 0 1 0 0 0 0 0 0
#> Shrimps 0 1 1 0 0 1 1 0
#> Worms 0 1 1 0 0 1 0 1
#> Zooplankton 0 0 0 0 0 1 1 1
#> Worms Zooplankton
#> Bivalves 0 0
#> Cod 0 0
#> Crabs 0 0
#> Detritus 1 0
#> Phytoplankton 0 1
#> Pout 0 0
#> Sardine 0 0
#> Shrimps 0 0
#> Worms 0 0
#> Zooplankton 0 0
In this configuration, priors are set for each trophic link identified as plausible by the user but the priors are not informed by literature data, and are thus uninformative:
The marginal prior distributions have different shape depending on the variables:
it is flat or uniform for η, the probabilities that a trophic link exists (all the probabilities of existence are thus equiprobable),
the marginal distributions for each diet proportion Π are peaking at zero, although the joint distribution for Πs is a flat Dirichlet prior, because all the diet proportions must sum to one.
We define the model, and test if it compiles well with a few iterations and adaptation steps:
filename <- "mymodel.txt"
write_model(file.name = filename, literature_configuration = literature_configuration, print.model = F)
mcmc_output <- run_model(filename, data, run_param="test")
#>
#> Processing function input.......
#>
#> Done.
#>
#> Compiling model graph
#> Resolving undeclared variables
#> Allocating nodes
#> Graph information:
#> Observed stochastic nodes: 316
#> Unobserved stochastic nodes: 125
#> Total graph size: 1104
#>
#> Initializing model
#>
#> Adaptive phase, 500 iterations x 3 chains
#> If no progress bar appears JAGS has decided not to adapt
#>
#>
#> Burn-in phase, 500 iterations x 3 chains
#>
#>
#> Sampling from joint posterior, 500 iterations x 3 chains
#>
#>
#> Calculating statistics.......
#>
#> Done.
#>
#> /!\ Convergence warning:
#> Out of the 51 variables, 16 variables have a Gelman-Rubin statistic > 1.1.
#> You may consider modifying the model run settings.
#> The variables with the poorest convergence are: PI[7,2], PI[6,2], PI[10,7], PI[4,8], PI[3,2], PI[5,7], PI[8,2], PI[8,7], PI[9,8], PI[5,1].
#> JAGS output for model 'mymodel.txt', generated by jagsUI.
#> Estimates based on 3 chains of 1000 iterations,
#> adaptation = 500 iterations (sufficient),
#> burn-in = 500 iterations and thin rate = 1,
#> yielding 1500 total samples from the joint posterior.
#> MCMC ran for 0.196 minutes at time 2024-11-21 06:31:23.00638.
#>
#> mean sd 2.5% 50% 97.5% overlap0 f Rhat n.eff
#> eta[4,1] 0.664 0.085 0.493 0.666 0.819 FALSE 1 1.001 1364
#> eta[5,1] 0.587 0.091 0.411 0.587 0.758 FALSE 1 1.008 238
#> eta[3,2] 0.086 0.057 0.009 0.074 0.217 FALSE 1 1.003 589
#> eta[6,2] 0.088 0.058 0.011 0.077 0.225 FALSE 1 1.022 155
#> eta[7,2] 0.441 0.100 0.252 0.438 0.635 FALSE 1 1.032 66
#> eta[8,2] 0.227 0.084 0.090 0.216 0.417 FALSE 1 1.017 141
#> eta[9,2] 0.730 0.092 0.530 0.738 0.885 FALSE 1 1.008 231
#> eta[1,3] 0.395 0.088 0.225 0.391 0.576 FALSE 1 1.002 787
#> eta[4,3] 0.650 0.084 0.478 0.652 0.808 FALSE 1 1.004 725
#> eta[8,3] 0.808 0.067 0.666 0.813 0.922 FALSE 1 1.003 726
#> eta[9,3] 0.811 0.068 0.664 0.818 0.927 FALSE 1 1.000 1500
#> eta[1,6] 0.122 0.056 0.037 0.115 0.247 FALSE 1 1.000 1500
#> eta[3,6] 0.784 0.072 0.638 0.789 0.904 FALSE 1 1.002 1126
#> eta[8,6] 0.155 0.061 0.056 0.147 0.294 FALSE 1 1.000 1500
#> eta[9,6] 0.970 0.028 0.896 0.979 0.999 FALSE 1 1.000 1500
#> eta[10,6] 0.877 0.057 0.748 0.884 0.966 FALSE 1 1.000 1500
#> eta[5,7] 0.487 0.090 0.324 0.485 0.669 FALSE 1 1.002 666
#> eta[8,7] 0.966 0.032 0.885 0.975 0.999 FALSE 1 1.006 703
#> eta[10,7] 0.233 0.075 0.106 0.226 0.393 FALSE 1 1.013 153
#> eta[4,8] 0.603 0.106 0.394 0.606 0.801 FALSE 1 1.014 140
#> eta[5,8] 0.520 0.104 0.326 0.519 0.723 FALSE 1 1.015 132
#> eta[9,8] 0.098 0.064 0.012 0.084 0.255 FALSE 1 1.025 90
#> eta[10,8] 0.191 0.082 0.059 0.183 0.368 FALSE 1 1.003 551
#> eta[4,9] 0.951 0.048 0.824 0.965 0.999 FALSE 1 1.001 1500
#> eta[5,10] 0.956 0.042 0.843 0.968 0.999 FALSE 1 1.001 1500
#> PI[4,1] 0.415 0.325 0.000 0.373 1.000 FALSE 1 1.182 18
#> PI[5,1] 0.585 0.325 0.000 0.627 1.000 FALSE 1 1.182 18
#> PI[3,2] 0.056 0.162 0.000 0.000 0.622 FALSE 1 1.556 10
#> PI[6,2] 0.128 0.266 0.000 0.000 0.863 FALSE 1 1.992 5
#> PI[7,2] 0.398 0.372 0.000 0.398 0.995 FALSE 1 2.766 4
#> PI[8,2] 0.261 0.330 0.000 0.070 0.981 FALSE 1 1.383 9
#> PI[9,2] 0.156 0.172 0.000 0.102 0.598 FALSE 1 1.097 26
#> PI[1,3] 0.264 0.246 0.000 0.213 0.920 FALSE 1 1.151 18
#> PI[4,3] 0.205 0.154 0.000 0.188 0.529 FALSE 1 1.064 37
#> PI[8,3] 0.242 0.181 0.000 0.224 0.635 FALSE 1 1.106 23
#> PI[9,3] 0.289 0.218 0.000 0.254 0.756 FALSE 1 1.044 56
#> PI[1,6] 0.024 0.067 0.000 0.000 0.208 FALSE 1 1.160 36
#> PI[3,6] 0.331 0.187 0.005 0.328 0.705 FALSE 1 1.002 1500
#> PI[8,6] 0.044 0.093 0.000 0.001 0.328 FALSE 1 1.025 396
#> PI[9,6] 0.327 0.205 0.021 0.305 0.775 FALSE 1 1.006 374
#> PI[10,6] 0.274 0.187 0.000 0.253 0.667 FALSE 1 1.005 591
#> PI[5,7] 0.225 0.191 0.000 0.218 0.613 FALSE 1 1.463 8
#> PI[8,7] 0.478 0.237 0.062 0.486 0.998 FALSE 1 1.353 9
#> PI[10,7] 0.297 0.312 0.000 0.184 0.911 FALSE 1 1.949 5
#> PI[4,8] 0.143 0.172 0.000 0.077 0.578 FALSE 1 1.594 7
#> PI[5,8] 0.271 0.207 0.000 0.248 0.732 FALSE 1 1.156 19
#> PI[9,8] 0.244 0.247 0.000 0.188 0.909 FALSE 1 1.317 12
#> PI[10,8] 0.341 0.244 0.000 0.317 0.879 FALSE 1 1.119 24
#> PI[4,9] 1.000 0.000 1.000 1.000 1.000 FALSE 1 NA 1
#> PI[5,10] 1.000 0.000 1.000 1.000 1.000 FALSE 1 NA 1
#> deviance 866.573 11.206 846.335 866.144 889.857 FALSE 1 1.014 151
#>
#> **WARNING** Some Rhat values could not be calculated.
#> **WARNING** Rhat values indicate convergence failure.
#> Rhat is the potential scale reduction factor (at convergence, Rhat=1).
#> For each parameter, n.eff is a crude measure of effective sample size.
#>
#> overlap0 checks if 0 falls in the parameter's 95% credible interval.
#> f is the proportion of the posterior with the same sign as the mean;
#> i.e., our confidence that the parameter is positive or negative.
#>
#> DIC info: (pD = var(deviance)/2)
#> pD = 62 and DIC = 928.601
#> DIC is an estimate of expected predictive error (lower is better).
You should now try to run the model until it converges (it should take around half an hour to run, so we won’t do it in this vignette):
Here are the figures corresponding to the results that have converged:
You can also plot the results for specific prey if you want a clearer figure:
We now change the configuration to add literature data to the model:
realistic_literature_diets_path <- system.file("extdata", "realistic_literature_diets.csv",
package = "EcoDiet")
realistic_literature_diets <- read.csv(realistic_literature_diets_path)
knitr::kable(realistic_literature_diets)
X | Cod | Pout | Sardine | Shrimps | Crabs | Bivalves | Worms | Zooplankton | Phytoplankton | Detritus |
---|---|---|---|---|---|---|---|---|---|---|
Cod | 0.0000000 | 0.0000000 | 0.0000000 | 0.0000000 | 0.0000000 | 0.0000000 | 0.0 | 0.0 | 0 | 0 |
Pout | 0.4275065 | 0.0000000 | 0.0000000 | 0.0000000 | 0.0000000 | 0.0000000 | 0.0 | 0.0 | 0 | 0 |
Sardine | 0.3603675 | 0.0000000 | 0.0000000 | 0.0000000 | 0.0000000 | 0.0000000 | 0.0 | 0.0 | 0 | 0 |
Shrimps | 0.0300737 | 0.5295859 | 0.0002143 | 0.0000000 | 0.0082107 | 0.0000000 | 0.0 | 0.0 | 0 | 0 |
Crabs | 0.1410430 | 0.3332779 | 0.0000000 | 0.0000000 | 0.0000000 | 0.0000000 | 0.0 | 0.0 | 0 | 0 |
Bivalves | 0.0000000 | 0.0006130 | 0.0000000 | 0.0000000 | 0.3441081 | 0.0000000 | 0.0 | 0.0 | 0 | 0 |
Worms | 0.0410093 | 0.1023676 | 0.0000000 | 0.0171336 | 0.4435377 | 0.0000000 | 0.0 | 0.0 | 0 | 0 |
Zooplankton | 0.0000000 | 0.0341557 | 0.7381375 | 0.9121505 | 0.0000000 | 0.0000000 | 0.0 | 0.0 | 0 | 0 |
Phytoplankton | 0.0000000 | 0.0000000 | 0.2616482 | 0.0000610 | 0.0000000 | 0.9966847 | 0.0 | 1.0 | 0 | 0 |
Detritus | 0.0000000 | 0.0000000 | 0.0000000 | 0.0706550 | 0.2041434 | 0.0033153 | 1.0 | 0.0 | 0 | 0 |
pedigree | 0.8000000 | 0.1000000 | 0.5000000 | 0.3000000 | 0.7000000 | 0.1000000 | 0.2 | 0.2 | 1 | 1 |
data <- preprocess_data(biotracer_data = realistic_biotracer_data,
trophic_discrimination_factor = c(0.8, 3.4),
literature_configuration = literature_configuration,
stomach_data = realistic_stomach_data,
literature_diets = realistic_literature_diets,
nb_literature = 12,
literature_slope = 0.5)
#> The model will investigate the following trophic links:
#> Bivalves Cod Crabs Detritus Phytoplankton Pout Sardine Shrimps
#> Bivalves 0 0 1 0 0 1 0 0
#> Cod 0 0 0 0 0 0 0 0
#> Crabs 0 1 0 0 0 1 0 0
#> Detritus 1 0 1 0 0 0 0 1
#> Phytoplankton 1 0 0 0 0 0 1 1
#> Pout 0 1 0 0 0 0 0 0
#> Sardine 0 1 0 0 0 0 0 0
#> Shrimps 0 1 1 0 0 1 1 0
#> Worms 0 1 1 0 0 1 0 1
#> Zooplankton 0 0 0 0 0 1 1 1
#> Worms Zooplankton
#> Bivalves 0 0
#> Cod 0 0
#> Crabs 0 0
#> Detritus 1 0
#> Phytoplankton 0 1
#> Pout 0 0
#> Sardine 0 0
#> Shrimps 0 0
#> Worms 0 0
#> Zooplankton 0 0
Now we see that the prior distributions are informed by the literature data:
when the literature diet input is > 0, the trophic link probabilities η are shifted toward one. Here this is the case for all prey but we could imagine that the user identify a species as a plausible prey whereas it has not been observed being consumed by the predator in the literature. In that case, the literature diet of 0 would drive η toward 0.
the average prior for the diet proportions Π is directly the literature diet input.
Again, we verify that the model compiles well:
filename <- "mymodel_literature.txt"
write_model(file.name = filename, literature_configuration = literature_configuration, print.model = F)
mcmc_output <- run_model(filename, data, run_param="test")
#>
#> Processing function input.......
#>
#> Done.
#>
#> Compiling model graph
#> Resolving undeclared variables
#> Allocating nodes
#> Graph information:
#> Observed stochastic nodes: 316
#> Unobserved stochastic nodes: 125
#> Total graph size: 1594
#>
#> Initializing model
#>
#> Adaptive phase, 500 iterations x 3 chains
#> If no progress bar appears JAGS has decided not to adapt
#>
#>
#> Burn-in phase, 500 iterations x 3 chains
#>
#>
#> Sampling from joint posterior, 500 iterations x 3 chains
#>
#>
#> Calculating statistics.......
#>
#> Done.
#>
#> /!\ Convergence warning:
#> Out of the 51 variables, 19 variables have a Gelman-Rubin statistic > 1.1.
#> You may consider modifying the model run settings.
#> The variables with the poorest convergence are: PI[8,6], PI[9,8], PI[5,1], PI[4,1], PI[9,3], PI[3,6], PI[3,2], PI[1,3], PI[10,8], PI[7,2].
#> JAGS output for model 'mymodel_literature.txt', generated by jagsUI.
#> Estimates based on 3 chains of 1000 iterations,
#> adaptation = 500 iterations (sufficient),
#> burn-in = 500 iterations and thin rate = 1,
#> yielding 1500 total samples from the joint posterior.
#> MCMC ran for 0.197 minutes at time 2024-11-21 06:31:37.734993.
#>
#> mean sd 2.5% 50% 97.5% overlap0 f Rhat n.eff
#> eta[4,1] 0.667 0.084 0.502 0.670 0.820 FALSE 1 1.000 1500
#> eta[5,1] 0.607 0.087 0.432 0.612 0.763 FALSE 1 1.007 304
#> eta[3,2] 0.360 0.082 0.210 0.357 0.522 FALSE 1 1.002 929
#> eta[6,2] 0.358 0.082 0.207 0.350 0.528 FALSE 1 1.003 595
#> eta[7,2] 0.589 0.085 0.422 0.593 0.744 FALSE 1 1.009 221
#> eta[8,2] 0.451 0.086 0.287 0.449 0.620 FALSE 1 1.005 1010
#> eta[9,2] 0.811 0.070 0.659 0.817 0.924 FALSE 1 1.009 311
#> eta[1,3] 0.519 0.079 0.370 0.518 0.673 FALSE 1 1.007 262
#> eta[4,3] 0.718 0.071 0.575 0.724 0.847 FALSE 1 1.000 1500
#> eta[8,3] 0.848 0.057 0.721 0.854 0.943 FALSE 1 1.000 1500
#> eta[9,3] 0.849 0.057 0.723 0.856 0.941 FALSE 1 1.003 786
#> eta[1,6] 0.158 0.065 0.056 0.149 0.306 FALSE 1 1.000 1500
#> eta[3,6] 0.789 0.069 0.644 0.795 0.907 FALSE 1 1.003 465
#> eta[8,6] 0.191 0.067 0.078 0.184 0.344 FALSE 1 1.034 67
#> eta[9,6] 0.970 0.028 0.899 0.979 0.999 FALSE 1 1.000 1500
#> eta[10,6] 0.882 0.054 0.764 0.889 0.964 FALSE 1 1.001 1500
#> eta[5,7] 0.563 0.080 0.402 0.562 0.715 FALSE 1 1.000 1500
#> eta[8,7] 0.972 0.027 0.902 0.981 0.999 FALSE 1 0.999 1500
#> eta[10,7] 0.366 0.078 0.220 0.363 0.529 FALSE 1 1.002 1500
#> eta[4,8] 0.673 0.093 0.489 0.676 0.843 FALSE 1 1.000 1500
#> eta[5,8] 0.590 0.097 0.399 0.590 0.777 FALSE 1 1.000 1500
#> eta[9,8] 0.229 0.081 0.092 0.221 0.398 FALSE 1 1.002 1500
#> eta[10,8] 0.313 0.092 0.151 0.309 0.512 FALSE 1 1.002 1500
#> eta[4,9] 0.957 0.042 0.847 0.969 0.999 FALSE 1 1.003 1500
#> eta[5,10] 0.960 0.039 0.856 0.972 0.999 FALSE 1 0.999 1500
#> PI[4,1] 0.139 0.287 0.000 0.000 0.995 FALSE 1 1.436 10
#> PI[5,1] 0.861 0.287 0.005 1.000 1.000 FALSE 1 1.436 10
#> PI[3,2] 0.283 0.323 0.000 0.156 0.983 FALSE 1 1.415 9
#> PI[6,2] 0.344 0.328 0.000 0.304 0.958 FALSE 1 1.173 16
#> PI[7,2] 0.195 0.299 0.000 0.000 0.946 FALSE 1 1.361 10
#> PI[8,2] 0.130 0.200 0.000 0.039 0.763 FALSE 1 1.199 20
#> PI[9,2] 0.047 0.091 0.000 0.003 0.302 FALSE 1 1.056 184
#> PI[1,3] 0.342 0.284 0.000 0.305 0.932 FALSE 1 1.393 9
#> PI[4,3] 0.113 0.122 0.000 0.079 0.403 FALSE 1 1.091 28
#> PI[8,3] 0.011 0.031 0.000 0.000 0.107 FALSE 1 1.112 70
#> PI[9,3] 0.533 0.296 0.000 0.540 0.999 FALSE 1 1.434 8
#> PI[1,6] 0.029 0.085 0.000 0.000 0.338 FALSE 1 1.183 26
#> PI[3,6] 0.345 0.270 0.000 0.322 0.915 FALSE 1 1.431 8
#> PI[8,6] 0.265 0.331 0.000 0.090 0.990 FALSE 1 2.882 4
#> PI[9,6] 0.279 0.244 0.000 0.254 0.788 FALSE 1 1.121 22
#> PI[10,6] 0.082 0.157 0.000 0.005 0.581 FALSE 1 1.207 17
#> PI[5,7] 0.099 0.159 0.000 0.010 0.555 FALSE 1 1.024 97
#> PI[8,7] 0.087 0.189 0.000 0.000 0.714 FALSE 1 1.239 17
#> PI[10,7] 0.813 0.268 0.015 0.934 1.000 FALSE 1 1.137 24
#> PI[4,8] 0.221 0.241 0.000 0.135 0.805 FALSE 1 1.052 82
#> PI[5,8] 0.092 0.168 0.000 0.010 0.592 FALSE 1 1.214 23
#> PI[9,8] 0.119 0.230 0.000 0.001 0.812 FALSE 1 1.555 8
#> PI[10,8] 0.567 0.333 0.000 0.627 0.999 FALSE 1 1.388 10
#> PI[4,9] 1.000 0.000 1.000 1.000 1.000 FALSE 1 NA 1
#> PI[5,10] 1.000 0.000 1.000 1.000 1.000 FALSE 1 NA 1
#> deviance 866.127 11.445 845.890 865.288 890.411 FALSE 1 1.008 221
#>
#> **WARNING** Some Rhat values could not be calculated.
#> **WARNING** Rhat values indicate convergence failure.
#> Rhat is the potential scale reduction factor (at convergence, Rhat=1).
#> For each parameter, n.eff is a crude measure of effective sample size.
#>
#> overlap0 checks if 0 falls in the parameter's 95% credible interval.
#> f is the proportion of the posterior with the same sign as the mean;
#> i.e., our confidence that the parameter is positive or negative.
#>
#> DIC info: (pD = var(deviance)/2)
#> pD = 65 and DIC = 931.11
#> DIC is an estimate of expected predictive error (lower is better).
You should now try to run the model until it converges (it should take around half an hour to run, so we won’t do it in this vignette):
mcmc_output <- run_model(filename, data, run_param=list(nb_iter=100000, nb_burnin=50000, nb_thin=50, nb_adapt=50000), parallelize = T)
Here are the figures corresponding to the results that have converged:
You can save the figures as PNG using:
Last, if you want to explore further in detail the a posteriori distribution of your parameters Π and η, you can run the following code line, which will store the values for all iterations into a data frame.