<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta charset="utf-8"> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta name="generator" content="pandoc" /> <meta name="author" content="Lei Sun" /> <meta name="date" content="2017-05-02" /> <title>Diagnostic Plot for Uniform Distribution</title> <script src="site_libs/jquery-1.11.3/jquery.min.js"></script> <meta name="viewport" content="width=device-width, initial-scale=1" /> <link href="site_libs/bootstrap-3.3.5/css/cosmo.min.css" rel="stylesheet" /> <script src="site_libs/bootstrap-3.3.5/js/bootstrap.min.js"></script> <script src="site_libs/bootstrap-3.3.5/shim/html5shiv.min.js"></script> <script src="site_libs/bootstrap-3.3.5/shim/respond.min.js"></script> <script src="site_libs/jqueryui-1.11.4/jquery-ui.min.js"></script> <link href="site_libs/tocify-1.9.1/jquery.tocify.css" rel="stylesheet" /> <script src="site_libs/tocify-1.9.1/jquery.tocify.js"></script> <script src="site_libs/navigation-1.1/tabsets.js"></script> <link href="site_libs/highlightjs-1.1/textmate.css" rel="stylesheet" /> <script src="site_libs/highlightjs-1.1/highlight.js"></script> <link href="site_libs/font-awesome-4.5.0/css/font-awesome.min.css" rel="stylesheet" /> <style type="text/css">code{white-space: pre;}</style> <style type="text/css"> pre:not([class]) { background-color: white; } </style> <script type="text/javascript"> if (window.hljs && document.readyState && document.readyState === "complete") { window.setTimeout(function() { hljs.initHighlighting(); }, 0); } </script> <style type="text/css"> h1 { font-size: 34px; } h1.title { font-size: 38px; } h2 { font-size: 30px; } h3 { font-size: 24px; } h4 { font-size: 18px; } h5 { font-size: 16px; } h6 { font-size: 12px; } .table th:not([align]) { text-align: left; } </style> </head> <body> <style type = "text/css"> .main-container { max-width: 940px; margin-left: auto; margin-right: auto; } code { color: inherit; background-color: rgba(0, 0, 0, 0.04); } img { max-width:100%; height: auto; } .tabbed-pane { padding-top: 12px; } button.code-folding-btn:focus { outline: none; } </style> <style type="text/css"> /* padding for bootstrap navbar */ body { padding-top: 51px; padding-bottom: 40px; } /* offset scroll position for anchor links (for fixed navbar) */ .section h1 { padding-top: 56px; margin-top: -56px; } .section h2 { padding-top: 56px; margin-top: -56px; } .section h3 { padding-top: 56px; margin-top: -56px; } .section h4 { padding-top: 56px; margin-top: -56px; } .section h5 { padding-top: 56px; margin-top: -56px; } .section h6 { padding-top: 56px; margin-top: -56px; } </style> <script> // manage active state of menu based on current page $(document).ready(function () { // active menu anchor href = window.location.pathname href = href.substr(href.lastIndexOf('/') + 1) if (href === "") href = "index.html"; var menuAnchor = $('a[href="' + href + '"]'); // mark it active menuAnchor.parent().addClass('active'); // if it's got a parent navbar menu mark it active as well menuAnchor.closest('li.dropdown').addClass('active'); }); </script> <div class="container-fluid main-container"> <!-- tabsets --> <script> $(document).ready(function () { window.buildTabsets("TOC"); }); </script> <!-- code folding --> <script> $(document).ready(function () { // move toc-ignore selectors from section div to header $('div.section.toc-ignore') .removeClass('toc-ignore') .children('h1,h2,h3,h4,h5').addClass('toc-ignore'); // establish options var options = { selectors: "h1,h2,h3", theme: "bootstrap3", context: '.toc-content', hashGenerator: function (text) { return text.replace(/[.\\/?&!#<>]/g, '').replace(/\s/g, '_').toLowerCase(); }, ignoreSelector: ".toc-ignore", scrollTo: 0 }; options.showAndHide = true; options.smoothScroll = true; // tocify var toc = $("#TOC").tocify(options).data("toc-tocify"); }); </script> <style type="text/css"> #TOC { margin: 25px 0px 20px 0px; } @media (max-width: 768px) { #TOC { position: relative; width: 100%; } } .toc-content { padding-left: 30px; padding-right: 40px; } div.main-container { max-width: 1200px; } div.tocify { width: 20%; max-width: 260px; max-height: 85%; } @media (min-width: 768px) and (max-width: 991px) { div.tocify { width: 25%; } } @media (max-width: 767px) { div.tocify { width: 100%; max-width: none; } } .tocify ul, .tocify li { line-height: 20px; } .tocify-subheader .tocify-item { font-size: 0.90em; padding-left: 25px; text-indent: 0; } .tocify .list-group-item { border-radius: 0px; } </style> <!-- setup 3col/9col grid for toc_float and main content --> <div class="row-fluid"> <div class="col-xs-12 col-sm-4 col-md-3"> <div id="TOC" class="tocify"> </div> </div> <div class="toc-content col-xs-12 col-sm-8 col-md-9"> <div class="navbar navbar-default navbar-fixed-top" role="navigation"> <div class="container"> <div class="navbar-header"> <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar"> <span class="icon-bar"></span> <span class="icon-bar"></span> <span class="icon-bar"></span> </button> <a class="navbar-brand" href="index.html">truncash</a> </div> <div id="navbar" class="navbar-collapse collapse"> <ul class="nav navbar-nav"> <li> <a href="index.html">Home</a> </li> <li> <a href="about.html">About</a> </li> <li> <a href="license.html">License</a> </li> </ul> <ul class="nav navbar-nav navbar-right"> <li> <a href="https://github.com/LSun/truncash"> <span class="fa fa-github"></span> </a> </li> </ul> </div><!--/.nav-collapse --> </div><!--/.container --> </div><!--/.navbar --> <div class="fluid-row" id="header"> <h1 class="title toc-ignore">Diagnostic Plot for Uniform Distribution</h1> <h4 class="author"><em>Lei Sun</em></h4> <h4 class="date"><em>2017-05-02</em></h4> </div> <!-- The file analysis/chunks.R contains chunks that define default settings shared across the workflowr files. --> <!-- Update knitr chunk options --> <!-- Insert the date the file was last updated --> <p><strong>Last updated:</strong> 2017-05-03</p> <!-- Insert the code version (Git commit SHA1) if Git repository exists and R package git2r is installed --> <p><strong>Code version:</strong> 98a94d1</p> <!-- Add your analysis here --> <div id="introduction" class="section level2"> <h2>Introduction</h2> <p>Suppose we have <span class="math inline">\(n\)</span> iid samples presumably from <span class="math inline">\(\text{Uniform}\left[0, 1\right]\)</span>. Our goal is to make a diagnostic plot to check if they are truly coming from <span class="math inline">\(\text{Uniform}\left[0, 1\right]\)</span>.</p> </div> <div id="plotting-positions" class="section level2"> <h2>Plotting positions</h2> <p>The basic tool is the <a href="https://en.wikipedia.org/wiki/Q%E2%80%93Q_plot">Q-Q plot</a>. Basically, we are ploting the sample quantiles against their theoretical quantiles, also called “plotting positions.” But it turns out it’s more complicated than what it appears, because it’s not clear what are the best “theoretical quantiles” or plotting positions. For example, <span class="math inline">\(\left\{1/n, 2/n, \ldots, n/n\right\}\)</span> appears an obvious option, but if the distribution is normal, the quantile of <span class="math inline">\(n/n = 1\)</span> is <span class="math inline">\(\infty\)</span>. Even if the distribution is compactly supported, like <span class="math inline">\(\text{Uniform}\left[0, 1\right]\)</span>, the quantile of <span class="math inline">\(1\)</span> is <span class="math inline">\(1\)</span>, yet the largest sample will always be strictly less than <span class="math inline">\(1\)</span>.</p> <p>This is called the “plotting positions problem.” It has a long history and a rich literature. <a href="http://www.tandfonline.com/doi/abs/10.1080/03610928408828781">Harter 1984</a> and <a href="http://www.tandfonline.com/doi/abs/10.1080/03610920701653094">Makkonen 2008</a> seem to be two good reviews. Popular choices include <span class="math inline">\(\left\{\frac{k-0.5}{n}\right\}\)</span>, <span class="math inline">\(\left\{\frac{k}{n+1}\right\}\)</span>, <span class="math inline">\(\left\{\frac{k - 0.3}{n+0.4}\right\}\)</span>, or in general, <span class="math inline">\(\left\{\frac{k-\alpha}{n+1-2\alpha}\right\}\)</span>, <span class="math inline">\(\alpha\in\left[0, 1\right]\)</span>, which approximates <span class="math inline">\(F\left(E\left[X_{(k)}\right]\right)\)</span> for certain <span class="math inline">\(\alpha\)</span>, and includes all above as special cases.</p> <p>For practical purposes, for <span class="math inline">\(\text{Uniform}\left[0, 1\right]\)</span> distribution, we are using <span class="math inline">\(\left\{\frac{1}{n+1}, \frac{2}{n+1}, \ldots, \frac{n}{n+1}\right\}\)</span> as plotting positions for diagnosing <span class="math inline">\(\text{Uniform}\left[0, 1\right]\)</span>. <a href="http://www.tandfonline.com/doi/abs/10.1080/03610928408828781">Harter 1984</a> provided some justification for this choice. In short, <span class="math inline">\(\text{Uniform}\left[0, 1\right]\)</span> is unique in that it has the property</p> <p><span class="math display">\[ \displaystyle F\left(E\left[X_{(k)}\right]\right) = E\left[F\left(X_{(k)}\right)\right] = \frac{k}{n + 1} \ , \]</span> where <span class="math inline">\(X_{(k)}\)</span> is the order statistic.</p> </div> <div id="de-trending-the-0-1-line" class="section level2"> <h2>De-trending the <span class="math inline">\(0\)</span>-<span class="math inline">\(1\)</span> line</h2> <p>Another problem is also related to Q-Q plots in general, and especially to the problem we have right now. In uniform Q-Q plots, in Matthew’s words, “current plots are dominated by the trend from 0 to 1,” so it’ would be better to “remove that trend to better highlight the deviations from the expectation.”</p> <p>The order statistics <span class="math inline">\(X_{(k)}\)</span> for <span class="math inline">\(\text{Uniform}\left[0, 1\right]\)</span> <a href="https://en.wikipedia.org/wiki/Order_statistic#Order_statistics_sampled_from_a_uniform_distribution">follows a beta distribution</a>,</p> <p><span class="math display">\[ X_{(k)} \sim \text{Beta}\left(k, n+1-k\right) \ , \]</span></p> <p>which has the <a href="https://en.wikipedia.org/wiki/Uniform_distribution_(continuous)#Order_statistics">mean and variance</a> as</p> <p><span class="math display">\[ \begin{array}{rcll} E\left[X_{(k)}\right] & = & \displaystyle\frac{k}{n+1} &;\\ Var\left(X_{(k)}\right) &=& \displaystyle\frac{k(n - k + 1)}{\left(n+1\right)^2\left(n + 2\right)} &. \end{array} \]</span></p> <p>Therefore, we can plot <span class="math inline">\(X_{(k)} - E\left[X_{(k)}\right]\)</span> along with two error bounds. One choice of the error bounds is to use <span class="math inline">\(\pm2\sqrt{Var\left(X_{(k)}\right)}\)</span> (in blue); another is to use the <span class="math inline">\(\alpha / 2\)</span> and <span class="math inline">\(1-\alpha/2\)</span> quantiles of <span class="math inline">\(\text{Beta}\left(k, n+1-k\right)\)</span> (in red). Points outside the error bounds thus indicate deviation from the uniform distribution. This plot can be called the de-trended plot.</p> <p>As an example, here is a data set of <span class="math inline">\(10K\)</span> null <span class="math inline">\(z\)</span> scores distorted by correlation. We apply <code>ASH</code> to this data set. Since the empirical distribution of these <span class="math inline">\(z\)</span> scores are highly non-normal due to correlation, presumably <code>ASH</code> with normal prior components and normal likelihood wouldn’t fit this data set well.</p> <pre class="r"><code>z = read.table("../output/z_null_liver_777.txt")</code></pre> <pre class="r"><code>z.33 = as.numeric(z[33, ])</code></pre> <pre class="r"><code>library(ashr) fit = ash.workhorse(z.33, 1, method = "fdr", mixcompdist = "normal") cdfhat = plot_diagnostic(fit, plot.it = FALSE)</code></pre> <p>The histogram of the data set is plotted as follows, as compared with the density of <span class="math inline">\(N(0, 1)\)</span>. In this case since <span class="math inline">\(\hat s\equiv 1\)</span>, all <span class="math inline">\(\hat z_j\)</span> share the same estimated predictive density, defined as</p> <p><span class="math display">\[ \hat f = \hat g * N(0, \hat s_j^2 \equiv 1) \ . \]</span></p> <p><span class="math inline">\(\hat f(x)\)</span> at a given set of <span class="math inline">\(x\)</span> positions can be evaluated using the following <code>R</code> code.</p> <pre class="r"><code>fhat = function(ash.fit, x, sebetahat = 1) { data = ashr::set_data(x, sebetahat, ash.fit$data$lik, ash.fit$data$alpha) return(ashr:::dens_conv.default(ash.fit$fitted_g, data)) }</code></pre> <p>W can also plot the estimated predictive density (in blue) on top of the histogram. As we can see, the blue line is not fitting the histogram well, as an indicator of ASH’s lack of goodness of fit to this data set.</p> <p><img src="figure/diagnostic_plot_2.rmd/unnamed-chunk-5-1.png" width="672" style="display: block; margin: auto;" /></p> <p>The predictive CDF of this data set should be far from <span class="math inline">\(\text{Uniform}\left[0, 1\right]\)</span>, so the diagnostic Q-Q plot should be conspicuously deviating from the <span class="math inline">\(0\)</span>-<span class="math inline">\(1\)</span> straight line. And we’ve also seen many points outside of the error bounds in the de-trended plot. We can also see that the two choices of error bounds don’t make too much difference.</p> <p><img src="figure/diagnostic_plot_2.rmd/unnamed-chunk-6-1.png" width="672" style="display: block; margin: auto;" /><img src="figure/diagnostic_plot_2.rmd/unnamed-chunk-6-2.png" width="672" style="display: block; margin: auto;" /></p> <div id="correlated-multiple-comparison" class="section level3"> <h3>Correlated multiple comparison</h3> <p>However, this simple de-trended plot has drawbacks. Suppose we apply <code>ASH</code> to independent <span class="math inline">\(z\)</span> scores. <code>ASH</code> should correctly estimate <span class="math inline">\(\hat g\)</span> to be a point mass at <span class="math inline">\(0\)</span> or something very close to it. Then the predictive cdf should be approximately uniformly distributed, which means we shouldn’t observe too many points outside the error bounds. However, here we do this simulation <span class="math inline">\(10\)</span> times, and it’s more common than expected to observe points outside the bounds.</p> <p><img src="figure/diagnostic_plot_2.rmd/multiple-1.png" width="672" style="display: block; margin: auto;" /><img src="figure/diagnostic_plot_2.rmd/multiple-2.png" width="672" style="display: block; margin: auto;" /><img src="figure/diagnostic_plot_2.rmd/multiple-3.png" width="672" style="display: block; margin: auto;" /><img src="figure/diagnostic_plot_2.rmd/multiple-4.png" width="672" style="display: block; margin: auto;" /><img src="figure/diagnostic_plot_2.rmd/multiple-5.png" width="672" style="display: block; margin: auto;" /><img src="figure/diagnostic_plot_2.rmd/multiple-6.png" width="672" style="display: block; margin: auto;" /><img src="figure/diagnostic_plot_2.rmd/multiple-7.png" width="672" style="display: block; margin: auto;" /><img src="figure/diagnostic_plot_2.rmd/multiple-8.png" width="672" style="display: block; margin: auto;" /><img src="figure/diagnostic_plot_2.rmd/multiple-9.png" width="672" style="display: block; margin: auto;" /><img src="figure/diagnostic_plot_2.rmd/multiple-10.png" width="672" style="display: block; margin: auto;" /></p> <p>It happens because the de-trended plot has an inherent <em>multiple testing under correlation</em> issue. First we are comparing <span class="math inline">\(n\)</span> sample quantiles, and then these quantiles are correlated. It may have connection with multiple testing in time series. Like in all multiple testing problems, we need to obtain a better error bound.</p> <p>Here are some ideas.</p> </div> </div> <div id="idea-1-ignore-it" class="section level2"> <h2>Idea 1: Ignore it</h2> <p>Take a look at the non-uniform plot and the ten uniform plots. It’s true that the uniform ones are not-uncommonly outside the error bounds, but they are not going too far, compared with that non-uniform one. So maybe we can just ignore the “casual” bound-crossings and accept them as uniform. Of course this will generate a lot of ambiguity for borderline cases, but borderline cases are difficult any way.</p> </div> <div id="idea-2-bonferroni-correction" class="section level2"> <h2>Idea 2: Bonferroni correction</h2> <p>Instead of using an error bound that’s at <span class="math inline">\(\alpha\)</span> level for each order statistic, we can use Bonferroni correction at <span class="math inline">\(\alpha / n\)</span> level. Hopefully it will control false positives whereas still be powerful. Let’s take a look at the previously run examples.</p> <div id="non-uniform" class="section level3"> <h3>Non-uniform</h3> <p>In the presence of strong non-uniformity, the de-trended plot is still well outside the Bonferroni-corrected error bounds.</p> <p><img src="figure/diagnostic_plot_2.rmd/unnamed-chunk-7-1.png" width="672" style="display: block; margin: auto;" /><img src="figure/diagnostic_plot_2.rmd/unnamed-chunk-7-2.png" width="672" style="display: block; margin: auto;" /></p> </div> <div id="uniform" class="section level3"> <h3>Uniform</h3> <p>As always with Bonferroni correction, it could seem under-powered, or over-controlling the type I error.</p> <p><img src="figure/diagnostic_plot_2.rmd/multiple%20bonferroni-1.png" width="672" style="display: block; margin: auto;" /><img src="figure/diagnostic_plot_2.rmd/multiple%20bonferroni-2.png" width="672" style="display: block; margin: auto;" /><img src="figure/diagnostic_plot_2.rmd/multiple%20bonferroni-3.png" width="672" style="display: block; margin: auto;" /><img src="figure/diagnostic_plot_2.rmd/multiple%20bonferroni-4.png" width="672" style="display: block; margin: auto;" /><img src="figure/diagnostic_plot_2.rmd/multiple%20bonferroni-5.png" width="672" style="display: block; margin: auto;" /><img src="figure/diagnostic_plot_2.rmd/multiple%20bonferroni-6.png" width="672" style="display: block; margin: auto;" /><img src="figure/diagnostic_plot_2.rmd/multiple%20bonferroni-7.png" width="672" style="display: block; margin: auto;" /><img src="figure/diagnostic_plot_2.rmd/multiple%20bonferroni-8.png" width="672" style="display: block; margin: auto;" /><img src="figure/diagnostic_plot_2.rmd/multiple%20bonferroni-9.png" width="672" style="display: block; margin: auto;" /><img src="figure/diagnostic_plot_2.rmd/multiple%20bonferroni-10.png" width="672" style="display: block; margin: auto;" /></p> </div> </div> <div id="idea-3-predictive-density-on-top-of-histogram" class="section level2"> <h2>Idea 3: Predictive density on top of histogram</h2> <p>As discussed above, when we have constant <span class="math inline">\(\hat s_j\equiv s\)</span>, the estimated predictive density <span class="math inline">\(\hat f = \hat g * N\left(0, s^2\right)\)</span> is the same for all observations. Therefore, we could plot <span class="math inline">\(\hat f\left(\hat \beta_j\right)\)</span> on top of the histogram of all <span class="math inline">\(\hat \beta_j\)</span> to see if <code>ASH</code> fits the data and estimates the prior <span class="math inline">\(g\)</span> well.</p> <p>We are selecting four data sets with <span class="math inline">\(N(0, 1)\)</span> <span class="math inline">\(z\)</span> scores distorted by correlation. The first two are inflated, and the latter two mildly deflated. <code>ASH</code> has a hard time handling both cases, and the fitted predictive density curves can show that.</p> <p><img src="figure/diagnostic_plot_2.rmd/unnamed-chunk-8-1.png" width="672" style="display: block; margin: auto;" /><img src="figure/diagnostic_plot_2.rmd/unnamed-chunk-8-2.png" width="672" style="display: block; margin: auto;" /><img src="figure/diagnostic_plot_2.rmd/unnamed-chunk-8-3.png" width="672" style="display: block; margin: auto;" /><img src="figure/diagnostic_plot_2.rmd/unnamed-chunk-8-4.png" width="672" style="display: block; margin: auto;" /></p> </div> <div id="idea-4-kolmogorov-smirnov-k-s-test" class="section level2"> <h2>Idea 4: Kolmogorov-Smirnov (K-S) test</h2> <p>As explained in <a href="https://en.wikipedia.org/wiki/Kolmogorov%E2%80%93Smirnov_test">Wikipedia</a>,</p> <blockquote> <p>In statistics, the Kolmogorov–Smirnov test (K–S test or KS test) is a nonparametric test of the equality of continuous, one-dimensional probability distributions that can be used to compare a sample with a reference probability distribution (one-sample K–S test), or to compare two samples (two-sample K–S test). It is named after Andrey Kolmogorov and Nikolai Smirnov.</p> </blockquote> <p>The K-S test gives a <span class="math inline">\(p\)</span>-value, which can be displayed alongside all kinds of diagnostic plots mentioned above, as below.</p> <p><img src="figure/diagnostic_plot_2.rmd/KS-1.png" width="672" style="display: block; margin: auto;" /></p> <p><img src="figure/diagnostic_plot_2.rmd/unnamed-chunk-9-1.png" width="672" style="display: block; margin: auto;" /></p> </div> <div id="idea-5-empirical-cdf-and-dkw-inequality" class="section level2"> <h2>Idea 5: Empirical CDF and DKW inequality</h2> <p>The K-S test is related to <a href="https://en.wikipedia.org/wiki/Dvoretzky%E2%80%93Kiefer%E2%80%93Wolfowitz_inequality">the DKW inequality</a> for the empirical CDF. Let <span class="math inline">\(X_1, \ldots, X_n\)</span> be <span class="math inline">\(n\)</span> iid samples from <span class="math inline">\(F\)</span>. Let <span class="math inline">\(F_n\)</span> denote the empirical cumulative distribution function estimated from them. Then</p> <p><span class="math display">\[ \Pr\left(\sup\limits_{x\in\mathbb{R}}\left|F_n\left(x\right) - F\left(x\right)\right| > \epsilon\right) \leq 2e^{-2n\epsilon^2} \ . \]</span></p> <p>Therefore, we can set <span class="math inline">\(\epsilon\)</span> so that <span class="math inline">\(\alpha = 2e^{-2n\epsilon^2}\)</span>, and plot <span class="math inline">\(F_n\left(X_{(k)}\right) - F\left(X_{(k)}\right) = \frac kn - X_{(k)}\)</span> against <span class="math inline">\(\pm\epsilon\)</span>. Note that in this case we are plotting <span class="math inline">\(F_n\left(X_{(k)}\right) - F\left(X_{(k)}\right)\)</span>, not <span class="math inline">\(X_{(k)} - E\left[X_{(k)}\right]\)</span>, but under uniform they are very close, with no practical difference.</p> <p><img src="figure/diagnostic_plot_2.rmd/unnamed-chunk-10-1.png" width="672" style="display: block; margin: auto;" /></p> <p><img src="figure/diagnostic_plot_2.rmd/unnamed-chunk-11-1.png" width="672" style="display: block; margin: auto;" /></p> </div> <div id="session-information" class="section level2"> <h2>Session information</h2> <!-- Insert the session information into the document --> <pre class="r"><code>sessionInfo()</code></pre> <pre><code>R version 3.3.3 (2017-03-06) Platform: x86_64-apple-darwin13.4.0 (64-bit) Running under: macOS Sierra 10.12.4 locale: [1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8 attached base packages: [1] stats graphics grDevices utils datasets methods base loaded via a namespace (and not attached): [1] backports_1.0.5 magrittr_1.5 rprojroot_1.2 tools_3.3.3 [5] htmltools_0.3.5 yaml_2.1.14 Rcpp_0.12.10 stringi_1.1.2 [9] rmarkdown_1.3 knitr_1.15.1 git2r_0.18.0 stringr_1.2.0 [13] digest_0.6.11 evaluate_0.10 </code></pre> </div> <hr> <p> This <a href="http://rmarkdown.rstudio.com">R Markdown</a> site was created with <a href="https://github.com/jdblischak/workflowr">workflowr</a> </p> <hr> <!-- To enable disqus, uncomment the section below and provide your disqus_shortname --> <!-- disqus <div id="disqus_thread"></div> <script type="text/javascript"> /* * * CONFIGURATION VARIABLES: EDIT BEFORE PASTING INTO YOUR WEBPAGE * * */ var disqus_shortname = 'rmarkdown'; // required: replace example with your forum shortname /* * * DON'T EDIT BELOW THIS LINE * * */ (function() { var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true; dsq.src = '//' + disqus_shortname + '.disqus.com/embed.js'; (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq); })(); </script> <noscript>Please enable JavaScript to view the <a href="http://disqus.com/?ref_noscript">comments powered by Disqus.</a></noscript> <a href="http://disqus.com" class="dsq-brlink">comments powered by <span class="logo-disqus">Disqus</span></a> --> </div> </div> </div> <script> // add bootstrap table styles to pandoc tables function bootstrapStylePandocTables() { $('tr.header').parent('thead').parent('table').addClass('table table-condensed'); } $(document).ready(function () { bootstrapStylePandocTables(); }); </script> <!-- dynamically load mathjax for compatibility with self-contained --> <script> (function () { var script = document.createElement("script"); script.type = "text/javascript"; script.src = "https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"; document.getElementsByTagName("head")[0].appendChild(script); })(); </script> </body> </html>