{"id":2167,"date":"2021-11-29T04:40:09","date_gmt":"2021-11-29T04:40:09","guid":{"rendered":"http:\/\/optimumsportsperformance.com\/blog\/?p=2167"},"modified":"2022-11-08T03:38:34","modified_gmt":"2022-11-08T03:38:34","slug":"bayesian-updating-of-reference-ranges-for-serial-measurements","status":"publish","type":"post","link":"https:\/\/optimumsportsperformance.com\/blog\/bayesian-updating-of-reference-ranges-for-serial-measurements\/","title":{"rendered":"Bayesian Updating of Reference Ranges for Serial Measurements"},"content":{"rendered":"<p><strong><u>Introduction<\/u><\/strong><\/p>\n<p>The collection of serial measurements on athletes across a season (or multiple seasons) is one of the more common types of data being generated in the applied sport science environment. The question that coaches and practitioners often have is, <em>\u201cIs this player outside of their \u2018normal range\u2019?\u201d<\/em><\/p>\n<p>The best approach for establishing a reference range of \u2018normal\u2019 values is a frequently discussed topic in sport science. One common strategy is to use z-scores and represent the reference range as 1 standard deviation above or below the mean (<strong>Figure A<\/strong>) or plot the raw values and set the reference range 1 standard deviation above or below the raw mean (<strong>Figure B<\/strong>), for practitioners who might have a difficult time understanding standardized scores. Of course, the mean and standard deviation will now be related to all prior values. As such, if the athletes go through a training phase with substantially higher values than other phases (e.g., training camp) it could skew your reference ranges. To alleviate this issue, some choose to use a rolling mean and standard deviation, to represent the normal range of values relative to more recent training sessions (<strong>Figure C<\/strong>).<\/p>\n<p><a href=\"https:\/\/optimumsportsperformance.com\/blog\/wp-content\/uploads\/2021\/11\/figures.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-2168\" src=\"https:\/\/optimumsportsperformance.com\/blog\/wp-content\/uploads\/2021\/11\/figures-1024x594.png\" alt=\"\" width=\"625\" height=\"363\" srcset=\"https:\/\/optimumsportsperformance.com\/blog\/wp-content\/uploads\/2021\/11\/figures-1024x594.png 1024w, https:\/\/optimumsportsperformance.com\/blog\/wp-content\/uploads\/2021\/11\/figures-300x174.png 300w, https:\/\/optimumsportsperformance.com\/blog\/wp-content\/uploads\/2021\/11\/figures-768x446.png 768w, https:\/\/optimumsportsperformance.com\/blog\/wp-content\/uploads\/2021\/11\/figures-624x362.png 624w, https:\/\/optimumsportsperformance.com\/blog\/wp-content\/uploads\/2021\/11\/figures.png 1129w\" sizes=\"auto, (max-width: 625px) 100vw, 625px\" \/><\/a><\/p>\n<p>A problem with the approaches above is that they require a number of training sessions to allow a mean and standard deviation to be determined for the individual athlete. One solution to this issue is to base our initial normal reference ranges off of prior knowledge that we have from collecting data on players in previous seasons (or prior knowledge from research papers, if we don\u2019t have data of our own yet). This type of Bayesian updating approach has been applied in WADA\u2019s drug testing practices<sup>1<\/sup>. More recently, <span style=\"color: #0000ff;\"><strong><a style=\"color: #0000ff;\" href=\"https:\/\/twitter.com\/sportaerztin\">Hecksteden<\/a> <\/strong><\/span>et al., used this approach to evaluate the CK levels of team-sport athletes in both fatigued and non-fatigued states<sup>2<\/sup>.<\/p>\n<p>The mathematics of the approach was presented in the paper but might look intimidating to those not used to looking at mathematical equations in this manner. <a href=\"https:\/\/optimumsportsperformance.com\/blog\/wp-content\/uploads\/2021\/11\/Screen-Shot-2021-11-28-at-2.12.45-PM-1.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-2170\" src=\"https:\/\/optimumsportsperformance.com\/blog\/wp-content\/uploads\/2021\/11\/Screen-Shot-2021-11-28-at-2.12.45-PM-1.png\" alt=\"\" width=\"458\" height=\"98\" srcset=\"https:\/\/optimumsportsperformance.com\/blog\/wp-content\/uploads\/2021\/11\/Screen-Shot-2021-11-28-at-2.12.45-PM-1.png 458w, https:\/\/optimumsportsperformance.com\/blog\/wp-content\/uploads\/2021\/11\/Screen-Shot-2021-11-28-at-2.12.45-PM-1-300x64.png 300w\" sizes=\"auto, (max-width: 458px) 100vw, 458px\" \/><\/a><a href=\"https:\/\/optimumsportsperformance.com\/blog\/wp-content\/uploads\/2021\/11\/Screen-Shot-2021-11-28-at-2.12.51-PM.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-2171\" src=\"https:\/\/optimumsportsperformance.com\/blog\/wp-content\/uploads\/2021\/11\/Screen-Shot-2021-11-28-at-2.12.51-PM.png\" alt=\"\" width=\"441\" height=\"125\" srcset=\"https:\/\/optimumsportsperformance.com\/blog\/wp-content\/uploads\/2021\/11\/Screen-Shot-2021-11-28-at-2.12.51-PM.png 441w, https:\/\/optimumsportsperformance.com\/blog\/wp-content\/uploads\/2021\/11\/Screen-Shot-2021-11-28-at-2.12.51-PM-300x85.png 300w\" sizes=\"auto, (max-width: 441px) 100vw, 441px\" \/><\/a><\/p>\n<p>The author\u2019s provided a nice excel sheet where you can input your own data and get the updated reference ranges. However, the sheet is a protected sheet, which doesn&#8217;t afford the opportunity of seeing how the underlying equations work and you can&#8217;t alter the sheet to make appropriate for your data (for example, the data in the sheet log transforms the raw data automatically). Thus, I\u2019ve decided to code the analysis out, both in excel and R, to help practitioners looking to adopt this approach.<\/p>\n<p><strong><u>Setting Priors<\/u><\/strong><\/p>\n<p>To apply this type of analysis, we need to first establish some prior values for three parameters: Prior Mean (mu), Prior Standard Deviation (tau), and a Prior Repeated-Measures Standard Deviation (sigmaRM). These values represent our current knowledge of the variable we are measuring <em>before<\/em> seeing any new data. As new data is collected, we can update these priors to get an individual (posterior) estimate for the athlete. I\u2019ll use the priors set by Hecksteden and colleagues for CK levels of Male athletes:<\/p>\n<ul>\n<li><strong>Mu<\/strong> = 5.527<\/li>\n<li><strong>Tau<\/strong> = 0.661<\/li>\n<li><strong>sigmaRM<\/strong> = 0.504<\/li>\n<\/ul>\n<p>Once we have established our prior parameters, we are ready to update them, using the math equations above, as new data comes in.<\/p>\n<p><strong><u>Bayesian Updating in Excel<\/u><\/strong><\/p>\n<p>The excel sheet is available at my <strong><span style=\"color: #0000ff;\"><a style=\"color: #0000ff;\" href=\"https:\/\/github.com\/pw2\/bayesian_updating_reference_ranges\">GitHub page<\/a><\/span><\/strong>. It looks like this:<a href=\"https:\/\/optimumsportsperformance.com\/blog\/wp-content\/uploads\/2021\/11\/Screen-Shot-2021-11-28-at-2.34.32-PM.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-2173\" src=\"https:\/\/optimumsportsperformance.com\/blog\/wp-content\/uploads\/2021\/11\/Screen-Shot-2021-11-28-at-2.34.32-PM-1024x501.png\" alt=\"\" width=\"676\" height=\"331\" srcset=\"https:\/\/optimumsportsperformance.com\/blog\/wp-content\/uploads\/2021\/11\/Screen-Shot-2021-11-28-at-2.34.32-PM-1024x501.png 1024w, https:\/\/optimumsportsperformance.com\/blog\/wp-content\/uploads\/2021\/11\/Screen-Shot-2021-11-28-at-2.34.32-PM-300x147.png 300w, https:\/\/optimumsportsperformance.com\/blog\/wp-content\/uploads\/2021\/11\/Screen-Shot-2021-11-28-at-2.34.32-PM-768x376.png 768w, https:\/\/optimumsportsperformance.com\/blog\/wp-content\/uploads\/2021\/11\/Screen-Shot-2021-11-28-at-2.34.32-PM-624x305.png 624w\" sizes=\"auto, (max-width: 676px) 100vw, 676px\" \/><\/a><\/p>\n<p>All of the heavy lifting occurs in the two columns under the header <span style=\"color: #ff0000;\"><strong>Bayesian Updating (Log Scale)<\/strong><\/span>. The equation in the first row (Test 1) is different than the other equations below it because requires the prior information to get going. After that first test, the updated data become the prior for the next test and this continues for all tests forward. You can download the excel sheet and see how the equations work, so I won\u2019t go through them here. Instead, I\u2019ll show them more clearly in the R script, below.<\/p>\n<p><strong><u>Bayesian Updating in R<\/u><\/strong><\/p>\n<p>We first need to convert the math equations provided in the paper (posted above) into R code. Rather that leaving things to mathematical notation, I&#8217;ll plug in the variables in plain English:<\/p>\n<p><a href=\"https:\/\/optimumsportsperformance.com\/blog\/wp-content\/uploads\/2021\/11\/Screen-Shot-2021-11-28-at-7.58.49-PM.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-2174\" src=\"https:\/\/optimumsportsperformance.com\/blog\/wp-content\/uploads\/2021\/11\/Screen-Shot-2021-11-28-at-7.58.49-PM.png\" alt=\"\" width=\"623\" height=\"225\" srcset=\"https:\/\/optimumsportsperformance.com\/blog\/wp-content\/uploads\/2021\/11\/Screen-Shot-2021-11-28-at-7.58.49-PM.png 623w, https:\/\/optimumsportsperformance.com\/blog\/wp-content\/uploads\/2021\/11\/Screen-Shot-2021-11-28-at-7.58.49-PM-300x108.png 300w\" sizes=\"auto, (max-width: 623px) 100vw, 623px\" \/><\/a><\/p>\n<p>To be clear, here are the definitions for the variables above:<\/p>\n<p><a href=\"https:\/\/optimumsportsperformance.com\/blog\/wp-content\/uploads\/2021\/11\/Screen-Shot-2021-11-28-at-8.11.52-PM.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-2178\" src=\"https:\/\/optimumsportsperformance.com\/blog\/wp-content\/uploads\/2021\/11\/Screen-Shot-2021-11-28-at-8.11.52-PM.png\" alt=\"\" width=\"931\" height=\"207\" srcset=\"https:\/\/optimumsportsperformance.com\/blog\/wp-content\/uploads\/2021\/11\/Screen-Shot-2021-11-28-at-8.11.52-PM.png 931w, https:\/\/optimumsportsperformance.com\/blog\/wp-content\/uploads\/2021\/11\/Screen-Shot-2021-11-28-at-8.11.52-PM-300x67.png 300w, https:\/\/optimumsportsperformance.com\/blog\/wp-content\/uploads\/2021\/11\/Screen-Shot-2021-11-28-at-8.11.52-PM-768x171.png 768w, https:\/\/optimumsportsperformance.com\/blog\/wp-content\/uploads\/2021\/11\/Screen-Shot-2021-11-28-at-8.11.52-PM-624x139.png 624w\" sizes=\"auto, (max-width: 931px) 100vw, 931px\" \/><\/a><\/p>\n<p>Now that we know the variables we need for each equation we can begin the process of updating or reference ranges.<\/p>\n<p>First create a data set of the test observations and their log values. This will be the same data we observed in our excel sheet:<\/p>\n<p><a href=\"https:\/\/optimumsportsperformance.com\/blog\/wp-content\/uploads\/2021\/11\/Screen-Shot-2021-11-28-at-8.04.23-PM.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-2177\" src=\"https:\/\/optimumsportsperformance.com\/blog\/wp-content\/uploads\/2021\/11\/Screen-Shot-2021-11-28-at-8.04.23-PM.png\" alt=\"\" width=\"238\" height=\"201\" \/><\/a><\/p>\n<p>Then we set our priors (in log format):<\/p>\n<pre class=\"brush: r; title: ; notranslate\" title=\"\">\r\n## priors\r\nprior_mu &lt;- 5.527\r\nprior_sd &lt;- 0.661\r\nprior_repeated_measure_sd &lt;- 0.504\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>We will start by seeing how the updating works for the mean and standard deviation parameters after the first test. To do this, we will create a function for each parameter (mean and standard deviation) that updates the priors with the observed values based on the above equations:<\/p>\n<p>&nbsp;<\/p>\n<pre class=\"brush: r; title: ; notranslate\" title=\"\">\r\nposterior_mu &lt;- function(prior_mu, prior_sd, prior_repeated_measure_sd, obs_value){\r\n  \r\n  numerator &lt;- prior_repeated_measure_sd^2 * prior_mu + prior_sd^2 * obs_value\r\n  denominator &lt;- prior_repeated_measure_sd^2 + prior_sd^2\r\n  \r\n  post_mu &lt;- numerator \/ denominator\r\n  return(post_mu)\r\n  \r\n  }\r\n\r\nposterior_sd &lt;- function(prior_repeated_measure_sd, prior_sd, test_num){\r\n  \r\n  post_var &lt;- 1 \/ ((test_num - 1 + 1) * 1\/prior_repeated_measure_sd^2 + 1\/prior_sd^2) \r\n  post_sd &lt;- sqrt(post_var)\r\n  return(post_sd)\r\n  \r\n}\r\n<\/pre>\n<p>After running the functions on the observations of our first test, our updated mean and standard deviation are:<\/p>\n<p><a href=\"https:\/\/optimumsportsperformance.com\/blog\/wp-content\/uploads\/2021\/11\/Screen-Shot-2021-11-28-at-8.13.22-PM.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-2179\" src=\"https:\/\/optimumsportsperformance.com\/blog\/wp-content\/uploads\/2021\/11\/Screen-Shot-2021-11-28-at-8.13.22-PM.png\" alt=\"\" width=\"588\" height=\"223\" srcset=\"https:\/\/optimumsportsperformance.com\/blog\/wp-content\/uploads\/2021\/11\/Screen-Shot-2021-11-28-at-8.13.22-PM.png 588w, https:\/\/optimumsportsperformance.com\/blog\/wp-content\/uploads\/2021\/11\/Screen-Shot-2021-11-28-at-8.13.22-PM-300x114.png 300w\" sizes=\"auto, (max-width: 588px) 100vw, 588px\" \/><\/a><br \/>\nNotice that we obtain the same values that we see following <strong>test_1<\/strong> in our excel workbook. We can also calculate 95% confidence intervals and take the exponent (since the data is on a log scale) to get the individual athlete&#8217;s updated reference range on the raw scale:<\/p>\n<p><a href=\"https:\/\/optimumsportsperformance.com\/blog\/wp-content\/uploads\/2021\/11\/Screen-Shot-2021-11-28-at-8.15.22-PM.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-2180\" src=\"https:\/\/optimumsportsperformance.com\/blog\/wp-content\/uploads\/2021\/11\/Screen-Shot-2021-11-28-at-8.15.22-PM.png\" alt=\"\" width=\"317\" height=\"245\" srcset=\"https:\/\/optimumsportsperformance.com\/blog\/wp-content\/uploads\/2021\/11\/Screen-Shot-2021-11-28-at-8.15.22-PM.png 317w, https:\/\/optimumsportsperformance.com\/blog\/wp-content\/uploads\/2021\/11\/Screen-Shot-2021-11-28-at-8.15.22-PM-300x232.png 300w\" sizes=\"auto, (max-width: 317px) 100vw, 317px\" \/><\/a>Again, these results confirm the values we see in our excel workbook.<\/p>\n<p><strong><em>That\u2019s cool and all, but we need to be able to iteratively update the data set as new data comes in. Let\u2019s write a for() loop!<\/em><\/strong><\/p>\n<p>First, we create a new column in the data that provides us with the updated standard deviation after observing the results in each test. This is a necessary first step as we will use this value to then update the mean value.<\/p>\n<p>&nbsp;<\/p>\n<pre class=\"brush: r; title: ; notranslate\" title=\"\">\r\n## Calculate the updated SD based on sample size\r\ndf2 &lt;- df %&gt;%\r\n  mutate(bayes_sd = sqrt(1 \/ ((test - 1 + 1) * 1 \/ prior_repeated_measure_sd^2 + 1 \/ prior_sd^2))) \r\n\r\ndf2\r\n<\/pre>\n<p><a href=\"https:\/\/optimumsportsperformance.com\/blog\/wp-content\/uploads\/2021\/11\/Screen-Shot-2021-11-28-at-8.19.58-PM.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-2181\" src=\"https:\/\/optimumsportsperformance.com\/blog\/wp-content\/uploads\/2021\/11\/Screen-Shot-2021-11-28-at-8.19.58-PM.png\" alt=\"\" width=\"224\" height=\"125\" \/><\/a><\/p>\n<p>Next, we need a <strong><em>for()<\/em><\/strong> loop. This is a bit tricky because <strong>test_1<\/strong> is updating based solely on the priors while all other tests (<strong>test_2<\/strong> to <strong>test_<em>N<\/em><\/strong>) will be updating based on the mean and standard deviation in the row above them. Thus, we need to have our <strong><em>for()<\/em><\/strong> loop look back at the previous row above it once those values are calculated. This sort of thing is easy to set up in excel but in R (or Python) we need to think about how to code our row indexes. I covered this sort of iterative row computing in two previous articles <strong><span style=\"color: #0000ff;\"><a style=\"color: #0000ff;\" href=\"https:\/\/optimumsportsperformance.com\/blog\/r-tips-tricks-recreating-within-column-iteration-as-you-would-do-in-excel\/\">HERE<\/a><\/span><\/strong> and <strong><span style=\"color: #0000ff;\"><a style=\"color: #0000ff;\" href=\"https:\/\/optimumsportsperformance.com\/blog\/r-tips-tricks-excel-within-column-iteration-in-r-part-2\/\">HERE<\/a><\/span><\/strong>.<\/p>\n<p>Within the loop we first set up vectors for the prior variance (sd^2), the denominator in our equation, and the log transformed observations from our data set. Then, we calculate the updated posterior for the mean (mu) on each pass through the loop, each time using the value preceding it in the vector, [i \u2013 1], to allow us to iteratively update the data.<\/p>\n<p>Once we run the loop, we add the results to our data set (removing the first observation in the vector since that was the original prior before seeing any data):<\/p>\n<p>&nbsp;<\/p>\n<pre class=\"brush: r; title: ; notranslate\" title=\"\">\r\n# Create a vector to store results\r\nN &lt;- length(df2$ln_value) + 1\r\nbayes_mu &lt;- c(prior_mu, rep(NA, N - 1))\r\n\r\n\r\n## For loop\r\nfor(i in 2:N){\r\n  \r\n  ## Set up vectors for the variance, denominator, and newly observed values\r\n  prior_var &lt;- c(prior_sd^2, df2$bayes_sd^2)\r\n  denominator &lt;- prior_repeated_measure_sd^2 + prior_var\r\n  vals &lt;- df2$ln_value\r\n  \r\n  ## calculate bayesian updated mu\r\n  bayes_mu&#x5B;i] &lt;- (prior_repeated_measure_sd^2 * bayes_mu&#x5B;i-1] + prior_var&#x5B;i-1] * vals&#x5B;i-1]) \/ denominator&#x5B;i-1]\r\n    \r\n}\r\n\r\ndf2$bayes_mean &lt;- bayes_mu&#x5B;-1]\r\ndf2\r\n<\/pre>\n<p><a href=\"https:\/\/optimumsportsperformance.com\/blog\/wp-content\/uploads\/2021\/11\/Screen-Shot-2021-11-28-at-8.26.08-PM.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-2183\" src=\"https:\/\/optimumsportsperformance.com\/blog\/wp-content\/uploads\/2021\/11\/Screen-Shot-2021-11-28-at-8.26.08-PM.png\" alt=\"\" width=\"383\" height=\"180\" \/><\/a><\/p>\n<p>The two columns, <strong>bayes_sd <\/strong>and <strong>bayes_mean<\/strong>, contain our updated prior values and they are the exact same results we obtained in our excel workbook.<\/p>\n<p>To use these updated parameters for creating individual athlete reference ranges, we calculate the 95% Confidence Intervals:<\/p>\n<p><strong><em>NOTE: <\/em><\/strong><em>I added a row at the start of data frame to establish the priors, before seeing the data, so that they could also be plotted as part of the reference ranges.<\/em><\/p>\n<pre class=\"brush: r; title: ; notranslate\" title=\"\">\r\n### Confidence Intervals\r\nfirst_prior &lt;- data.frame(test = 0, value = NA, ln_value = NA, bayes_sd = prior_sd, bayes_mean = prior_mu)\r\n\r\ndf2 &lt;- df2 %&gt;%\r\n  bind_rows(first_prior) %&gt;%\r\n  arrange(test)\r\n\r\n## Exponentiate back to get the reference range\r\ndf2$low95 &lt;- exp(df2$bayes_mean - 1.96*df2$bayes_sd)\r\ndf2$high95 &lt;- exp(df2$bayes_mean + 1.96*df2$bayes_sd)\r\ndf2\r\n<\/pre>\n<p><a href=\"https:\/\/optimumsportsperformance.com\/blog\/wp-content\/uploads\/2021\/11\/Screen-Shot-2021-11-28-at-8.32.15-PM.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-2184\" src=\"https:\/\/optimumsportsperformance.com\/blog\/wp-content\/uploads\/2021\/11\/Screen-Shot-2021-11-28-at-8.32.15-PM.png\" alt=\"\" width=\"480\" height=\"195\" srcset=\"https:\/\/optimumsportsperformance.com\/blog\/wp-content\/uploads\/2021\/11\/Screen-Shot-2021-11-28-at-8.32.15-PM.png 394w, https:\/\/optimumsportsperformance.com\/blog\/wp-content\/uploads\/2021\/11\/Screen-Shot-2021-11-28-at-8.32.15-PM-300x122.png 300w\" sizes=\"auto, (max-width: 480px) 100vw, 480px\" \/><\/a><\/p>\n<p>Finally, we plot the observations along with the continually updated references ranges. You can clearly see how large the <em>normal<\/em> range is before seeing any data (<strong>test_0<\/strong>) and then how quickly this range begins to shrink down once we start observing data from the individual.<\/p>\n<p><strong><u>\u00a0<a href=\"https:\/\/optimumsportsperformance.com\/blog\/wp-content\/uploads\/2021\/11\/updating_plot.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-2185\" src=\"https:\/\/optimumsportsperformance.com\/blog\/wp-content\/uploads\/2021\/11\/updating_plot.png\" alt=\"\" width=\"910\" height=\"655\" srcset=\"https:\/\/optimumsportsperformance.com\/blog\/wp-content\/uploads\/2021\/11\/updating_plot.png 910w, https:\/\/optimumsportsperformance.com\/blog\/wp-content\/uploads\/2021\/11\/updating_plot-300x216.png 300w, https:\/\/optimumsportsperformance.com\/blog\/wp-content\/uploads\/2021\/11\/updating_plot-768x553.png 768w, https:\/\/optimumsportsperformance.com\/blog\/wp-content\/uploads\/2021\/11\/updating_plot-624x449.png 624w\" sizes=\"auto, (max-width: 910px) 100vw, 910px\" \/><\/a><\/u><\/strong><\/p>\n<p>To access the R code and the excel workbook please visit my <strong><span style=\"color: #0000ff;\"><a style=\"color: #0000ff;\" href=\"https:\/\/github.com\/pw2\/bayesian_updating_reference_ranges\">GitHub page<\/a><\/span><\/strong>.<\/p>\n<p><strong><u>References<\/u><\/strong><\/p>\n<ul>\n<li>Sottas PE et al. (2007). <strong>Bayesian detection of abnormal values in longitudinal biomarkers with application to T\/E ratio<\/strong>. <em>Biostatistics<\/em>; 8(2): 285-296.<\/li>\n<li>Hecksteden et al. (2017). <strong>A new method to individualize monitoring of muscle recovery in athletes<\/strong>. <em>Int J Sport Phys Perf<\/em>; 12: 1137-1142.<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Introduction The collection of serial measurements on athletes across a season (or multiple seasons) is one of the more common types of data being generated in the applied sport science environment. The question that coaches and practitioners often have is, \u201cIs this player outside of their \u2018normal range\u2019?\u201d The best approach for establishing a reference [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[49,43,42],"tags":[],"class_list":["post-2167","post","type-post","status-publish","format-standard","hentry","category-bayesian-model-building","category-sports-analytics","category-sports-science"],"_links":{"self":[{"href":"https:\/\/optimumsportsperformance.com\/blog\/wp-json\/wp\/v2\/posts\/2167","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/optimumsportsperformance.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/optimumsportsperformance.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/optimumsportsperformance.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/optimumsportsperformance.com\/blog\/wp-json\/wp\/v2\/comments?post=2167"}],"version-history":[{"count":3,"href":"https:\/\/optimumsportsperformance.com\/blog\/wp-json\/wp\/v2\/posts\/2167\/revisions"}],"predecessor-version":[{"id":2188,"href":"https:\/\/optimumsportsperformance.com\/blog\/wp-json\/wp\/v2\/posts\/2167\/revisions\/2188"}],"wp:attachment":[{"href":"https:\/\/optimumsportsperformance.com\/blog\/wp-json\/wp\/v2\/media?parent=2167"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/optimumsportsperformance.com\/blog\/wp-json\/wp\/v2\/categories?post=2167"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/optimumsportsperformance.com\/blog\/wp-json\/wp\/v2\/tags?post=2167"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}