<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

  <title><![CDATA[Jason A. French]]></title>
  <link href="http://frenchja.github.com/atom.xml" rel="self"/>
  <link href="http://frenchja.github.com/"/>
  <updated>2014-08-06T18:20:09-07:00</updated>
  <id>http://frenchja.github.com/</id>
  <author>
    <name><![CDATA[Jason A. French]]></name>
    
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <entry>
    <title type="html"><![CDATA[Summer Reading on Data Science]]></title>
    <link href="http://frenchja.github.com/blog/2014/08/06/summer-reading-on-data-science/"/>
    <updated>2014-08-06T18:07:00-07:00</updated>
    <id>http://frenchja.github.com/blog/2014/08/06/summer-reading-on-data-science</id>
    <content type="html"><![CDATA[<p>One of the benefits of being at <a href="http://insightdatascience.com/">Insight</a> has been a reasonably large library stocked with great material for learning data science. If you&#8217;re looking to brush up on your skills or break into the industry, I recommend checking out the following:</p>

<ul>
<li><p>Gelman, A., &amp; Hill, J. (2006). <em>Data analysis using regression and multilevel/hierarchical models</em>. Cambridge University Press.</p></li>
<li><p>Hastie, T., Tibshirani, R., Friedman, J., Hastie, T., Friedman, J., &amp; Tibshirani, R. (2009). <em>The elements of statistical learning</em> (Vol. 2, No. 1). New York: Springer.</p></li>
<li><p>Russell, M. A. (2013). <em>Mining the Social Web: Data Mining Facebook, Twitter, LinkedIn, Google+, GitHub, and More</em>. O&#8217;Reilly Media, Inc.</p></li>
<li><p>McDowell, G. L. (2013). <em>Cracking the Coding Interview: 150 Programming Questions and Solutions</em>. CareerCup.</p></li>
<li><p>Chang, W. (2012). <em>R graphics cookbook</em>. O&#8217;Reilly Media, Inc.</p></li>
</ul>


<p>I actually read through <a href="https://github.com/wch">Winston&#8217;s</a> cookbook before Insight, but it&#8217;s been an invaluable resource.  Why write 20 lines of matplotlib or R base graphics when you can accomplish a better graph using 5 lines of <a href="http://ggplot2.org/">ggplot2</a>?</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Recursion in R]]></title>
    <link href="http://frenchja.github.com/blog/2014/07/26/recursion-in-r/"/>
    <updated>2014-07-26T15:49:00-07:00</updated>
    <id>http://frenchja.github.com/blog/2014/07/26/recursion-in-r</id>
    <content type="html"><![CDATA[<p>Most technical interviews with companies will ask
you to whiteboard code some type of recursive function
in your favorite programming language.  Although Python
seems to be the dominate king in data science, recursion
can be a powerful tool in R.</p>

<h2>What is recursion?</h2>

<p>Recursive functions call <em>themselves</em>.  That is, they
break down the problem into the smallest possible
components and the <code>function()</code> calls itself within the
original function() on each of the smaller components.
Afterward, the results are put together to solve the
original problem.  Let&#8217;s take a look at more concrete examples.</p>

<!-- more -->


<h2>Quicksort</h2>

<p>A technical interview will usually ask you to implement
some type of sorting function that can be solved using
a recursive algorithm.  Let&#8217;s try implementing <a href="https://en.wikipedia.org/wiki/Quicksort">quicksort</a> in R:</p>

<figure class='code'><figcaption><span>Programming Quicksort in R</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
</pre></td><td class='code'><pre><code class='r'><span class='line'><span class="c1">#!/usr/bin/env Rscript</span>
</span><span class='line'><span class="c1"># Author:  Jason A. French</span>
</span><span class='line'>
</span><span class='line'>quickSort <span class="o">&lt;-</span> <span class="kr">function</span><span class="p">(</span>vect<span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="c1"># Args:</span>
</span><span class='line'>  <span class="c1">#  vect: Numeric Vector</span>
</span><span class='line'>  
</span><span class='line'>  <span class="c1"># Stop if vector has length of 1</span>
</span><span class='line'>  <span class="kr">if</span> <span class="p">(</span>length<span class="p">(</span>vect<span class="p">)</span> <span class="o">&lt;=</span> <span class="m">1</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="kr">return</span><span class="p">(</span>vect<span class="p">)</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>  <span class="c1"># Pick an element from the vector</span>
</span><span class='line'>  element <span class="o">&lt;-</span> vect<span class="p">[</span><span class="m">1</span><span class="p">]</span>
</span><span class='line'>  partition <span class="o">&lt;-</span> vect<span class="p">[</span><span class="m">-1</span><span class="p">]</span>
</span><span class='line'>  <span class="c1"># Reorder vector so that integers less than element</span>
</span><span class='line'>  <span class="c1"># come before, and all integers greater come after.</span>
</span><span class='line'>  v1 <span class="o">&lt;-</span> partition<span class="p">[</span>partition <span class="o">&lt;</span> element<span class="p">]</span>
</span><span class='line'>  v2 <span class="o">&lt;-</span> partition<span class="p">[</span>partition <span class="o">&gt;=</span> element<span class="p">]</span>
</span><span class='line'>  <span class="c1"># Recursively apply steps to smaller vectors.</span>
</span><span class='line'>  v1 <span class="o">&lt;-</span> quickSort<span class="p">(</span>v1<span class="p">)</span>
</span><span class='line'>  v2 <span class="o">&lt;-</span> quickSort<span class="p">(</span>v2<span class="p">)</span>
</span><span class='line'>  <span class="kr">return</span><span class="p">(</span>c<span class="p">(</span>v1<span class="p">,</span> element<span class="p">,</span> v2<span class="p">))</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>




<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='r'><span class='line'>quickSort<span class="p">(</span>c<span class="p">(</span><span class="m">4</span><span class="p">,</span> <span class="m">65</span><span class="p">,</span> <span class="m">2</span><span class="p">,</span> <span class="m">-31</span><span class="p">,</span> <span class="m">0</span><span class="p">,</span> <span class="m">99</span><span class="p">,</span> <span class="m">83</span><span class="p">,</span> <span class="m">782</span><span class="p">,</span> <span class="m">1</span><span class="p">))</span>
</span><span class='line'><span class="p">[</span><span class="m">1</span><span class="p">]</span> <span class="m">-31</span>   <span class="m">0</span>   <span class="m">1</span>   <span class="m">2</span>   <span class="m">4</span>  <span class="m">65</span>  <span class="m">83</span>  <span class="m">99</span> <span class="m">782</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Merge Sort</h2>

<p>A second sorting algorithm that we can implement using recursion is the <a href="https://en.wikipedia.org/wiki/Merge_sort">Merge Sort</a>.
Sorting algorithms are important because they differ in their <em>speed</em>, depending on the
nature of the input data.  In the case of merge sort, the <em>worst possible outcome</em> for
the time it takes to sort the data is <em>n * log(n)</em>, where <em>n</em> is the length of your list of
numbers.</p>

<p>Like Quicksort, we&#8217;re splitting the vector into smaller sub-vectors by halving it until
each vector has just one integer.  We then merge the vectors back together, this time in order. Let&#8217;s tackle this algorithm in R as well.</p>

<p>I found that <a href="http://rosettacode.org/">Rosetta Code</a> already provides a good example, so below is the their public domain code with my
comments added to the code for explanation.</p>

<figure class='code'><figcaption><span>Merge sort in R</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
<span class='line-number'>56</span>
<span class='line-number'>57</span>
<span class='line-number'>58</span>
<span class='line-number'>59</span>
<span class='line-number'>60</span>
<span class='line-number'>61</span>
</pre></td><td class='code'><pre><code class='r'><span class='line'><span class="c1">#!/usr/bin/env Rscript</span>
</span><span class='line'><span class="c1"># http://rosettacode.org/wiki/Sorting_algorithms/Merge_sort#R</span>
</span><span class='line'>
</span><span class='line'>mergesort <span class="o">&lt;-</span> <span class="kr">function</span><span class="p">(</span>m<span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>   merge_ <span class="o">&lt;-</span> <span class="kr">function</span><span class="p">(</span>left<span class="p">,</span> right<span class="p">)</span>
</span><span class='line'>   <span class="c1"># Recursive function to compare and append values in order</span>
</span><span class='line'>   <span class="p">{</span>
</span><span class='line'>      <span class="c1"># Create a list to hold the results</span>
</span><span class='line'>      result <span class="o">&lt;-</span> c<span class="p">()</span>
</span><span class='line'>      <span class="c1"># This is our stop condition. While left and right contain </span>
</span><span class='line'>      <span class="c1"># a value, compare them</span>
</span><span class='line'>      <span class="kr">while</span><span class="p">(</span>length<span class="p">(</span>left<span class="p">)</span> <span class="o">&gt;</span> <span class="m">0</span> <span class="o">&amp;&amp;</span> length<span class="p">(</span>right<span class="p">)</span> <span class="o">&gt;</span> <span class="m">0</span><span class="p">)</span>
</span><span class='line'>      <span class="p">{</span>
</span><span class='line'>           <span class="c1"># If left is less than or equal to right,</span>
</span><span class='line'>           <span class="c1"># add it to the result list</span>
</span><span class='line'>         <span class="kr">if</span><span class="p">(</span>left<span class="p">[</span><span class="m">1</span><span class="p">]</span> <span class="o">&lt;=</span> right<span class="p">[</span><span class="m">1</span><span class="p">])</span>
</span><span class='line'>         <span class="p">{</span>
</span><span class='line'>            result <span class="o">&lt;-</span> c<span class="p">(</span>result<span class="p">,</span> left<span class="p">[</span><span class="m">1</span><span class="p">])</span>
</span><span class='line'>            <span class="c1"># Remove the value from the list</span>
</span><span class='line'>            left <span class="o">&lt;-</span> left<span class="p">[</span><span class="m">-1</span><span class="p">]</span>
</span><span class='line'>         <span class="p">}</span> <span class="kr">else</span>
</span><span class='line'>         <span class="p">{</span>
</span><span class='line'>            <span class="c1"># When right is less than or equal to left,</span>
</span><span class='line'>            <span class="c1"># add it to the result.</span>
</span><span class='line'>            result <span class="o">&lt;-</span> c<span class="p">(</span>result<span class="p">,</span> right<span class="p">[</span><span class="m">1</span><span class="p">])</span>
</span><span class='line'>            <span class="c1"># Remove the appended integer from the list.</span>
</span><span class='line'>            right <span class="o">&lt;-</span> right<span class="p">[</span><span class="m">-1</span><span class="p">]</span>
</span><span class='line'>         <span class="p">}</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>      <span class="c1"># Keep appending the values to the result while left and right</span>
</span><span class='line'>      <span class="c1"># exist.</span>
</span><span class='line'>      <span class="kr">if</span><span class="p">(</span>length<span class="p">(</span>left<span class="p">)</span> <span class="o">&gt;</span> <span class="m">0</span><span class="p">)</span> result <span class="o">&lt;-</span> c<span class="p">(</span>result<span class="p">,</span> left<span class="p">)</span>
</span><span class='line'>      <span class="kr">if</span><span class="p">(</span>length<span class="p">(</span>right<span class="p">)</span> <span class="o">&gt;</span> <span class="m">0</span><span class="p">)</span> result <span class="o">&lt;-</span> c<span class="p">(</span>result<span class="p">,</span> right<span class="p">)</span>
</span><span class='line'>      result
</span><span class='line'>   <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>   <span class="c1"># Below is our stop condition for the mergesort function.</span>
</span><span class='line'>   <span class="c1"># When the length of the vector is 1, just return the integer. </span>
</span><span class='line'>   len <span class="o">&lt;-</span> length<span class="p">(</span>m<span class="p">)</span>
</span><span class='line'>   <span class="kr">if</span><span class="p">(</span>len <span class="o">&lt;=</span> <span class="m">1</span><span class="p">)</span> m <span class="kr">else</span>
</span><span class='line'>   <span class="p">{</span>
</span><span class='line'>      <span class="c1"># Otherwise keep dividing the vector into two halves.</span>
</span><span class='line'>      middle <span class="o">&lt;-</span> length<span class="p">(</span>m<span class="p">)</span> <span class="o">/</span> <span class="m">2</span>
</span><span class='line'>      <span class="c1"># Add every integer from 1 to the middle to the left</span>
</span><span class='line'>      left <span class="o">&lt;-</span> m<span class="p">[</span><span class="m">1</span><span class="o">:</span>floor<span class="p">(</span>middle<span class="p">)]</span>
</span><span class='line'>      right <span class="o">&lt;-</span> m<span class="p">[</span>floor<span class="p">(</span>middle<span class="m">+1</span><span class="p">)</span><span class="o">:</span>len<span class="p">]</span>
</span><span class='line'>      <span class="c1"># Recursively call mergesort() on the left and right halves.</span>
</span><span class='line'>      left <span class="o">&lt;-</span> mergesort<span class="p">(</span>left<span class="p">)</span>
</span><span class='line'>      right <span class="o">&lt;-</span> mergesort<span class="p">(</span>right<span class="p">)</span>
</span><span class='line'>      <span class="c1"># Order and combine the results.</span>
</span><span class='line'>      <span class="kr">if</span><span class="p">(</span>left<span class="p">[</span>length<span class="p">(</span>left<span class="p">)]</span> <span class="o">&lt;=</span> right<span class="p">[</span><span class="m">1</span><span class="p">])</span>
</span><span class='line'>      <span class="p">{</span>
</span><span class='line'>         c<span class="p">(</span>left<span class="p">,</span> right<span class="p">)</span>
</span><span class='line'>      <span class="p">}</span> <span class="kr">else</span>
</span><span class='line'>      <span class="p">{</span>
</span><span class='line'>         merge_<span class="p">(</span>left<span class="p">,</span> right<span class="p">)</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>   <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>




<!--
## Binary Search Tree
Another question commonly asked in tech interviews is to 
implement a [binary search tree](https://en.wikipedia.org/wiki/Binary_search_tree).  Once again, these types of questions are common with Java or Python but R programmers can implement them 
just as well. A binary search tree is a node-based way to organize data.  The data structure generally follows some law, such as "each value in the left child is less than the parent node, and each value in the right child is greater than the parent node."

<img src="images/binarytree.png" title="Example Binary Tree" >

In the picture above, 7 is in the *root* of the tree.  All other 
values follow my rule above.

While implementing a BST is non-trivial in Python, it becomes 
more complex in R as R doesn&#8217;t have pointer [variables](https://en.wikipedia.org/wiki/Pointer_%28computer_programming%29) as far as I know.  However, we can still implement our data structure as a series of matrices, where 
each row contains the c(left, right, root) for each node.

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
</pre></td><td class='code'><pre><code class='r'><span class='line'>print.tree <span class="o">&lt;-</span> <span class="kr">function</span><span class="p">(</span>index<span class="p">,</span> tree<span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="c1"># Args:</span>
</span><span class='line'>  <span class="c1">#  index: Tree row</span>
</span><span class='line'>  <span class="c1">#  tree</span>
</span><span class='line'>  left <span class="o">&lt;-</span> tree<span class="o">$</span>matrix<span class="p">[</span>index<span class="p">,</span> <span class="m">1</span><span class="p">]</span>
</span><span class='line'>  print<span class="p">(</span>tree<span class="o">$</span>matrix<span class="p">[</span>index<span class="p">,</span> <span class="m">3</span><span class="p">]</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'>new.tree <span class="o">&lt;-</span> <span class="kr">function</span><span class="p">(</span>value<span class="p">,</span> nrow<span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  m <span class="o">&lt;-</span> matrix<span class="p">(</span>rep<span class="p">(</span><span class="kc">NA</span><span class="p">,</span> nrow<span class="o">*</span><span class="m">3</span><span class="p">,</span> ncol <span class="o">=</span> <span class="m">3</span><span class="p">)</span>
</span><span class='line'>  <span class="c1"># Place the first value in the 3rd root column</span>
</span><span class='line'>  m<span class="p">[</span><span class="m">1</span><span class="p">,</span> <span class="m">3</span><span class="p">]</span> <span class="o">&lt;-</span> value
</span><span class='line'>  <span class="kr">return</span><span class="p">(</span>list<span class="p">(</span>mat <span class="o">=</span> m<span class="p">,</span> <span class="kr">next</span> <span class="o">=</span> <span class="m">2</span><span class="p">,</span> nrow <span class="o">=</span> nrow<span class="p">))</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'>insert.tree <span class="o">&lt;-</span> <span class="kr">function</span><span class="p">(</span>index<span class="p">,</span> tree<span class="p">,</span> new.value<span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="c1"># Inserts a new value into the sub-tree, with the root being</span>
</span><span class='line'>  <span class="c1"># at &#39;index&#39;.</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1"># Should the value go to the left or right child?</span>
</span><span class='line'>  direction <span class="o">&lt;-</span> <span class="kr">if</span><span class="p">(</span>new.value <span class="o">&lt;=</span> tree<span class="o">$</span>matrix<span class="p">[</span>index<span class="p">,</span> <span class="m">3</span><span class="p">]){</span>
</span><span class='line'>          <span class="m">1</span><span class="p">}</span> <span class="kr">else</span> <span class="p">{</span>
</span><span class='line'>          <span class="m">2</span><span class="p">}</span>
</span><span class='line'>  <span class="c1"># If that child is NA, place new.value.  Otherwise recurse down.</span>
</span><span class='line'>  <span class="kr">if</span><span class="p">(</span>is.na<span class="p">(</span>tree<span class="o">$</span>matrix<span class="p">[</span>index<span class="p">,</span> direction<span class="p">]))</span> <span class="p">{</span>
</span><span class='line'>      new.index <span class="o">&lt;-</span> tree<span class="o">$</span><span class="kr">next</span>
</span><span class='line'>      
</span><span class='line'>      <span class="kr">if</span><span class="p">(</span>tree<span class="o">$</span><span class="kr">next</span> <span class="o">==</span> nrow<span class="p">(</span>tree<span class="o">$</span>matrix<span class="p">)</span> <span class="o">+</span> <span class="m">1</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>
&#8211;>


<h3>References</h3>

<ul>
<li>Matloff, N., &amp; Matloff, N. S. (2011). The art of R programming: a tour of statistical software design. No Starch Press.</li>
<li>https://stackoverflow.com/questions/8797089/how-to-walk-up-a-tree-in-r</li>
</ul>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Installing old R packages for new installations]]></title>
    <link href="http://frenchja.github.com/blog/2014/07/14/updating-r-packages-after-new-installations/"/>
    <updated>2014-07-14T18:31:00-07:00</updated>
    <id>http://frenchja.github.com/blog/2014/07/14/updating-r-packages-after-new-installations</id>
    <content type="html"><![CDATA[<p>New versions of R are pushed frequently to fix bugs and address performance
concerns.  However, in order to avoid conflicts between R and packages that were
compiled for older versions of R, every upgrade defines a new system and user library
location in which to install packages (e.g., /Library/Frameworks/R.framework/Versions/3.1/).<br/>
So how does one avoid installing each package
manually?</p>

<p>I wrote the following code for my lab to automate the re-installation of an
R system library after version upgrades.  It reads the old package names into R as a list
and recompiles each packages for the new version of R, when available.</p>

<figure class='code'><figcaption><span>Re-installing R packages for newer versions</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
</pre></td><td class='code'><pre><code class='r'><span class='line'><span class="c1">#!/usr/bin/env Rscript</span>
</span><span class='line'><span class="c1"># Automatic Package Reinstallation</span>
</span><span class='line'><span class="c1"># Author:  Jason A. French, Northwestern University</span>
</span><span class='line'><span class="c1"># GPL v2.0</span>
</span><span class='line'>
</span><span class='line'><span class="c1"># Replace the 3.1 with your old version</span>
</span><span class='line'>versions <span class="o">&lt;-</span> system<span class="p">(</span><span class="s">&#39;ls /Library/Frameworks/R.framework/Versions/&#39;</span><span class="p">,</span> intern <span class="o">=</span> <span class="kc">TRUE</span><span class="p">)</span>
</span><span class='line'>previous.version <span class="o">&lt;-</span> sort<span class="p">(</span>versions<span class="p">[</span><span class="o">-</span>which<span class="p">(</span>versions<span class="o">==</span><span class="s">&#39;Current&#39;</span><span class="p">)])[</span>length<span class="p">(</span>sort<span class="p">(</span>versions<span class="p">[</span><span class="o">-</span>which<span class="p">(</span>versions<span class="o">==</span><span class="s">&#39;Current&#39;</span><span class="p">)]))</span> <span class="o">-</span> <span class="m">1</span><span class="p">]</span>
</span><span class='line'>full.dir <span class="o">&lt;-</span> paste<span class="p">(</span><span class="s">&#39;/Library/Frameworks/R.framework/Versions/&#39;</span><span class="p">,</span>
</span><span class='line'>                  previous.version<span class="p">,</span>
</span><span class='line'>                  <span class="s">&#39;/Resources/library/&#39;</span><span class="p">,</span>
</span><span class='line'>                  sep <span class="o">=</span> <span class="s">&#39;&#39;</span><span class="p">)</span>
</span><span class='line'>packages <span class="o">&lt;-</span> system<span class="p">(</span>paste<span class="p">(</span><span class="s">&#39;ls&#39;</span><span class="p">,</span> full.dir<span class="p">),</span> intern <span class="o">=</span> <span class="kc">TRUE</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>lapply<span class="p">(</span>X <span class="o">=</span> packages<span class="p">,</span> <span class="kr">function</span><span class="p">(</span>x<span class="p">){</span>install.packages<span class="p">(</span>x<span class="p">,</span> type <span class="o">=</span> <span class="s">&#39;source&#39;</span><span class="p">)})</span>
</span><span class='line'>
</span><span class='line'>update.packages<span class="p">(</span>ask <span class="o">=</span> <span class="kc">FALSE</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Using R with MySQL Databases]]></title>
    <link href="http://frenchja.github.com/blog/2014/07/03/using-r-with-mysql-databases/"/>
    <updated>2014-07-03T10:58:00-07:00</updated>
    <id>http://frenchja.github.com/blog/2014/07/03/using-r-with-mysql-databases</id>
    <content type="html"><![CDATA[<h2>Overview</h2>

<p>When I began using R, like most researchers I kept all my data in some combination
of R&#8217;s native <a href="http://stat.ethz.ch/R-manual/R-devel/library/base/html/data.frame.html">data.frame</a>
format or a <a href="http://en.wikipedia.org/wiki/Comma-separated_values">CSV</a> file that my analysis would continually read.
However, as I began to analyze big datasets at the <a href="https://sapa-project.org">SAPA Project</a>
and at <a href="http://insightdatascience.com/">Insight</a>,
I realized that there is a lot of value to instead keeping your data in a MySQL database
and streaming it into R when necessary.
This post will briefly outline a few advantages of using a database to store data and run through a
basic example of using R to transfer data to MySQL.</p>

<!-- more -->


<h3>Memory Efficiency</h3>

<p>Relational databases, such as MySQL, organize data into <em>tables</em> (like a spreadsheet)
and can link values in tables to each other.  Generally speaking, they are better at handling large datasets and are more efficient
at storing and accessing data than CSVs due to compression and indexing.
The data stay in the MySQL database until accessed via a query, which is
different than how R approaches data.frames and CSVs.
When accessing data stored in a data.frame or CSV file in R, the data must all fit <em>in memory</em>.
However, this becomes a problem if when using a large dataset or if you&#8217;re cursed with an older computer with &lt;= 4GB of RAM.
In these cases, every time you load your dataset or do a memory-intensive operation (e.g., polychoric correlations)
your computer will slow to a painful crawl as your hard drives grind while your operating system
switches to using <a href="http://en.wikipedia.org/wiki/Virtual_memory">virtual memory</a> or swap space, rather than RAM.
You could get around this by using random sampling to create a smaller subset (or multiple subsets
if you want to bootstrap), but you can also use this technique on a SQL database. The advantage is that SQL databases
only load the data you&#8217;re working with into your local machine&#8217;s RAM when you SELECT the data you need - leaving plenty of
memory for the actual analysis.</p>

<h3>Safety and Security</h3>

<p>Two additional reasons I prefer SQL databases are safety and security. Services such as
Amazon&#8217;s RDS (i.e., Relational Database Service) offer frequent backups and easy replication
across instances. If the local machine dies, the data are safe and uncorrupted. If I were storing
data in an .Rdata file, I&#8217;d have to rely on my OS (e.g., Time Machine) or a cloud-based storage solution
(e.g., Dropbox or CrashPlan) to backup my data. Worse, if I were storing my data in an Excel database and Excel
crashed, I may risk losing years of progress.</p>

<p>Using MySQL, I can give a collaborator access
to only needed portions of the data by locking down their SQL user to certain tables
and operations. By limiting access, we limit risk of corruption and overwriting years of progress.</p>

<h3>Scalable as the need grows</h3>

<p>Last, I find databases such as MySQL to be more scalable due to cloud computing. In the case of using Amazon&#8217;s RDS,
you can buy as much storage or bandwidth as you need to complete your analysis, dissertation,
or build your web app. If I need multiple nodes or machines to analyze the data, I don&#8217;t need to keep a copy of
the data on each machine.  I simply pass the SQL authentication parameters to each machine and the
data is accessed from a central location.</p>

<p>So let&#8217;s begin by setting up a <a href="http://aws.amazon.com/rds/free/">Free-Tier RDS service</a> on Amazon and then move some
data from R to the RDS database.</p>

<h2>Setting up an RDS Instance</h2>

<p>Amazon currently offers a Free Tier for their RDS storage.  It offers:</p>

<ul>
<li>Enough hours to run a DB Instance continuously each month,</li>
<li>20 GB of database storage,</li>
<li>10 million I/O operations, and</li>
<li>automated database backups.</li>
</ul>


<p>To setup an RDS instance:</p>

<ol>
<li>Sign into the AWS Management Console.</li>
<li>Select &#8216;RDS&#8217; under the &#8216;Database&#8217; group.</li>
<li>Click &#8216;Launch DB Instance&#8217;.</li>
<li>Select &#8216;MySQL&#8217; for the database engine.</li>
<li>Select &#8216;No&#8217; when asked if you intend to use the database for production purposes. Accidentally selecting &#8216;Yes&#8217; could result in hefty fees.</li>
<li>For &#8216;Instance Class&#8217;, select &#8216;db.t1.micro&#8217;, &#8216;No&#8217; for &#8216;Multi-AZ Deployment&#8217;, and 20 GB for &#8216;Allocated Storage&#8217;.</li>
<li>Click &#8216;Next&#8217; and launch your RDS instance.</li>
</ol>


<p>At this point, you should have a blank RDS database with a master username and password combination. Be sure to test that you can connect - I suggest using <a href="http://www.sequelpro.com/">Sequel Pro</a>. <em>If you can&#8217;t connect,
you may need to open up port 3306 in your EC2 Security Group</em>.</p>

<p>Click on your new RDS Instance to get the hostname to connect to and note the database name:</p>

<p><img class="center" src="http://frenchja.github.com/images/rds1.png"></p>

<p>Fire up Sequel Pro and test out your new database.  If you want to connect using SSL, you&#8217;ll need the SSH key you generated when
you first created your EC2 instance (not covered here).</p>

<p><img class="center" src="http://frenchja.github.com/images/rds2.png"></p>

<h2>Installing the RMySQL package</h2>

<p>Previously, I found installing <a href="http://cran.r-project.org/web/packages/RMySQL/index.html">RMySQL</a> to be very difficult when I was using MacPorts.  However,
having switched to <a href="http://brew.sh/">Homebrew</a> on my new machine, RMySQL found all the MySQL headers and libraries as
<a href="http://brew.sh/">Homebrew</a> uses the <code>/usr/local</code> directory to store your software, which is already in your shell $PATH.</p>

<p>Before compiling RMySQL, first compile MySQL using Homebrew:</p>

<figure class='code'><figcaption><span>Installing MySQL using Homebrew</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="c"># If you haven&#39;t already, install Homebrew:</span>
</span><span class='line'><span class="c"># ruby -e &quot;$(curl -fsSL https://raw.github.com/Homebrew/homebrew/go/install)&quot;</span>
</span><span class='line'>
</span><span class='line'><span class="c"># Install MySQL</span>
</span><span class='line'>brew install mysql
</span></code></pre></td></tr></table></div></figure>




<figure class='code'><figcaption><span>Installing MySQL using Homebrew</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="o">==</span>&gt; Downloading https://downloads.sf.net/project/machomebrew/Bottles/mysql-5.6.1
</span><span class='line'>Already downloaded: /Library/Caches/Homebrew/mysql-5.6.19.mavericks.bottle.tar.gz
</span><span class='line'><span class="o">==</span>&gt; Pouring mysql-5.6.19.mavericks.bottle.tar.gz
</span><span class='line'><span class="o">==</span>&gt; Caveats
</span><span class='line'>A <span class="s2">&quot;/etc/my.cnf&quot;</span> from another install may interfere with a Homebrew-built
</span><span class='line'>server starting up correctly.
</span><span class='line'>
</span><span class='line'>To connect:
</span><span class='line'>    mysql -uroot
</span><span class='line'>
</span><span class='line'>To have launchd start mysql at login:
</span><span class='line'>    ln -sfv /usr/local/opt/mysql/*.plist ~/Library/LaunchAgents
</span><span class='line'>Then to load mysql now:
</span><span class='line'>    launchctl load ~/Library/LaunchAgents/homebrew.mxcl.mysql.plist
</span><span class='line'>Or, <span class="k">if </span>you don<span class="err">&#39;</span>t want/need launchctl, you can just run:
</span><span class='line'>    mysql.server <span class="nv">start</span>
</span><span class='line'><span class="o">==</span>&gt; Summary
</span><span class='line'>🍺  /usr/local/Cellar/mysql/5.6.19: 9536 files, 338M
</span></code></pre></td></tr></table></div></figure>


<p>Next, compile RMySQL from source:</p>

<figure class='code'><figcaption><span>Compiling RMySQL</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='r'><span class='line'>install.packages<span class="p">(</span><span class="s">&#39;RMySQL&#39;</span><span class="p">,</span> type <span class="o">=</span> <span class="s">&#39;source&#39;</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>




<figure class='code'><figcaption><span>Compiling RMySQL</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
<span class='line-number'>56</span>
<span class='line-number'>57</span>
<span class='line-number'>58</span>
</pre></td><td class='code'><pre><code class='r'><span class='line'>trying URL <span class="s">&#39;http://cran.rstudio.com/src/contrib/RMySQL_0.9-3.tar.gz&#39;</span>
</span><span class='line'>Content type <span class="s">&#39;application/x-gzip&#39;</span> length <span class="m">165363</span> bytes <span class="p">(</span><span class="m">161</span> Kb<span class="p">)</span>
</span><span class='line'>opened URL
</span><span class='line'><span class="o">==================================================</span>
</span><span class='line'>downloaded <span class="m">161</span> Kb
</span><span class='line'>
</span><span class='line'><span class="o">*</span> installing <span class="o">*</span>source<span class="o">*</span> package ‘RMySQL’ <span class="kc">...</span>
</span><span class='line'><span class="o">**</span> package ‘RMySQL’ successfully unpacked and MD5 sums checked
</span><span class='line'>checking <span class="kr">for</span> gcc... gcc
</span><span class='line'>checking <span class="kr">for</span> C compiler default output file name... a.out
</span><span class='line'>checking whether the C compiler works... yes
</span><span class='line'>checking whether we are cross compiling... no
</span><span class='line'>checking <span class="kr">for</span> suffix of executables...
</span><span class='line'>checking <span class="kr">for</span> suffix of object files... o
</span><span class='line'>checking whether we are using the GNU C compiler... yes
</span><span class='line'>checking whether gcc accepts <span class="o">-</span>g... yes
</span><span class='line'>checking <span class="kr">for</span> gcc option to accept ANSI C... none needed
</span><span class='line'>checking how to run the C preprocessor... gcc <span class="o">-</span>E
</span><span class='line'>checking <span class="kr">for</span> compress <span class="kr">in</span> <span class="o">-</span>lz... yes
</span><span class='line'>checking <span class="kr">for</span> getopt_long <span class="kr">in</span> <span class="o">-</span>lc... yes
</span><span class='line'>checking <span class="kr">for</span> mysql_init <span class="kr">in</span> <span class="o">-</span>lmysqlclient... yes
</span><span class='line'>checking <span class="kr">for</span> egrep... grep <span class="o">-</span>E
</span><span class='line'>checking <span class="kr">for</span> ANSI C header files...
</span><span class='line'>rm<span class="o">:</span> conftest.dSYM<span class="o">:</span> is a directory
</span><span class='line'>rm<span class="o">:</span> conftest.dSYM<span class="o">:</span> is a directory
</span><span class='line'>yes
</span><span class='line'>checking <span class="kr">for</span> sys<span class="o">/</span>types.h... yes
</span><span class='line'>checking <span class="kr">for</span> sys<span class="o">/</span>stat.h... yes
</span><span class='line'>checking <span class="kr">for</span> stdlib.h... yes
</span><span class='line'>checking <span class="kr">for</span> string.h... yes
</span><span class='line'>checking <span class="kr">for</span> memory.h... yes
</span><span class='line'>checking <span class="kr">for</span> strings.h... yes
</span><span class='line'>checking <span class="kr">for</span> inttypes.h... yes
</span><span class='line'>checking <span class="kr">for</span> stdint.h... yes
</span><span class='line'>checking <span class="kr">for</span> unistd.h... yes
</span><span class='line'>checking mysql.h usability... no
</span><span class='line'>checking mysql.h presence... no
</span><span class='line'>checking <span class="kr">for</span> mysql.h... no
</span><span class='line'>checking <span class="o">/</span>usr<span class="o">/</span>local<span class="o">/</span>include<span class="o">/</span>mysql<span class="o">/</span>mysql.h usability... yes
</span><span class='line'>checking <span class="o">/</span>usr<span class="o">/</span>local<span class="o">/</span>include<span class="o">/</span>mysql<span class="o">/</span>mysql.h presence... yes
</span><span class='line'>checking <span class="kr">for</span> <span class="o">/</span>usr<span class="o">/</span>local<span class="o">/</span>include<span class="o">/</span>mysql<span class="o">/</span>mysql.h... yes
</span><span class='line'>configure<span class="o">:</span> creating .<span class="o">/</span>config.status
</span><span class='line'>config.status<span class="o">:</span> creating src<span class="o">/</span>Makevars
</span><span class='line'><span class="o">**</span> libs
</span><span class='line'>clang <span class="o">-</span>I<span class="o">/</span>Library<span class="o">/</span>Frameworks<span class="o">/</span>R.framework<span class="o">/</span>Resources<span class="o">/</span>include <span class="o">-</span>DNDEBUG <span class="o">-</span>I<span class="o">/</span>usr<span class="o">/</span>local<span class="o">/</span>include<span class="o">/</span>mysql <span class="o">-</span>I<span class="o">/</span>usr<span class="o">/</span>local<span class="o">/</span>include <span class="o">-</span>I<span class="o">/</span>usr<span class="o">/</span>local<span class="o">/</span>include<span class="o">/</span>freetype2 <span class="o">-</span>I<span class="o">/</span>opt<span class="o">/</span>X11<span class="o">/</span>include    <span class="o">-</span>fPIC  <span class="o">-</span>Wall <span class="o">-</span>mtune<span class="o">=</span>core2 <span class="o">-</span>g <span class="o">-</span>O2  <span class="o">-</span>c RS<span class="o">-</span>DBI.c <span class="o">-</span>o RS<span class="o">-</span>DBI.o
</span><span class='line'>clang <span class="o">-</span>I<span class="o">/</span>Library<span class="o">/</span>Frameworks<span class="o">/</span>R.framework<span class="o">/</span>Resources<span class="o">/</span>include <span class="o">-</span>DNDEBUG <span class="o">-</span>I<span class="o">/</span>usr<span class="o">/</span>local<span class="o">/</span>include<span class="o">/</span>mysql <span class="o">-</span>I<span class="o">/</span>usr<span class="o">/</span>local<span class="o">/</span>include <span class="o">-</span>I<span class="o">/</span>usr<span class="o">/</span>local<span class="o">/</span>include<span class="o">/</span>freetype2 <span class="o">-</span>I<span class="o">/</span>opt<span class="o">/</span>X11<span class="o">/</span>include    <span class="o">-</span>fPIC  <span class="o">-</span>Wall <span class="o">-</span>mtune<span class="o">=</span>core2 <span class="o">-</span>g <span class="o">-</span>O2  <span class="o">-</span>c RS<span class="o">-</span>MySQL.c <span class="o">-</span>o RS<span class="o">-</span>MySQL.o
</span><span class='line'>clang <span class="o">-</span>dynamiclib <span class="o">-</span>Wl<span class="p">,</span><span class="o">-</span>headerpad_max_install_names <span class="o">-</span>undefined dynamic_lookup <span class="o">-</span>single_module <span class="o">-</span>multiply_defined suppress <span class="o">-</span>L<span class="o">/</span>usr<span class="o">/</span>local<span class="o">/</span>lib <span class="o">-</span>o RMySQL.so RS<span class="o">-</span>DBI.o RS<span class="o">-</span>MySQL.o <span class="o">-</span>lmysqlclient <span class="o">-</span>lz <span class="o">-</span><span class="k-Variable">F</span><span class="o">/</span>Library<span class="o">/</span>Frameworks<span class="o">/</span>R.framework<span class="o">/</span>.. <span class="o">-</span>framework R <span class="o">-</span>Wl<span class="p">,</span><span class="o">-</span>framework <span class="o">-</span>Wl<span class="p">,</span>CoreFoundation
</span><span class='line'>installing to <span class="o">/</span>Library<span class="o">/</span>Frameworks<span class="o">/</span>R.framework<span class="o">/</span>Versions<span class="o">/</span><span class="m">3.1</span><span class="o">/</span>Resources<span class="o">/</span>library<span class="o">/</span>RMySQL<span class="o">/</span>libs
</span><span class='line'><span class="o">**</span> R
</span><span class='line'><span class="o">**</span> inst
</span><span class='line'><span class="o">**</span> preparing package <span class="kr">for</span> lazy loading
</span><span class='line'>Creating a generic <span class="kr">function</span> <span class="kr">for</span> ‘format’ from package ‘base’ <span class="kr">in</span> package ‘RMySQL’
</span><span class='line'>Creating a generic <span class="kr">function</span> <span class="kr">for</span> ‘print’ from package ‘base’ <span class="kr">in</span> package ‘RMySQL’
</span><span class='line'><span class="o">**</span> help
</span><span class='line'><span class="o">***</span> installing help indices
</span><span class='line'><span class="o">**</span> building package indices
</span><span class='line'><span class="o">**</span> testing <span class="kr">if</span> installed package can be loaded
</span><span class='line'><span class="o">*</span> DONE <span class="p">(</span>RMySQL<span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Transferring Existing Data to/from MySQL</h2>

<p>Having a database is useless unless we can easily convert our existing data.frames
into MySQL tables.  Let&#8217;s try this using the <code>Thurstone</code> dataset from the Revelle&#8217;s <a href="http://cran.r-project.org/web/packages/psych/index.html"><code>psych</code></a> package:</p>

<figure class='code'><figcaption><span>Moving Thurstone to RDS</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='r'><span class='line'>library<span class="p">(</span>RMySQL<span class="p">)</span>
</span><span class='line'>library<span class="p">(</span>psych<span class="p">)</span>
</span><span class='line'>con <span class="o">&lt;-</span> dbConnect<span class="p">(</span>MySQL<span class="p">(),</span>
</span><span class='line'>    user <span class="o">=</span> <span class="s">&#39;RDSUser&#39;</span><span class="p">,</span>
</span><span class='line'>    password <span class="o">=</span> <span class="s">&#39;YourPass&#39;</span><span class="p">,</span>
</span><span class='line'>    host <span class="o">=</span> <span class="s">&#39;RDS Host&#39;</span><span class="p">,</span>
</span><span class='line'>    dbname<span class="o">=</span><span class="s">&#39;YourDB&#39;</span><span class="p">)</span>
</span><span class='line'>dbWriteTable<span class="p">(</span>conn <span class="o">=</span> con<span class="p">,</span> name <span class="o">=</span> <span class="s">&#39;Test&#39;</span><span class="p">,</span> value <span class="o">=</span> as.data.frame<span class="p">(</span>Thurstone<span class="p">))</span>
</span></code></pre></td></tr></table></div></figure>


<p>There! Now we have transferred our data.frame to our SQL database.</p>

<p><img class="center" src="http://frenchja.github.com/images/rds3.png"></p>

<p>Similarly, if you want to read data <em>from</em> MySQL to R, we can use the <code>dbReadTable()</code> function,
which returns a data.frame object. You can keep your data in MySQL and stream portions into R for specific analyses.
Since <code>dbReadTable</code> outputs a data.frame, we can use this command in place of a data.frame.</p>

<p>Let&#8217;s run an <code>omega()</code> factor analysis on the Thurstone table:</p>

<figure class='code'><figcaption><span>Thurstone Omega</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='r'><span class='line'>omega<span class="p">(</span>dbReadTable<span class="p">(</span>conn <span class="o">=</span> con<span class="p">,</span>name <span class="o">=</span> <span class="s">&#39;Test&#39;</span><span class="p">),</span> title <span class="o">=</span> <span class="s">&quot;9 variables from Thurstone&quot;</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>




<figure class='code'><figcaption><span>Thurstone Omega</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
</pre></td><td class='code'><pre><code class='r'><span class='line'>Loading required package<span class="o">:</span> MASS
</span><span class='line'>Loading required package<span class="o">:</span> GPArotation
</span><span class='line'>Loading required package<span class="o">:</span> parallel
</span><span class='line'><span class="m">9</span> variables from Thurstone
</span><span class='line'>Call<span class="o">:</span> omega<span class="p">(</span>m <span class="o">=</span> dbReadTable<span class="p">(</span>conn <span class="o">=</span> con<span class="p">,</span> name <span class="o">=</span> <span class="s">&quot;Test&quot;</span><span class="p">),</span> title <span class="o">=</span> <span class="s">&quot;9 variables from Thurstone&quot;</span><span class="p">)</span>
</span><span class='line'>Alpha<span class="o">:</span>                 <span class="m">0.89</span>
</span><span class='line'>G.6<span class="o">:</span>                   <span class="m">0.91</span>
</span><span class='line'>Omega Hierarchical<span class="o">:</span>    <span class="m">0.74</span>
</span><span class='line'>Omega H asymptotic<span class="o">:</span>    <span class="m">0.79</span>
</span><span class='line'>Omega Total            <span class="m">0.93</span>
</span><span class='line'>
</span><span class='line'>Schmid Leiman Factor loadings greater than  <span class="m">0.2</span>
</span><span class='line'>                   g   F1<span class="o">*</span>   F2<span class="o">*</span>   F3<span class="o">*</span>   h2   u2   p2
</span><span class='line'>Sentences       <span class="m">0.71</span>  <span class="m">0.57</span>             <span class="m">0.82</span> <span class="m">0.18</span> <span class="m">0.61</span>
</span><span class='line'>Vocabulary      <span class="m">0.73</span>  <span class="m">0.55</span>             <span class="m">0.84</span> <span class="m">0.16</span> <span class="m">0.63</span>
</span><span class='line'>Sent_Completion <span class="m">0.68</span>  <span class="m">0.52</span>             <span class="m">0.73</span> <span class="m">0.27</span> <span class="m">0.63</span>
</span><span class='line'>First_Letters   <span class="m">0.65</span>        <span class="m">0.56</span>       <span class="m">0.73</span> <span class="m">0.27</span> <span class="m">0.57</span>
</span><span class='line'>X4_Letter_Words <span class="m">0.62</span>        <span class="m">0.49</span>       <span class="m">0.63</span> <span class="m">0.37</span> <span class="m">0.61</span>
</span><span class='line'>Suffixes        <span class="m">0.56</span>        <span class="m">0.41</span>       <span class="m">0.50</span> <span class="m">0.50</span> <span class="m">0.63</span>
</span><span class='line'>Letter_Series   <span class="m">0.59</span>              <span class="m">0.61</span> <span class="m">0.72</span> <span class="m">0.28</span> <span class="m">0.48</span>
</span><span class='line'>Pedigrees       <span class="m">0.58</span>  <span class="m">0.23</span>        <span class="m">0.34</span> <span class="m">0.50</span> <span class="m">0.50</span> <span class="m">0.66</span>
</span><span class='line'>Letter_Group    <span class="m">0.54</span>              <span class="m">0.46</span> <span class="m">0.53</span> <span class="m">0.47</span> <span class="m">0.56</span>
</span><span class='line'>
</span><span class='line'>With eigenvalues of<span class="o">:</span>
</span><span class='line'>   g  F1<span class="o">*</span>  F2<span class="o">*</span>  F3<span class="o">*</span>
</span><span class='line'><span class="m">3.58</span> <span class="m">0.96</span> <span class="m">0.74</span> <span class="m">0.71</span>
</span><span class='line'>
</span><span class='line'>general<span class="o">/</span>max  <span class="m">3.71</span>   max<span class="o">/</span>min <span class="o">=</span>   <span class="m">1.35</span>
</span><span class='line'>mean percent general <span class="o">=</span>  <span class="m">0.6</span>    with sd <span class="o">=</span>  <span class="m">0.05</span> and cv of  <span class="m">0.09</span>
</span><span class='line'>Explained Common Variance of the general factor <span class="o">=</span>  <span class="m">0.6</span>
</span><span class='line'>
</span><span class='line'>The degrees of freedom are <span class="m">12</span>  and the fit is  <span class="m">0.01</span>
</span><span class='line'>
</span><span class='line'>The root mean square of the residuals is  <span class="m">0.01</span>
</span><span class='line'>The df corrected root mean square of the residuals is  <span class="m">0.01</span>
</span><span class='line'>
</span><span class='line'>Compare this with the adequacy of just a general factor and no group factors
</span><span class='line'>The degrees of freedom <span class="kr">for</span> just the general factor are <span class="m">27</span>  and the fit is  <span class="m">1.48</span>
</span><span class='line'>
</span><span class='line'>The root mean square of the residuals is  <span class="m">0.14</span>
</span><span class='line'>The df corrected root mean square of the residuals is  <span class="m">0.16</span>
</span><span class='line'>
</span><span class='line'>Measures of factor score adequacy
</span><span class='line'>                                                 g  F1<span class="o">*</span>  F2<span class="o">*</span>  F3<span class="o">*</span>
</span><span class='line'>Correlation of scores with factors            <span class="m">0.86</span> <span class="m">0.73</span> <span class="m">0.72</span> <span class="m">0.75</span>
</span><span class='line'>Multiple R square of scores with factors      <span class="m">0.74</span> <span class="m">0.54</span> <span class="m">0.52</span> <span class="m">0.56</span>
</span><span class='line'>Minimum correlation of factor score estimates <span class="m">0.49</span> <span class="m">0.08</span> <span class="m">0.03</span> <span class="m">0.11</span>
</span><span class='line'>
</span><span class='line'> Total<span class="p">,</span> General and Subset omega <span class="kr">for</span> each subset
</span><span class='line'>                                                 g  F1<span class="o">*</span>  F2<span class="o">*</span>  F3<span class="o">*</span>
</span><span class='line'>Omega total <span class="kr">for</span> total scores and subscales    <span class="m">0.93</span> <span class="m">0.92</span> <span class="m">0.83</span> <span class="m">0.79</span>
</span><span class='line'>Omega general <span class="kr">for</span> total scores and subscales  <span class="m">0.74</span> <span class="m">0.58</span> <span class="m">0.50</span> <span class="m">0.47</span>
</span><span class='line'>Omega group <span class="kr">for</span> total scores and subscales    <span class="m">0.16</span> <span class="m">0.35</span> <span class="m">0.32</span> <span class="m">0.32</span>
</span></code></pre></td></tr></table></div></figure>


<p><img class="center" src="http://frenchja.github.com/images/rds4.png"></p>

<p>In other analyses, you may only need a fraction of the MySQL table.  In these cases, we&#8217;d want to use the <code>dbGetQuery()</code> command and issue a MySQL statement to SELECT and aggregate the information.  Let&#8217;s get a vector of Sentences correlations that are greater than 0.5:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='r'><span class='line'>dbGetQuery<span class="p">(</span>conn <span class="o">=</span> con<span class="p">,</span> statement <span class="o">=</span> <span class="s">&quot;SELECT Sentences FROM Test WHERE Sentences &gt; 0.5;&quot;</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>




<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='r'><span class='line'>  Sentences
</span><span class='line'><span class="m">1</span>     <span class="m">1.000</span>
</span><span class='line'><span class="m">2</span>     <span class="m">0.828</span>
</span><span class='line'><span class="m">3</span>     <span class="m">0.776</span>
</span><span class='line'><span class="m">4</span>     <span class="m">0.541</span>
</span></code></pre></td></tr></table></div></figure>


<h3>Safely storing credentials</h3>

<p>It&#8217;s important to note that in the above example, although I passed the <code>user</code> and <code>password</code>
parameters within my <code>dbConnect()</code> function, you would <strong>never</strong> want to do this in production code that
you were sharing.  It&#8217;s far better to store the credentials a text file where <code>dbConnect(MySQL())</code> will look when you don&#8217;t pass any credentials:</p>

<figure class='code'><figcaption><span>~/.my.cnf</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nv">user</span> <span class="o">=</span> youruser
</span><span class='line'><span class="nv">password</span> <span class="o">=</span> yourpassword
</span><span class='line'><span class="nv">host</span> <span class="o">=</span> yourhouse
</span><span class='line'><span class="nv">dbname</span> <span class="o">=</span> yourdb
</span></code></pre></td></tr></table></div></figure>


<h2>Useful Packages for Fast DB Operations</h2>

<p>Ideally, we want to have one set of analysis code that is agnostic to <em>how</em>
the data are stored.  I suggest looking into <a href="http://had.co.nz/">Hadley Wickham&#8217;s</a> new <a href="http://blog.rstudio.org/2014/01/17/introducing-dplyr/"><code>dplyr</code></a> package
(<a href="https://github.com/hadley/dplyr">Github</a>). <code>dplyr</code> is able to filter, sort, group, and summarize data
quickly whether it is stored in a data.frame, data.table, or database. Database operations may not always be as
fast as a data.table operation, but again, the advantage is that you don&#8217;t need to feed all of your data into memory.</p>

<p>Hadley provides a few vignettes for getting getting started with <code>dplyr</code>:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='r'><span class='line'>vignette<span class="p">(</span><span class="s">&quot;introduction&quot;</span><span class="p">,</span> package <span class="o">=</span> <span class="s">&quot;dplyr&quot;</span><span class="p">)</span>
</span><span class='line'>vignette<span class="p">(</span><span class="s">&quot;databases&quot;</span><span class="p">,</span> package <span class="o">=</span> <span class="s">&quot;dplyr&quot;</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Fixing knitr: Formatting statistical output to 2 digits in R]]></title>
    <link href="http://frenchja.github.com/blog/2014/04/25/formatting-sweave-and-knitr-output-for-2-digits/"/>
    <updated>2014-04-25T16:53:00-07:00</updated>
    <id>http://frenchja.github.com/blog/2014/04/25/formatting-sweave-and-knitr-output-for-2-digits</id>
    <content type="html"><![CDATA[<h3>Overview of reproducible research</h3>

<p>Reproducible research is a phrase that describes an academic paper or manuscript that contains the code and data in addition to what is usually published - the researcher&#8217;s interpretation.  In doing so, the experimental design and method of analysis is easily replicated by unaffiliated labs and critiqued by reviewers as the full analysis used to produce the results is submitted along with the final paper.  One way of producing reproducible research is to use <a href="http://r-project.org">R code</a> directly inside your LaTeX document. In order to faciliate the combination of statistical code and manuscript writing, two R packages in particular have arisen:  <a href="">Sweave</a> and <a href="">knitr</a>. knitr is an R package designed as a replacement for Sweave, but both packages combine your R analysis with your <a href="https://en.wikipedia.org/wiki/LaTeX">LaTeX</a> manuscript (i.e., knitr = R + LaTeX).</p>

<p>One advantage of knitr is that the researcher can easily create ANOVA and demographic tables directly from the data without messing around in Excel.  However, as we&#8217;ll see, both knitr and Sweave can run into problems when formatting your table values to 2 decimal points.  In this post, I&#8217;ll detail my proposed method of fixing that which can be applied to your entire mansucript by editing the beginning of your knitr preamble.</p>

<!-- more -->


<p>The basic example below contains the beginning of a hypothetical Methods section of a manuscript. We want to take the values from an R table, which has the breakdown of participants by gender and ethnicity, and display them as numbers in our manuscript.</p>

<figure class='code'><figcaption><span>Basic knitr.Rnw Example</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
</pre></td><td class='code'><pre><code class='tex'><span class='line'><span class="k">\documentclass</span><span class="na">[12pt]</span><span class="nb">{</span>article<span class="nb">}</span>
</span><span class='line'><span class="k">\usepackage</span><span class="na">[sc]</span><span class="nb">{</span>mathpazo<span class="nb">}</span>
</span><span class='line'><span class="k">\usepackage</span><span class="na">[T1]</span><span class="nb">{</span>fontenc<span class="nb">}</span>
</span><span class='line'><span class="k">\usepackage</span><span class="nb">{</span>geometry<span class="nb">}</span>
</span><span class='line'><span class="k">\geometry</span><span class="nb">{</span>verbose,tmargin=2.5cm,bmargin=2.5cm,lmargin=2.5cm,rmargin=2.5cm<span class="nb">}</span>
</span><span class='line'><span class="k">\setcounter</span><span class="nb">{</span>secnumdepth<span class="nb">}{</span>2<span class="nb">}</span>
</span><span class='line'><span class="k">\setcounter</span><span class="nb">{</span>tocdepth<span class="nb">}{</span>2<span class="nb">}</span>
</span><span class='line'><span class="k">\usepackage</span><span class="nb">{</span>url<span class="nb">}</span>
</span><span class='line'><span class="k">\usepackage</span>[unicode=true,pdfusetitle,
</span><span class='line'> bookmarks=true,bookmarksnumbered=true,bookmarksopen=true,bookmarksopenlevel=2,
</span><span class='line'> breaklinks=false,pdfborder=<span class="nb">{</span>0 0 1<span class="nb">}</span>,backref=false,colorlinks=false]
</span><span class='line'> <span class="nb">{</span>hyperref<span class="nb">}</span>
</span><span class='line'><span class="k">\hypersetup</span><span class="nb">{</span>
</span><span class='line'> pdfstartview=<span class="nb">{</span>XYZ null null 1<span class="nb">}}</span>
</span><span class='line'><span class="k">\usepackage</span><span class="nb">{</span>breakurl<span class="nb">}</span>
</span><span class='line'><span class="k">\begin</span><span class="nb">{</span>document<span class="nb">}</span>
</span><span class='line'>
</span><span class='line'>&lt;&lt;setup, include=FALSE, cache=FALSE&gt;&gt;=
</span><span class='line'>library(knitr)
</span><span class='line'># set global chunk options
</span><span class='line'>opts<span class="nb">_</span>chunk<span class="s">$</span><span class="nb">set</span><span class="o">(</span><span class="nb">fig.path</span><span class="o">=</span><span class="nb">&#39;figure</span><span class="o">/</span><span class="nb">minimal</span><span class="o">-</span><span class="nb">&#39;, fig.align</span><span class="o">=</span><span class="nb">&#39;center&#39;, fig.show</span><span class="o">=</span><span class="nb">&#39;hold&#39;</span><span class="o">)</span><span class="nb"></span>
</span><span class='line'><span class="nb">options</span><span class="o">(</span><span class="nb">replace.assign</span><span class="o">=</span><span class="nb">TRUE,width</span><span class="o">=</span><span class="m">90</span><span class="o">)</span><span class="nb"></span>
</span><span class='line'><span class="nb">@</span>
</span><span class='line'>
</span><span class='line'><span class="nv">\title</span><span class="nb">{A Minimal Demo of knitr}</span>
</span><span class='line'><span class="nv">\author</span><span class="nb">{Jason A. French}</span>
</span><span class='line'><span class="nv">\maketitle</span><span class="nb"></span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="nb">&lt;&lt;random</span><span class="o">-</span><span class="nb">ethnicity, include</span><span class="o">=</span><span class="nb">FALSE&gt;&gt;</span><span class="o">=</span><span class="nb"></span>
</span><span class='line'><span class="nb"># Create data.frame of random ethnicities</span>
</span><span class='line'><span class="nb">x &lt;</span><span class="o">-</span><span class="nb"> data.frame</span><span class="o">(</span><span class="nb">Ethnicity </span><span class="o">=</span><span class="nb"> sample</span><span class="o">(</span><span class="nb">as.factor</span><span class="o">(</span><span class="nb"></span>
</span><span class='line'><span class="nb">  rep</span><span class="o">(</span><span class="nb">x </span><span class="o">=</span><span class="nb"> c</span><span class="o">(</span><span class="nb">&#39;White&#39;,&#39;African American&#39;,&#39;Asian American&#39;, &#39;Latino&#39;, &#39;Pacific Islander&#39;</span><span class="o">)</span><span class="nb"></span>
</span><span class='line'><span class="nb">    </span><span class="o">)</span><span class="nb"></span>
</span><span class='line'><span class="nb">  </span><span class="o">)</span><span class="nb">,size </span><span class="o">=</span><span class="nb"> </span><span class="m">100</span><span class="nb">, replace </span><span class="o">=</span><span class="nb"> TRUE</span><span class="o">)</span><span class="nb">,</span>
</span><span class='line'><span class="nb">  Gender</span><span class="o">=</span><span class="nb">rep</span><span class="o">(</span><span class="nb">c</span><span class="o">(</span><span class="nb">&#39;Male&#39;, &#39;Female&#39;</span><span class="o">)</span><span class="nb">,</span><span class="m">100</span><span class="o">))</span><span class="nb"></span>
</span><span class='line'><span class="nb">x.table &lt;</span><span class="o">-</span><span class="nb"> table</span><span class="o">(</span><span class="nb">x</span><span class="o">)</span><span class="nb"></span>
</span><span class='line'><span class="nb">@</span>
</span><span class='line'>
</span><span class='line'><span class="nv">\section</span><span class="nb">{Methods}</span>
</span><span class='line'><span class="nb">We recruited </span><span class="nv">\Sexpr</span><span class="nb">{sum</span><span class="o">(</span><span class="nb">x.table</span><span class="o">)</span><span class="nb">} university undergraduates from an introductory psychology class. Participants were drawn from various genders and ethnic groups across the Chicago area </span><span class="o">(</span><span class="nb">see Table~</span><span class="nv">\ref</span><span class="nb">{tab:ethnicity}</span><span class="o">)</span><span class="nb">...</span>
</span><span class='line'>
</span><span class='line'><span class="nb">&lt;&lt;ethnicity</span><span class="o">-</span><span class="nb">table, echo </span><span class="o">=</span><span class="nb"> FALSE, results </span><span class="o">=</span><span class="nb"> &#39;asis&#39;&gt;&gt;</span><span class="o">=</span><span class="nb"></span>
</span><span class='line'><span class="nb">library</span><span class="o">(</span><span class="nb">xtable</span><span class="o">)</span><span class="nb"></span>
</span><span class='line'><span class="nb">xtable</span><span class="o">(</span><span class="nb">x.table, caption </span><span class="o">=</span><span class="nb"> &#39;Participant Ethnicities&#39;, label</span><span class="o">=</span><span class="nb">&#39;tab:ethnicity&#39;</span><span class="o">)</span><span class="nb"></span>
</span><span class='line'><span class="nb">@</span>
</span><span class='line'>
</span><span class='line'><span class="nv">\end</span><span class="nb">{document}</span>
</span></code></pre></td></tr></table></div></figure>


<p>As we see below, running the <code>knit()</code> command on our knitr manuscript inside R produces a regular LaTeX file that can be compiled with to a PDF using pdflatex or <a href="http://pages.uoregon.edu/koch/texshop/">TeX Shop</a>. <em>Notice that the R table objects have been replaced with LaTeX tables.</em></p>

<figure class='code'><figcaption><span>Running knit() knitr.Rnw inside R</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='r'><span class='line'>library<span class="p">(</span>knitr<span class="p">)</span>
</span><span class='line'>knit<span class="p">(</span>input <span class="o">=</span> <span class="s">&#39;knitr.Rnw&#39;</span><span class="p">,</span> output <span class="o">=</span> <span class="s">&#39;knitr.tex&#39;</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>




<figure class='code'><figcaption><span>Resulting knitr.tex LaTeX document</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
<span class='line-number'>56</span>
<span class='line-number'>57</span>
<span class='line-number'>58</span>
<span class='line-number'>59</span>
<span class='line-number'>60</span>
<span class='line-number'>61</span>
<span class='line-number'>62</span>
<span class='line-number'>63</span>
</pre></td><td class='code'><pre><code class='tex'><span class='line'><span class="k">\documentclass</span><span class="na">[12pt]</span><span class="nb">{</span>article<span class="nb">}</span><span class="k">\usepackage</span><span class="na">[]</span><span class="nb">{</span>graphicx<span class="nb">}</span><span class="k">\usepackage</span><span class="na">[]</span><span class="nb">{</span>color<span class="nb">}</span>
</span><span class='line'><span class="k">\makeatletter</span>
</span><span class='line'><span class="k">\definecolor</span><span class="nb">{</span>fgcolor<span class="nb">}{</span>rgb<span class="nb">}{</span>0.345, 0.345, 0.345<span class="nb">}</span>
</span><span class='line'><span class="k">\newcommand</span><span class="nb">{</span><span class="k">\hlnum</span><span class="nb">}</span>[1]<span class="nb">{</span><span class="k">\textcolor</span><span class="na">[rgb]</span><span class="nb">{</span>0.686,0.059,0.569<span class="nb">}{</span>#1<span class="nb">}}</span>
</span><span class='line'><span class="k">\newcommand</span><span class="nb">{</span><span class="k">\hlstr</span><span class="nb">}</span>[1]<span class="nb">{</span><span class="k">\textcolor</span><span class="na">[rgb]</span><span class="nb">{</span>0.192,0.494,0.8<span class="nb">}{</span>#1<span class="nb">}}</span>
</span><span class='line'><span class="k">\newcommand</span><span class="nb">{</span><span class="k">\hlcom</span><span class="nb">}</span>[1]<span class="nb">{</span><span class="k">\textcolor</span><span class="na">[rgb]</span><span class="nb">{</span>0.678,0.584,0.686<span class="nb">}{</span><span class="k">\textit</span><span class="nb">{</span>#1<span class="nb">}}}</span>
</span><span class='line'><span class="k">\newcommand</span><span class="nb">{</span><span class="k">\hlopt</span><span class="nb">}</span>[1]<span class="nb">{</span><span class="k">\textcolor</span><span class="na">[rgb]</span><span class="nb">{</span>0,0,0<span class="nb">}{</span>#1<span class="nb">}}</span>
</span><span class='line'><span class="k">\newcommand</span><span class="nb">{</span><span class="k">\hlstd</span><span class="nb">}</span>[1]<span class="nb">{</span><span class="k">\textcolor</span><span class="na">[rgb]</span><span class="nb">{</span>0.345,0.345,0.345<span class="nb">}{</span>#1<span class="nb">}}</span>
</span><span class='line'><span class="k">\newcommand</span><span class="nb">{</span><span class="k">\hlkwa</span><span class="nb">}</span>[1]<span class="nb">{</span><span class="k">\textcolor</span><span class="na">[rgb]</span><span class="nb">{</span>0.161,0.373,0.58<span class="nb">}{</span><span class="k">\textbf</span><span class="nb">{</span>#1<span class="nb">}}}</span>
</span><span class='line'><span class="k">\newcommand</span><span class="nb">{</span><span class="k">\hlkwb</span><span class="nb">}</span>[1]<span class="nb">{</span><span class="k">\textcolor</span><span class="na">[rgb]</span><span class="nb">{</span>0.69,0.353,0.396<span class="nb">}{</span>#1<span class="nb">}}</span>
</span><span class='line'><span class="k">\newcommand</span><span class="nb">{</span><span class="k">\hlkwc</span><span class="nb">}</span>[1]<span class="nb">{</span><span class="k">\textcolor</span><span class="na">[rgb]</span><span class="nb">{</span>0.333,0.667,0.333<span class="nb">}{</span>#1<span class="nb">}}</span>
</span><span class='line'><span class="k">\newcommand</span><span class="nb">{</span><span class="k">\hlkwd</span><span class="nb">}</span>[1]<span class="nb">{</span><span class="k">\textcolor</span><span class="na">[rgb]</span><span class="nb">{</span>0.737,0.353,0.396<span class="nb">}{</span><span class="k">\textbf</span><span class="nb">{</span>#1<span class="nb">}}}</span>
</span><span class='line'>
</span><span class='line'><span class="k">\usepackage</span><span class="nb">{</span>framed<span class="nb">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">\definecolor</span><span class="nb">{</span>shadecolor<span class="nb">}{</span>rgb<span class="nb">}{</span>.97, .97, .97<span class="nb">}</span>
</span><span class='line'><span class="k">\definecolor</span><span class="nb">{</span>messagecolor<span class="nb">}{</span>rgb<span class="nb">}{</span>0, 0, 0<span class="nb">}</span>
</span><span class='line'><span class="k">\definecolor</span><span class="nb">{</span>warningcolor<span class="nb">}{</span>rgb<span class="nb">}{</span>1, 0, 1<span class="nb">}</span>
</span><span class='line'><span class="k">\definecolor</span><span class="nb">{</span>errorcolor<span class="nb">}{</span>rgb<span class="nb">}{</span>1, 0, 0<span class="nb">}</span>
</span><span class='line'><span class="k">\newenvironment</span><span class="nb">{</span>knitrout<span class="nb">}{}{}</span> <span class="c">% an empty environment to be redefined in TeX</span>
</span><span class='line'>
</span><span class='line'><span class="k">\usepackage</span><span class="nb">{</span>alltt<span class="nb">}</span>
</span><span class='line'><span class="k">\usepackage</span><span class="na">[sc]</span><span class="nb">{</span>mathpazo<span class="nb">}</span>
</span><span class='line'><span class="k">\usepackage</span><span class="na">[T1]</span><span class="nb">{</span>fontenc<span class="nb">}</span>
</span><span class='line'><span class="k">\usepackage</span><span class="nb">{</span>geometry<span class="nb">}</span>
</span><span class='line'><span class="k">\geometry</span><span class="nb">{</span>verbose,tmargin=2.5cm,bmargin=2.5cm,lmargin=2.5cm,rmargin=2.5cm<span class="nb">}</span>
</span><span class='line'><span class="k">\setcounter</span><span class="nb">{</span>secnumdepth<span class="nb">}{</span>2<span class="nb">}</span>
</span><span class='line'><span class="k">\setcounter</span><span class="nb">{</span>tocdepth<span class="nb">}{</span>2<span class="nb">}</span>
</span><span class='line'><span class="k">\usepackage</span><span class="nb">{</span>url<span class="nb">}</span>
</span><span class='line'><span class="k">\usepackage</span>[unicode=true,pdfusetitle,
</span><span class='line'> bookmarks=true,bookmarksnumbered=true,bookmarksopen=true,bookmarksopenlevel=2,
</span><span class='line'> breaklinks=false,pdfborder=<span class="nb">{</span>0 0 1<span class="nb">}</span>,backref=false,colorlinks=false]
</span><span class='line'> <span class="nb">{</span>hyperref<span class="nb">}</span>
</span><span class='line'><span class="k">\hypersetup</span><span class="nb">{</span>
</span><span class='line'> pdfstartview=<span class="nb">{</span>XYZ null null 1<span class="nb">}}</span>
</span><span class='line'><span class="k">\usepackage</span><span class="nb">{</span>breakurl<span class="nb">}</span>
</span><span class='line'><span class="k">\IfFileExists</span><span class="nb">{</span>upquote.sty<span class="nb">}{</span><span class="k">\usepackage</span><span class="nb">{</span>upquote<span class="nb">}}{}</span>
</span><span class='line'><span class="k">\begin</span><span class="nb">{</span>document<span class="nb">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">\title</span><span class="nb">{</span>A Minimal Demo of knitr<span class="nb">}</span>
</span><span class='line'><span class="k">\author</span><span class="nb">{</span>Jason A. French<span class="nb">}</span>
</span><span class='line'><span class="k">\maketitle</span>
</span><span class='line'>
</span><span class='line'><span class="k">\section</span><span class="nb">{</span>Methods<span class="nb">}</span>
</span><span class='line'>We recruited 200 university undergraduates from an introductory psychology class. Participants were drawn from various genders and ethnic groups across the Chicago area (see Table~<span class="k">\ref</span><span class="nb">{</span>tab:ethnicity<span class="nb">}</span>)...
</span><span class='line'>
</span><span class='line'><span class="k">\begin</span><span class="nb">{</span>table<span class="nb">}</span>[ht]
</span><span class='line'><span class="k">\centering</span>
</span><span class='line'><span class="k">\begin</span><span class="nb">{</span>tabular<span class="nb">}{</span>rrr<span class="nb">}</span>
</span><span class='line'><span class="k">\hline</span>
</span><span class='line'> <span class="nb">&amp;</span> Female <span class="nb">&amp;</span> Male <span class="k">\\</span>
</span><span class='line'><span class="k">\hline</span>
</span><span class='line'>African American <span class="nb">&amp;</span>  22 <span class="nb">&amp;</span>  16 <span class="k">\\</span>
</span><span class='line'>Asian American <span class="nb">&amp;</span>  26 <span class="nb">&amp;</span>  30 <span class="k">\\</span>
</span><span class='line'>Latino <span class="nb">&amp;</span>  14 <span class="nb">&amp;</span>  30 <span class="k">\\</span>
</span><span class='line'>Pacific Islander <span class="nb">&amp;</span>  18 <span class="nb">&amp;</span>  14 <span class="k">\\</span>
</span><span class='line'>White <span class="nb">&amp;</span>  20 <span class="nb">&amp;</span>  10 <span class="k">\\</span>
</span><span class='line'><span class="k">\hline</span>
</span><span class='line'><span class="k">\end</span><span class="nb">{</span>tabular<span class="nb">}</span>
</span><span class='line'><span class="k">\caption</span><span class="nb">{</span>Participant Ethnicities<span class="nb">}</span>
</span><span class='line'><span class="k">\label</span><span class="nb">{</span>tab:ethnicity<span class="nb">}</span>
</span><span class='line'><span class="k">\end</span><span class="nb">{</span>table<span class="nb">}</span>
</span><span class='line'><span class="k">\end</span><span class="nb">{</span>document<span class="nb">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Last, after compiling our LaTeX file using TeX Shop, we&#8217;re greeted with the final product below:</p>

<p><img src="http://frenchja.github.com/images/knitr-example.png"></p>

<h3>Summary thus far</h3>

<p>The example above used data from R directly in a sentence in the Methods section (i.e., &#8220;We recruited 200 university undergraduates from an introductory psychology class.&#8221;) and did so using the <code>\Sexpr{}</code> command in the <a href="https://en.wikipedia.org/wiki/LaTeX">knitr</a> manuscript (i.e., knitr.Rnw).  The <code>\Sexpr{}</code> command contained an <code>R</code> expression to calculate the total number participants.  This expression was evaluated and converted to LaTeX code when we ran the <code>knit()</code> function on the .Rnw file, which produces a .tex document. The .tex document contained no R code and was therefore ready to be compiled to a PDF using TeX Shop or pdf2latex in Terminal.app.</p>

<h2>Forcing knitr to round to 2 decimal places</h2>

<p>The default behavior of knitr works well <em>most</em> of the time. However, what if we didn&#8217;t have whole numbers in our data table?  What if we had percentages that we wanted to round down to 2 digits, as required by many journals?  For example, the value <code>\Sexpr{pi}</code> would be evaluated and replaced with 3.141593 in the LaTeX file.  One common problem, and part of <a href="https://stackoverflow.com/questions/11062497/how-to-avoid-using-round-in-every-sexpr">Yihui&#8217;s motivation</a> for replacing Sweave with <a href="http://yihui.name/knitr/"><code>knitr</code></a>, is that <code>\Sexpr{}</code> doesn&#8217;t automatically round digits.</p>

<p>In Sweave (i.e., knitr&#8217;s predecessor), <em>each</em> value of pi would have to be encased in <code>round(pi,2)</code>.  Thus, we end up with <code>\Sexpr{round(pi,2)}</code>.  Yihui fixed this problem by automatically rounding digits, the length of which is set with <code>options(digits=2)</code> in the knitr preamble in your .Rnw document.  See below:</p>

<figure class='code'><figcaption><span>Typical knitr preamble</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='tex'><span class='line'>&lt;&lt;&gt;&gt;=
</span><span class='line'>library(knitr)
</span><span class='line'>options(digits=2)
</span><span class='line'>@
</span></code></pre></td></tr></table></div></figure>


<p>The default rounding behavior of knitr works well <em>until</em> a value contains a 0 after rounding, such as 123.10.  Running the expression <code>round(123.10,2)</code> outputs 123.1. In this case, every other value in the manuscript table would be aligned at the decimal place <em>except</em> for the unlucky value - sticking out like a sore thumb. To fix this, you <em>could</em> use <code>sprintf("%.2f", pi)</code> every time you have to call <code>\Sexpr{}</code> in the manuscript - but then what&#8217;s the advantage of using <a href="http://yihui.name/knitr/">knitr</a>? This hack unnecessarily complicates the manuscript and distracts from the writing process.</p>

<h3>Modify the default inline_hook for knitr</h3>

<p>After seeing a <a href="https://stackoverflow.com/questions/11062497/how-to-avoid-using-round-in-every-sexpr">StackOverflow answer by Josh O&#8217;Brien</a>, I realized that the default inline_hook function for knitr could be easily modified to use the <a href="http://stat.ethz.ch/R-manual/R-devel/library/base/html/sprintf.html"><code>sprintf()</code></a> command instead of <a href="http://stat.ethz.ch/R-manual/R-devel/library/base/html/Round.html"><code>round()</code></a>.  The minute change will forcibly output all manuscript values to 2 decimal places. Below, we see the default behavior for knitr when processing inline R expressions:</p>

<figure class='code'><figcaption><span>knitr&#8217;s Default Hook</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='r'><span class='line'>library<span class="p">(</span>knitr<span class="p">)</span>
</span><span class='line'>knit_hooks<span class="o">$</span>get<span class="p">(</span><span class="s">&quot;inline&quot;</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>




<figure class='code'><figcaption><span>knitr&#8217;s Default Hook</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='r'><span class='line'><span class="kr">function</span> <span class="p">(</span>x<span class="p">)</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="kr">if</span> <span class="p">(</span>is.numeric<span class="p">(</span>x<span class="p">))</span>
</span><span class='line'>        x <span class="o">=</span> round<span class="p">(</span>x<span class="p">,</span> getOption<span class="p">(</span><span class="s">&quot;digits&quot;</span><span class="p">))</span>
</span><span class='line'>    paste<span class="p">(</span>as.character<span class="p">(</span>x<span class="p">),</span> collapse <span class="o">=</span> <span class="s">&quot;, &quot;</span><span class="p">)</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p><em>Note:</em> My original code for this post used the <a href="http://stat.ethz.ch/R-manual/R-patched/library/base/html/format.html"><code>format()</code></a> command.  <a href="https://github.com/wch">Winston Chang</a> pointed out that this could lead to unreliable output and tweaked the code to use <a href="http://stat.ethz.ch/R-manual/R-devel/library/base/html/sprintf.html"><code>sprintf()</code></a>. The credit for the more efficient function below goes to him.  Below, we add out improved <code>inline_hook</code> to the preamble of our knitr document:</p>

<figure class='code'><figcaption><span>Improving the inline_hook</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
</pre></td><td class='code'><pre><code class='tex'><span class='line'>&lt;&lt;&gt;&gt;=
</span><span class='line'>library(knitr)
</span><span class='line'>inline<span class="nb">_</span>hook &lt;- function (x) <span class="nb">{</span>
</span><span class='line'>  if (is.numeric(x)) <span class="nb">{</span>
</span><span class='line'>    # ifelse does a vectorized comparison
</span><span class='line'>    # If integer, print without decimal; otherwise print two places
</span><span class='line'>    res &lt;- ifelse(x == round(x),
</span><span class='line'>      sprintf(&quot;<span class="c">%d&quot;, x),</span>
</span><span class='line'>      sprintf(&quot;<span class="c">%.2f&quot;, x)</span>
</span><span class='line'>    )
</span><span class='line'>    paste(res, collapse = &quot;, &quot;)
</span><span class='line'>  <span class="nb">}</span>
</span><span class='line'><span class="nb">}</span>
</span><span class='line'>knit<span class="nb">_</span>hooks<span class="s">$</span><span class="nb">set</span><span class="o">(</span><span class="nb">inline </span><span class="o">=</span><span class="nb"> inline_hook</span><span class="o">)</span><span class="nb"></span>
</span><span class='line'><span class="nb">@</span>
</span></code></pre></td></tr></table></div></figure>


<h3>Working Example</h3>

<p>Let&#8217;s put it all together!  The following is a working example of the the suggested knitr inline_hook function, which <em>should</em> give more reliable output by rounding inline values to 2 decimal places.</p>

<figure class='code'><figcaption><span>Winston&#8217;s Example</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
</pre></td><td class='code'><pre><code class='tex'><span class='line'><span class="k">\documentclass</span><span class="na">[12pt]</span><span class="nb">{</span>article<span class="nb">}</span>
</span><span class='line'><span class="k">\begin</span><span class="nb">{</span>document<span class="nb">}</span>
</span><span class='line'>
</span><span class='line'>&lt;&lt;load, include=FALSE, echo=FALSE&gt;&gt;=
</span><span class='line'>library(knitr)
</span><span class='line'>
</span><span class='line'>inline<span class="nb">_</span>hook &lt;- function (x) <span class="nb">{</span>
</span><span class='line'>  if (is.numeric(x)) <span class="nb">{</span>
</span><span class='line'>    # ifelse does a vectorized comparison
</span><span class='line'>    # If integer, print without decimal; otherwise print two places
</span><span class='line'>    res &lt;- ifelse(x == round(x),
</span><span class='line'>      sprintf(&quot;<span class="c">%d&quot;, x),</span>
</span><span class='line'>      sprintf(&quot;<span class="c">%.2f&quot;, x)</span>
</span><span class='line'>    )
</span><span class='line'>    paste(res, collapse = &quot;, &quot;)
</span><span class='line'>  <span class="nb">}</span>
</span><span class='line'><span class="nb">}</span>
</span><span class='line'>
</span><span class='line'>knit<span class="nb">_</span>hooks<span class="s">$</span><span class="nb">set</span><span class="o">(</span><span class="nb">inline </span><span class="o">=</span><span class="nb"> inline_hook</span><span class="o">)</span><span class="nb"></span>
</span><span class='line'><span class="nb">@</span>
</span><span class='line'>
</span><span class='line'><span class="nb">Inline code looks like </span><span class="nv">\Sexpr</span><span class="nb">{</span><span class="m">123</span><span class="nb">}, </span><span class="nv">\Sexpr</span><span class="nb">{</span><span class="m">123</span><span class="nb">.</span><span class="m">4</span><span class="nb">}, </span><span class="nv">\Sexpr</span><span class="nb">{</span><span class="m">123</span><span class="nb">.</span><span class="m">45</span><span class="nb">}, </span><span class="nv">\Sexpr</span><span class="nb">{</span><span class="m">123</span><span class="nb">.</span><span class="m">456</span><span class="nb">}.</span>
</span><span class='line'>
</span><span class='line'><span class="nb">And with vectors: </span><span class="nv">\Sexpr</span><span class="nb">{c</span><span class="o">(</span><span class="m">123</span><span class="nb">, </span><span class="m">123</span><span class="nb">.</span><span class="m">4</span><span class="nb">, </span><span class="m">123</span><span class="nb">.</span><span class="m">45</span><span class="nb">, </span><span class="m">123</span><span class="nb">.</span><span class="m">456</span><span class="o">)</span><span class="nb">}.</span>
</span><span class='line'>
</span><span class='line'><span class="nb">Regular output is not affected by the inline hook:</span>
</span><span class='line'>
</span><span class='line'><span class="nb">&lt;&lt;&gt;&gt;</span><span class="o">=</span><span class="nb"></span>
</span><span class='line'><span class="m">123</span><span class="nb"></span>
</span><span class='line'><span class="m">123</span><span class="nb">.</span><span class="m">4</span><span class="nb"></span>
</span><span class='line'><span class="m">123</span><span class="nb">.</span><span class="m">45</span><span class="nb"></span>
</span><span class='line'><span class="m">123</span><span class="nb">.</span><span class="m">456</span><span class="nb"></span>
</span><span class='line'>
</span><span class='line'><span class="nb">c</span><span class="o">(</span><span class="m">123</span><span class="nb">, </span><span class="m">123</span><span class="nb">.</span><span class="m">4</span><span class="nb">, </span><span class="m">123</span><span class="nb">.</span><span class="m">45</span><span class="nb">, </span><span class="m">123</span><span class="nb">.</span><span class="m">456</span><span class="o">)</span><span class="nb"></span>
</span><span class='line'>
</span><span class='line'><span class="nb">getOption</span><span class="o">(</span><span class="nb">&#39;digits&#39;</span><span class="o">)</span><span class="nb"></span>
</span><span class='line'><span class="nb">@</span>
</span><span class='line'><span class="nv">\end</span><span class="nb">{document}</span>
</span></code></pre></td></tr></table></div></figure>


<p><img src="http://frenchja.github.com/images/example.png"></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Faster Tetrachoric Correlations]]></title>
    <link href="http://frenchja.github.com/blog/2013/11/07/faster-tetrachoric-correlations/"/>
    <updated>2013-11-07T16:48:00-08:00</updated>
    <id>http://frenchja.github.com/blog/2013/11/07/faster-tetrachoric-correlations</id>
    <content type="html"><![CDATA[<h2>What are tetra- and polychoric correlations?</h2>

<p>Polychoric correlations estimate the correlation between two theorized normal distributions given two ordinal variables.  In psychological research, much of our data fits this definition.  For example, many survey studies used with introductory psychology pools use Likert scale items.  The responses to these items typically range from 1 (Strongly disagree) to 6 (Strongly agree).  However, we don&#8217;t <em>really</em> think that person&#8217;s relationship to the item is actually polytomous.  Instead, it&#8217;s an imperfect approximation.</p>

<p>Similarly, tetrachorics are special cases of polychoric crrelations when the variable of interest is dichotomous. The participant may have gotten the item either correct (i.e., 1) or incorrect (i.e., 0), but the underlying knowledge that led to the items&#8217; response is probably a continuous distribution.</p>

<p>When you have polytomous rating scales but want to disattenuate the correlations to more accurately estimate the correlation betwen the latent continuous variables, one way of doing this is to use a tetrachoric or polychoric correlation coefficient.</p>

<h2>The problem</h2>

<p>At the <a href="https://sapa-project.org">SAPA Project</a>, the majority of our data is polytomous.  We ask you the degree to which you like to go to lively parties to estimate your score on latent <em>extraversion</em>.  Presently, we use <code>mixed.cor()</code>, which calls a combination of the <code>tetrachoric()</code> and <code>polychoric()</code> functions in the <code>psych</code> package (Revelle, W., 2013).</p>

<p>However, each time we build a new dataset from the website&#8217;s SQL server, it takes <em>hours</em>.  And that&#8217;s <strong>if</strong> everything goes well.  If there&#8217;s an error in the code or a bug in a new function, it may take hours to hit the error, wasting your day.</p>

<p>After a bit of profiling, it was revealed that much of our time building the SAPA dataset was used estimating the tetrachoric and polychoric correlation coefficients.  When you do this for 250,000+ participants for 10,000+ variables, it takes <em>a long time</em>.  So Bill and I thought about how we could speed them up and feel others may benefit from our optimization.</p>

<p>A serious speedup to tetrachoric and polychoric was initiated with the help of Bill Revelle. The increase in speed is roughly 1- (nc-1)<sup>2</sup> / nc<sup>2</sup> where nc is the number of categories. Thus, for tetrachorics where nc=2, this is a 75% reduction, whereas for polychorics of 6 item responses this is just a 30% reduction.</p>

<!-- more -->


<h3>Optimizing the existing function</h3>

<p>If we call <code>psych:::tetraBinBvn</code>, we see that most of the time spent computer the tetrachorics is using <code>pmvnorm</code> to estimate each of the 4 probabilities of the tetrachoric:</p>

<p><img src="http://frenchja.github.com/images/tetra.png"></p>

<p>The function says for each row <em>i</em> and each column <em>j</em>, optimize a probability based on the lower and upper bounds of the row cuts and column cuts.  <strong>But wait!</strong>  Since the sum of the probabilities in the tetrachoric 2x2 matrix add to 1, why not just use a bit of subtraction to figure it out?  That would avoid waiting on <code>pvnorm</code> to compute each cell.</p>

<figure class='code'><figcaption><span>Old psych:::tetraBinBvn</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
</pre></td><td class='code'><pre><code class='r'><span class='line'><span class="kr">function</span> <span class="p">(</span>rho<span class="p">,</span> rc<span class="p">,</span> cc<span class="p">)</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    row.cuts <span class="o">&lt;-</span> c<span class="p">(</span><span class="o">-</span><span class="kc">Inf</span><span class="p">,</span> rc<span class="p">,</span> <span class="kc">Inf</span><span class="p">)</span>
</span><span class='line'>    col.cuts <span class="o">&lt;-</span> c<span class="p">(</span><span class="o">-</span><span class="kc">Inf</span><span class="p">,</span> cc<span class="p">,</span> <span class="kc">Inf</span><span class="p">)</span>
</span><span class='line'>    P <span class="o">&lt;-</span> matrix<span class="p">(</span><span class="m">0</span><span class="p">,</span> <span class="m">2</span><span class="p">,</span> <span class="m">2</span><span class="p">)</span>
</span><span class='line'>    R <span class="o">&lt;-</span> matrix<span class="p">(</span>c<span class="p">(</span><span class="m">1</span><span class="p">,</span> rho<span class="p">,</span> rho<span class="p">,</span> <span class="m">1</span><span class="p">),</span> <span class="m">2</span><span class="p">,</span> <span class="m">2</span><span class="p">)</span>
</span><span class='line'>    <span class="kr">for</span> <span class="p">(</span>i <span class="kr">in</span> <span class="m">1</span><span class="o">:</span><span class="m">2</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="kr">for</span> <span class="p">(</span>j <span class="kr">in</span> <span class="m">1</span><span class="o">:</span><span class="m">2</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            P<span class="p">[</span>i<span class="p">,</span> j<span class="p">]</span> <span class="o">&lt;-</span> pmvnorm<span class="p">(</span>lower <span class="o">=</span> c<span class="p">(</span>row.cuts<span class="p">[</span>i<span class="p">],</span> col.cuts<span class="p">[</span>j<span class="p">]),</span>
</span><span class='line'>                upper <span class="o">=</span> c<span class="p">(</span>row.cuts<span class="p">[</span>i <span class="o">+</span> <span class="m">1</span><span class="p">],</span> col.cuts<span class="p">[</span>j <span class="o">+</span> <span class="m">1</span><span class="p">]),</span>
</span><span class='line'>                corr <span class="o">=</span> R<span class="p">)</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>    P
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>




<figure class='code'><figcaption><span>New psych:::tetraBinBvn</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
</pre></td><td class='code'><pre><code class='r'><span class='line'><span class="kr">function</span> <span class="p">(</span>rho<span class="p">,</span> rc<span class="p">,</span> cc<span class="p">)</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    row.cuts <span class="o">&lt;-</span> c<span class="p">(</span><span class="o">-</span><span class="kc">Inf</span><span class="p">,</span> rc<span class="p">,</span> <span class="kc">Inf</span><span class="p">)</span>
</span><span class='line'>    col.cuts <span class="o">&lt;-</span> c<span class="p">(</span><span class="o">-</span><span class="kc">Inf</span><span class="p">,</span> cc<span class="p">,</span> <span class="kc">Inf</span><span class="p">)</span>
</span><span class='line'>    P <span class="o">&lt;-</span> matrix<span class="p">(</span><span class="m">0</span><span class="p">,</span> <span class="m">2</span><span class="p">,</span> <span class="m">2</span><span class="p">)</span>
</span><span class='line'>    R <span class="o">&lt;-</span> matrix<span class="p">(</span>c<span class="p">(</span><span class="m">1</span><span class="p">,</span> rho<span class="p">,</span> rho<span class="p">,</span> <span class="m">1</span><span class="p">),</span> <span class="m">2</span><span class="p">,</span> <span class="m">2</span><span class="p">)</span>
</span><span class='line'>    P<span class="p">[</span><span class="m">1</span><span class="p">,</span> <span class="m">1</span><span class="p">]</span> <span class="o">&lt;-</span> pmvnorm<span class="p">(</span>lower <span class="o">=</span> c<span class="p">(</span>row.cuts<span class="p">[</span><span class="m">1</span><span class="p">],</span> col.cuts<span class="p">[</span><span class="m">1</span><span class="p">]),</span> upper <span class="o">=</span> c<span class="p">(</span>row.cuts<span class="p">[</span><span class="m">2</span><span class="p">],</span>
</span><span class='line'>        col.cuts<span class="p">[</span><span class="m">2</span><span class="p">]),</span> corr <span class="o">=</span> R<span class="p">)</span>
</span><span class='line'>    P<span class="p">[</span><span class="m">1</span><span class="p">,</span> <span class="m">2</span><span class="p">]</span> <span class="o">&lt;-</span> pnorm<span class="p">(</span>rc<span class="p">)</span> <span class="o">-</span> P<span class="p">[</span><span class="m">1</span><span class="p">,</span> <span class="m">1</span><span class="p">]</span>
</span><span class='line'>    P<span class="p">[</span><span class="m">2</span><span class="p">,</span> <span class="m">1</span><span class="p">]</span> <span class="o">&lt;-</span> pnorm<span class="p">(</span>cc<span class="p">)</span> <span class="o">-</span> P<span class="p">[</span><span class="m">1</span><span class="p">,</span> <span class="m">1</span><span class="p">]</span>
</span><span class='line'>    P<span class="p">[</span><span class="m">2</span><span class="p">,</span> <span class="m">2</span><span class="p">]</span> <span class="o">&lt;-</span> <span class="m">1</span> <span class="o">-</span> pnorm<span class="p">(</span>rc<span class="p">)</span> <span class="o">-</span> P<span class="p">[</span><span class="m">2</span><span class="p">,</span> <span class="m">1</span><span class="p">]</span>
</span><span class='line'>    P
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="o">&lt;</span>environment<span class="o">:</span> namespace<span class="o">:</span>psych<span class="o">&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>This solution resulted in a speed up of <code>tetrachor()</code> by a factor of 3!</p>

<p>Unfortunately, our trick doesn&#8217;t work for the <code>polychor()</code> function as well, since there are more degrees of freedom. However, we can eliminate calling <code>pvnorm()</code> for 11 cells in a hypothetical 6x6 matrix as we only need to find the values for 25 and can use subtraction to speed up the estimation of the remaining 11.  This results in a less impressive speed up for <code>polychor()</code> that I nonetheless hope will benefit researchers.</p>

<h3>Writing a parallelized function</h3>

<p>While we were happy with our initial speed increase, it didn&#8217;t have a noticeable impact on SAPA&#8217;s build time.  We then began to explore ways to parallelize our existing code.  While we attempted to use various packages (i.e., <code>foreach</code>), we settled on using <code>mcmapply</code> in the existing core parallel library to minimize our dependencies.</p>

<p>As you can see below, this resulted in a speed increase by a factor of N, where N = # of cpus you allocate.  Be warned, however, that memory consumption increases dramatically as well.</p>

<p><img src="http://frenchja.github.com/images/polyspeed.png"></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Analyze Student Exam Items using IRT]]></title>
    <link href="http://frenchja.github.com/blog/2013/10/25/analyzing-student-exams-using-irt/"/>
    <updated>2013-10-25T14:26:00-07:00</updated>
    <id>http://frenchja.github.com/blog/2013/10/25/analyzing-student-exams-using-irt</id>
    <content type="html"><![CDATA[<p>I&#8217;ve cross-posted this at the <a href="http://sapa-project.org/blog/">SAPA Project&#8217;s blog</a>.</p>

<p><a href="https://en.wikipedia.org/wiki/Item_response_theory">Item Response Theory</a> can be used to evaluate the effectiveness of
exams given to students.  One distinguishing feature from other paradigms is that it does not assume that every question
is equally difficult (or that the difficulty is tied to what the researcher said).  In this way, it is an empirical investigation
into the effectiveness of a given exam and can help the researcher 1) eliminate bad or problematic items and 2) judge whether the test was too difficult or the students simply didn&#8217;t study.</p>

<p>In the following tutorial, we&#8217;ll use <a href="http://www.r-project.org/">R</a> (R Core Team, 2013) along with the <a href="http://cran.r-project.org/web/packages/psych/index.html"><code>psych</code></a> package (Revelle, W., 2013) to look at a hypothetical exam.</p>

<!-- more -->


<p>Before we get started, remember that <code>R</code> is a programming language.  In the examples below, I perform operations on data using <a href="https://en.wikipedia.org/wiki/Function_%28computer_science%29"><em>functions</em></a> like <a href="http://stat.ethz.ch/R-manual/R-patched/library/stats/html/cor.html"><code>cor</code></a> and <a href="http://stat.ethz.ch/R-manual/R-devel/library/utils/html/read.table.html"><code>read.csv</code></a>.  We can also save the output as <a href="https://en.wikipedia.org/wiki/Object_%28computer_science%29"><em>objects</em></a> using the assignment arrow, <code>&lt;-</code>. It&#8217;s a bit different from a point-and-click program like SPSS, but you <em>don&#8217;t</em> need to know how to program to analyze exams and questions using IRT!</p>

<p>First, load the the <code>psych</code> package.  Next, load the students&#8217; grades into R using <code>read.csv()</code> from the <code>psych</code> package.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='r'><span class='line'><span class="c1"># Load the psych package</span>
</span><span class='line'>library<span class="p">(</span>psych<span class="p">)</span>
</span><span class='line'><span class="c1"># Read the csv file and save it as grades</span>
</span><span class='line'>grades <span class="o">&lt;-</span> read.csv<span class="p">(</span>file <span class="o">=</span> <span class="s">&quot;~/Downloads/Grades.csv&quot;</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>Notice that we are using item-level grades, where each row is a given student and each cell is the number of points received on that question.  In my example, V1, V2, etc. correspond to exam questions.  Your matrix or data frame should look like this:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='r'><span class='line'>head<span class="p">(</span>grades<span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>




<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
</pre></td><td class='code'><pre><code class='r'><span class='line'><span class="c1">##   V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12 V13 V14 V15 V16 V17 V18 V19 V20</span>
</span><span class='line'><span class="c1">## 1  2  2  2  2  4  2  3  2  4   2   2   3   5   3   6   2   4   4   4   3</span>
</span><span class='line'><span class="c1">## 2  2  0  2  2  0  0  3  0  4   2   0   1   3   0   0   2   2   1   0   0</span>
</span><span class='line'><span class="c1">## 3  2  2  2  2  0  2  3  2  4   0   0   3   5   0   5   2   4   2   4   2</span>
</span><span class='line'><span class="c1">## 4  2  1  2  2  3  0  0  2  4   2   2   3   1   1   2   0   4   1   4   3</span>
</span><span class='line'><span class="c1">## 5  2  2  2  2  4  2  3  2  4   2   2   3   5   3   4   2   4   4   4   3</span>
</span><span class='line'><span class="c1">## 6  1  0  2  2  0  2  0  2  0   2   1   2   5   0   3   2   4   2   4   3</span>
</span><span class='line'><span class="c1">##   V21 V22 V23 V24 V25 V26 V27 Total</span>
</span><span class='line'><span class="c1">## 1   2   2   4   4   6   6   6    91</span>
</span><span class='line'><span class="c1">## 2   0   0   0   3   3   6   6    42</span>
</span><span class='line'><span class="c1">## 3   2   1   2   4   6   5   6    72</span>
</span><span class='line'><span class="c1">## 4   0   2   4   4   0   0   0    49</span>
</span><span class='line'><span class="c1">## 5   2   2   4   4   5   6   6    88</span>
</span><span class='line'><span class="c1">## 6   0   0   4   4   6   4   3    58</span>
</span></code></pre></td></tr></table></div></figure>


<p>Next, compute the <a href="https://en.wikipedia.org/wiki/Polychoric_correlation">polychoric correlations</a> on the raw grades (not including the Total column).  By using polychoric correlations, we estimate the normal distribution of latent content knowledge, which can be underestimated if Pearson correlations are instead used on polytomous items (see  Lee, Poon &amp; Bentler, 1995).</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='r'><span class='line'><span class="c1"># Perform a polychoric correlation on grades and save it as grades.poly</span>
</span><span class='line'>grades.poly <span class="o">&lt;-</span> polychoric<span class="p">(</span>x <span class="o">=</span> grades<span class="p">[,</span> <span class="m">1</span><span class="o">:</span><span class="m">27</span><span class="p">],</span> polycor <span class="o">=</span> <span class="kc">TRUE</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now that we have the polychoric correlations, we can run <code>irt.fa()</code> on the dataset to see the item difficulties and information.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='r'><span class='line'><span class="c1"># Using grades.poly, perform an irt and save it as grades.irt</span>
</span><span class='line'>grades.irt <span class="o">&lt;-</span> irt.fa<span class="p">(</span>x <span class="o">=</span> grades.poly<span class="p">,</span> plot <span class="o">=</span> <span class="kc">TRUE</span><span class="p">)</span>
</span><span class='line'><span class="c1"># Plot the output from grades.irt</span>
</span><span class='line'>plot<span class="p">(</span>grades.irt<span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p><img src="http://frenchja.github.com/images/grades.png"></p>

<p>Thus, we have some great items that have a lot of information about students of average and low content knowledge (e.g., V24, V17, V18), but not enough to distinguish the high-knowledge students.  In redesigning an exam for next semester or year, we might save the best performing questions while trying to rewrite the existing questions or trying new questions.</p>

<p>Next, let&#8217;s see what how well the test did <em>overall</em> at distinguishing students:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='r'><span class='line'>plot.irt<span class="p">(</span>type <span class="o">=</span> <span class="s">&quot;test&quot;</span><span class="p">,</span> grades.irt<span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p><img src="http://frenchja.github.com/images/test.png"></p>

<p>The second plot shows the <em>test performance</em>.  We have great reliability for distinguishing who didn&#8217;t study (lowers end of our latent trait), but overall the test may have been too easy (opposite of my prediction).  It&#8217;s important that the test is not too difficult to discourage students, but the graph above suggests that we had very low information at how students that studied were different from eachother.  This is again reflected by the histogram plotted in the next section, where high scoring students seem to cluster together.</p>

<h2>Rescaling the test</h2>

<p>While many students in our hypothetical dataset did very well on the exam, instructors may
need to rescale their exam so that the mean grade is an 85% or 87.5%.  Using the <code>scale()</code> function (see also <a href="http://personality-project.org/r/psych/help/rescale.html"><code>rescale()</code></a> in <code>psych</code> package), we
can ensure that the <a href="https://en.wikipedia.org/wiki/Ranking#Ranking_in_statistics?s">rank-order</a> distribution of the students is preserved (allowing us to distinguish
those who studied well from those who didn&#8217;t), while scaling the sample distribution to fit in with other classes in your department.</p>

<p>Currently, our scores are in cumulative raw points.  Notice that we divide the Total points column by 91 to convert the histogram into grade percentages.  Let&#8217;s plot a histogram to see the distribution of scores.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='r'><span class='line'><span class="c1"># Load the ggplot2 library</span>
</span><span class='line'>library<span class="p">(</span>ggplot2<span class="p">)</span>
</span><span class='line'><span class="c1"># Plot a histogram</span>
</span><span class='line'>qplot<span class="p">((</span>Total<span class="o">/</span><span class="m">91</span><span class="p">)</span><span class="o">*</span><span class="m">100</span><span class="p">,</span> data<span class="o">=</span>grades<span class="p">,</span> geom<span class="o">=</span><span class="s">&quot;histogram&quot;</span><span class="p">,</span>xlab<span class="o">=</span><span class="s">&#39;Raw Grades&#39;</span><span class="p">,</span>
</span><span class='line'>  ylab<span class="o">=</span><span class="s">&#39;# of Students&#39;</span><span class="p">,</span>main<span class="o">=</span><span class="s">&#39;Distribution of student grades&#39;</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p><img src="http://frenchja.github.com/images/raw.png"></p>

<p>The distribution has a mean 71.68 percent and a standard deviation of 15.54.  Given grade inflation,
it may look like your students are doing poorly when in fact the distribution is similiar to other courses
being taught.  Next, we can rescale the grades, creating a mean of 87.5 and a standard deviation of 7.5.  These numbers are arbitrary so use your best judgement.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='r'><span class='line'>scaled.grades <span class="o">&lt;-</span> scale<span class="p">(</span>grades<span class="o">$</span>Total<span class="p">)</span> <span class="o">*</span> <span class="m">7.5</span> <span class="o">+</span> <span class="m">87.5</span>
</span><span class='line'>qplot<span class="p">(</span>scaled.grades<span class="p">,</span> xlab<span class="o">=</span><span class="s">&#39;Scaled Grades&#39;</span><span class="p">,</span>
</span><span class='line'>  ylab<span class="o">=</span><span class="s">&#39;# of Students&#39;</span><span class="p">,</span>main<span class="o">=</span><span class="s">&#39;Distribution of student grades&#39;</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p><img src="http://frenchja.github.com/images/scaled.png"></p>

<p>The second distribution may be preferred, depending on your needs.  With the raw distribution, we would have had 45% of the students receiving grades below a C-, assuming a normal distribution (for the curious, R can calculate these probabilites using the <code>pnorm</code> function: <code>pnorm(q=70,mean=71.68,sd=15.54)</code>).  Now, 0.9% of students would fall below the 70% cutoff.  Again, my mean and standard deviation chosen in the above example are arbitrary.</p>

<h2>References</h2>

<ul>
<li><p>Lee, S. Y., Poon, W. Y., &amp; Bentler, P. M. (1995). <em>A two‐stage estimation of structural equation models with continuous and polytomous variables</em>. British Journal of Mathematical and Statistical Psychology, 48(2), 339-358.</p></li>
<li><p>R Core Team (2013). <em>R: A language and environment for statistical computing</em>. R Foundation for Statistical Computing, Vienna, Austria. <a href="http://www.R-project.org/">http://www.R-project.org/</a>.</p></li>
<li><p>Revelle, W. (2013). <em>psych: Procedures for Personality and Psychological Research</em>. Northwestern University, Evanston, Illinois, USA. <a href="http://CRAN.R-project.org/package=psych">http://CRAN.R-project.org/package=psych</a>. Version = 1.3.10.</p></li>
</ul>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Easy Sweave for LaTeX and R]]></title>
    <link href="http://frenchja.github.com/blog/2013/08/16/easy-sweaving-for-latex-and-r/"/>
    <updated>2013-08-16T12:41:00-07:00</updated>
    <id>http://frenchja.github.com/blog/2013/08/16/easy-sweaving-for-latex-and-r</id>
    <content type="html"><![CDATA[<p>When you&#8217;re writing up reports using statistics from R, it can be tiresome
to constantly copy and paste results from the R Console.  To get around this, many of us use Sweave, which allows us to <em>embed</em> R code in LaTeX files.
<a href="https://en.wikipedia.org/wiki/Sweave">Sweave</a> is an R function that converts R code to LaTeX, a document typesetting language.  This enables accurate, shareable analyses as well as high-resolution graphs that are publication quality.</p>

<p>Needless to say, the marriage of statistics with documents makes writing up APA-style reports a bit easier, especially with Brian Beitzel&#8217;s amazing <a href="http://www.ctan.org/pkg/apa6"><code>apa6</code> class for LaTeX</a>.</p>

<!-- more -->


<h2>Making Sweave Available Systemwide</h2>

<p>However, Sweave doesn&#8217;t always work correctly.  One common complaint that you&#8217;ll get after Sweaving a file is <code>Sweave.sty not found!</code>. While Sweave.sty is a LaTeX package, it doesn&#8217;t <em>live</em> with the rest of the LaTeX packages because it&#8217;s installed using R.  Many people try to solve this by copying and pasting Sweave.sty into every document directory, but I&#8217;m sharing a better way below.</p>

<p>Using <a href="https://en.wikipedia.org/wiki/Terminal_%28OS_X%29">Terminal.app</a>:</p>

<figure class='code'><figcaption><span>Go to the MacTeX or TeX Live local directory.</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nb">cd</span> /usr/local/texlive/texmf-local/tex/latex
</span></code></pre></td></tr></table></div></figure>




<figure class='code'><figcaption><span>Form a link between the R Sweave.sty files and MacTeX</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>sudo ln -s /Library/Frameworks/R.framework/Resources/share/texmf/ Sweave
</span></code></pre></td></tr></table></div></figure>




<figure class='code'><figcaption><span>Tell MacTeX/TeX Live to recognize the file and rebuild the database</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>sudo mktexlsr
</span></code></pre></td></tr></table></div></figure>


<p>If using <code>mktexlsr</code> results in a <code>command not found</code> error, the TeX Live distribution probably isn&#8217;t in your <a href="https://en.wikipedia.org/wiki/PATH_%28variable%29">$PATH</a>, but you can hunt for the program anyway.  For example, if you&#8217;re using MacTeX 2013, the program will be found in a directory similar to this:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>sudo /usr/local/texlive/2013/bin/x86_64-darwin/mktexlsr
</span></code></pre></td></tr></table></div></figure>


<h2>Using Sweave in TeXShop</h2>

<p>When you&#8217;re getting started with LaTeX, many Mac users prefer the bundled
editor, TeXShop.  <a href="http://cameron.bracken.bz/sweave-for-texshop">Cameron Bracken</a> gives us a helpful piece of code that allows easy Sweaving straight from TeXShop.  TeXShop uses various <em>engines</em> that allow it to render LaTeX.  Using a bit of <a href="https://en.wikipedia.org/wiki/Bash_%28Unix_shell%29"><code>BASH</code></a> scripting, we can write our own Sweave engine and make it available right within TeXShop.  I have adapted Cameron&#8217;s original engine to accomodate Bibtex citations (<a href="https://en.wikibooks.org/wiki/LaTeX/Bibliography_Management#Why_won.27t_LaTeX_generate_any_output.3F">see here</a>).</p>

<p>Using a text editor, paste in the following syntax and save the file as Sweave.engine:</p>

<figure class='code'><figcaption><span>Sweave.engine</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="c">#!/bin/env bash</span>
</span><span class='line'><span class="nb">export </span><span class="nv">PATH</span><span class="o">=</span><span class="nv">$PATH</span>:/usr/texbin:/usr/local/bin
</span><span class='line'>R CMD Sweave <span class="s2">&quot;$1&quot;</span>
</span><span class='line'>pdflatex <span class="s2">&quot;${1%.*}&quot;</span>
</span><span class='line'>bibtex <span class="s2">&quot;${1%.*}.aux&quot;</span>
</span><span class='line'>pdflatex <span class="s2">&quot;${1%.*}&quot;</span>
</span><span class='line'><span class="c"># If you run pdflatex again you get citations</span>
</span><span class='line'>pdflatex <span class="s2">&quot;${1%.*}&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Next, in Terminal.app, move the file to the TeXShop engines folder:</p>

<figure class='code'><figcaption><span>Enable the Sweave.engine</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>mv Sweave.engine ~/Library/TeXShop/Engines/
</span><span class='line'>chmod +x ~/Library/TeXShop/Engines/Sweave.engine
</span></code></pre></td></tr></table></div></figure>


<p><img src="http://frenchja.github.com/images/sweaveengine.png"></p>

<p>Now restart TeXShop if it&#8217;s running and you should see Sweave as an available option!</p>

<p><img src="http://frenchja.github.com/images/sweave.png"></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Installing R in Linux]]></title>
    <link href="http://frenchja.github.com/blog/2013/03/11/installing-r-in-linux/"/>
    <updated>2013-03-11T17:18:00-07:00</updated>
    <id>http://frenchja.github.com/blog/2013/03/11/installing-r-in-linux</id>
    <content type="html"><![CDATA[<p>This guide is intended to faciliate the installation of up-to-date R packages
for users new to either R or Linux.  Unlike Windows binaries or Mac packages,
Linux software is often distributed as source-code and then compiled by package
maintainers.  The use of package managers has many advantages that I won&#8217;t
discuss here (see <a href="https://en.wikipedia.org/wiki/Package_management_system">Wikipedia</a>).<br/>
More importantly, the difference can be initially intimidating.<br/>
However, once the user gets used to using package managers such as
<a href="https://en.wikipedia.org/wiki/Advanced_Packaging_Tool">apt</a> or
<a href="https://en.wikipedia.org/wiki/Yellowdog_Updater,_Modified">yum</a> to install software,
I&#8217;m confident they&#8217;ll appreciate their ease of use.</p>

<p>These instructions are organized by system type.</p>

<h2>Debian-based Distributions</h2>

<h3>Ubuntu</h3>

<p>Full installation instructions for Ubuntu can be found
<a href="http://cran.rstudio.com/bin/linux/ubuntu/">here</a>.  Luckily, CRAN mirrors have
compiled binaries of R which can be installed using the apt-get package manager.
To accomplish this, we&#8217;ll first add the <a href="http://cran.us.r-project.org/bin/linux/ubuntu/">CRAN
repo</a> for Ubuntu packages to
<code>/etc/apt/sources.list</code>.  If you prefer to manually edit the sources.list file,
you can do so by issuing the following in the terminal:</p>

<figure class='code'><figcaption><span>Inspecting sources.list</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>sudo nano /etc/apt/sources.list
</span></code></pre></td></tr></table></div></figure>




<figure class='code'><figcaption><span>Installing R in Ubuntu</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="c"># Grabs your version of Ubuntu as a BASH variable</span>
</span><span class='line'><span class="nv">CODENAME</span><span class="o">=</span><span class="sb">`</span>grep CODENAME /etc/lsb-release | cut -c 18-<span class="sb">`</span>
</span><span class='line'>
</span><span class='line'><span class="c"># Appends the CRAN repository to your sources.list file </span>
</span><span class='line'>sudo sh -c <span class="s1">&#39;echo &quot;deb http://cran.rstudio.com/bin/linux/ubuntu $CODENAME&quot; &gt;&gt; /etc/apt/sources.list&#39;</span>
</span><span class='line'>
</span><span class='line'><span class="c"># Adds the CRAN GPG key, which is used to sign the R packages for security.</span>
</span><span class='line'>sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys E084DAB9
</span><span class='line'>
</span><span class='line'>sudo apt-get update
</span><span class='line'>sudo apt-get install r-base r-dev
</span></code></pre></td></tr></table></div></figure>




<!-- more -->


<h3>Debian</h3>

<p>The instructions for installing R in Debian are similar to Ubuntu.  Regarding &#8216;stable&#8217;
versions of Debian, the CRAN
<a href="http://cran.rstudio.com/bin/linux/debian/README.html">README file</a> for Debian
points out:</p>

<blockquote><p>After a release of Debian &#8220;stable&#8221;, no new packages get added by Debian to keep the release as &#8216;stable&#8217; as possible. This implies that the R release contained in the official Debian release will become outdated as time passes.</p><footer><strong>CRAN</strong> <cite><a href='http://cran.us.r-project.org/bin/linux/debian/README.html'>README</a></cite></footer></blockquote>


<p>Thus, we&#8217;ll append the CRAN repository to the Debian list to update the available R version, just like
we did for Ubuntu:</p>

<figure class='code'><figcaption><span>Installing R in Debian Stable</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="c"># Appends the CRAN repository to your sources.list file </span>
</span><span class='line'>sudo sh -c <span class="s1">&#39;echo &quot;deb http://cran.rstudio.com/bin/linux/debian lenny-cran/&quot; &gt;&gt; /etc/apt/sources.list&#39;</span>
</span><span class='line'>
</span><span class='line'><span class="c"># Adds the CRAN GPG key, which is used to sign the R packages for security.</span>
</span><span class='line'>sudo apt-key adv --keyserver subkeys.pgp.net --recv-key 381BA480
</span><span class='line'>sudo apt-get update
</span><span class='line'>sudo apt-get install r-base r-base-dev
</span></code></pre></td></tr></table></div></figure>


<p>Finally, you can search for additional R packages in terminal using <code>apt-cache</code>:</p>

<figure class='code'><figcaption><span>Searching for R packages using apt-get</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>apt-cache search ^r-.*
</span></code></pre></td></tr></table></div></figure>


<h3>Installing RStudio</h3>

<p>Rstudio is a cross-platform user interface for R. The
RStudio package is compiled for both Debian and Ubuntu distributions.
Therefore, the installation instructions are the same.  Copy the link for the
latest RStudio package from <a href="http:/%0A/www.rstudio.com/ide/download/desktop">http://www.rstudio.com/ide/download/desktop</a> (e.g., <a href="http://download1.rstudio.org/rstudio-0.97.320-amd64.deb">http://download1.rstudio.org/rstudio-0.97.320-amd64.deb</a>
).</p>

<figure class='code'><figcaption><span>Installing RStudio using apt-get</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>sudo apt-get install http://download1.rstudio.org/rstudio-0.97.320-amd64.deb
</span></code></pre></td></tr></table></div></figure>


<h2>RedHat-based Distributions</h2>

<h3>RedHat EL6 (or CentOS 6+)</h3>

<p>In order to get R running on RHEL 6, we&#8217;ll need to add an additional repository
that allows us to install the new packages, EPEL.  <a href="https://fedoraproject.org/wiki/EPEL">Extra Packages for
Enterprise Linux</a> (or EPEL) is a Fedora
Special Interest Group that creates, maintains, and manages a high quality set
of additional packages for Enterprise Linux, including, but not limited to, Red
Hat Enterprise Linux (RHEL), CentOS and Scientific Linux (SL).</p>

<figure class='code'><figcaption><span>Installing EPEL and R</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="c"># For El5 or CentOS 5</span>
</span><span class='line'>su -c <span class="s1">&#39;rpm -Uvh http://download.fedoraproject.org/pub/epel/5/i386/epel-release-5-4.noarch.rpm&#39;</span>
</span><span class='line'>sudo yum update
</span><span class='line'>sudo yum install R
</span><span class='line'>
</span><span class='line'><span class="c"># For El6 or CentOS 6</span>
</span><span class='line'>su -c <span class="s1">&#39;rpm -Uvh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm&#39;</span>
</span><span class='line'>sudo yum update
</span><span class='line'>sudo yum install R
</span></code></pre></td></tr></table></div></figure>


<p>Finally, you can search for additional R packages in terminal using <code>yum</code>:</p>

<figure class='code'><figcaption><span>Searching for R packages using yum</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>yum list R-<span class="se">\*</span>
</span></code></pre></td></tr></table></div></figure>


<h3>Fedora</h3>

<p>For Fedora, life is much easier.  Current versions of Fedora have an up-to-date build of R in their repositories.</p>

<figure class='code'><figcaption><span>Installing R in Fedora</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>sudo yum update
</span><span class='line'>sudo yum install R
</span></code></pre></td></tr></table></div></figure>


<h3>Installing RStudio</h3>

<p>You&#8217;ll want to copy the appropriate link for your system from the <a href="http://www.rstudio.com/ide/download/desktop">RStudio Desktop Download</a> page.  In my case, it was <code>http://download1.rstudio.org/rstudio-0.97.320-x86_64.rpm</code>.</p>

<figure class='code'><figcaption><span>Installing RStudio on Fedora/RHEL/CentOS</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>sudo yum install http://download1.rstudio.org/rstudio-0.97.320-x86_64.rpm
</span></code></pre></td></tr></table></div></figure>


<h1>Dealing with PPC-based Systems</h1>

<p>As our lab has a lot of old iMacs that are still quite useful, I&#8217;ve recently
dealt with the best way to support R on these machines.  These machines are
still quite useful, particulary when their maximum potential RAM is installed.
However, Apple stopped supporting the machines after OS 10.5.8 (<a href="https://en.wikipedia.org/wiki/Apple%27s_transition_to_Intel_processors">see here</a>).
While the <a href="http://r.research.att.com/">nightly packages</a> distributed do install
on PPC machines with OS X, they lack the R Framework compiled for PPC, meaning
that it&#8217;s a useless installation.  This means that a user stuck on OS X 10.5.8
is tied to R 2.10, a very old R distribution that&#8217;s incompatible with many
existing packages.</p>

<h2>Any solutions?</h2>

<p>My first solution was to compile R from source using
<a href="https://www.macports.org/">MacPorts</a>, a package manager similar in concept to
<code>yum</code> or <code>apt-get</code>.  While successful, it takes a <em>long</em>, <em>long</em>, time to build
R and its necessary dependencies on a 1.8 Ghz G5 processor.  From a system
administrator&#8217;s perspective, this also is the least parsimonious solution
possible, since each machine has to be updated with each new release of R.</p>

<p>Thanks to <a href="http://www.rstudio.com/ide/docs/server/getting_started">RStudio Server</a>, each machine
doesn&#8217;t need to have R installed, as it can be run off a more powerful server
and accessed using a reasonably up-to-date browser.  I was able to install R and
RStudio on our RedHat EL6 server easily.  The trick was to make this as seemless
as possible from the user&#8217;s perspective.  To accomplish this, I saved the
Bookmark to the Desktop.</p>

<p><img class="right" src="http://frenchja.github.com/images/ppc-r-bookmark.png" title="R Bookmark" ></p>

<p>Next, I downloaded a large R icon using Google Images and edited the Bookmark&#8217;s
icon to appear as if it were R.  To do this, just copy the R icon from within
Preview, select the icon of the Bookmark by right-clicking and selecting Get
Info, and pasting using <code>Command+V</code>.</p>

<p><img class="left" src="http://frenchja.github.com/images/ppc-r-preview.png" width="300" title="R Preview" ></p>

<p><img class="left" src="http://frenchja.github.com/images/ppc-r-getinfo.png" title="Get Info" ></p>

<p>Finally, this was dragged to the OS X dock, appearing just as if it were R on the local machine, but without all the hassle and slow load times on PPC.</p>

<p><img class="right" src="http://frenchja.github.com/images/ppc-r-dock.png" title="Fake Dock Icon" ></p>

<p>It is worth noting that this solution is only important for users tied to OS X
10.5.8.  I&#8217;ve had great success with using <a href="https://fedoraproject.org/wiki/Architectures/PowerPC?rd=Arch:PPC">Fedora&#8217;s PPC build</a>, which
has packages compiled for PPC already.  However, as Linux is intimidating for
many users, I chose to install RStudio Server on our lab server.</p>

<h1>Frequently Asked Questions</h1>

<ol>
<li><p>I get an error that says I&#8217;m <code>not in the sudoers file</code>:  This means that you don&#8217;t have access to install software on your machine.  Talk to your system administrator.</p></li>
<li><p>I don&#8217;t know if I&#8217;m running Ubuntu or Fedora.  How do I know which instructions to use?  Jokes aside, run <code>lsb_release -irc</code> in your terminal.</p></li>
</ol>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Faster SSCC  Access using Bash]]></title>
    <link href="http://frenchja.github.com/blog/2012/04/05/faster-sscc-access-using-bash/"/>
    <updated>2012-04-05T19:08:00-07:00</updated>
    <id>http://frenchja.github.com/blog/2012/04/05/faster-sscc-access-using-bash</id>
    <content type="html"><![CDATA[<p>I use SSH regularly to login remotely to servers for experiments and
data analysis.  For instance, <a href="http://www.it.northwestern.edu/research/sscc/">Northwestern&#8217;s Social Sciences Computing
Cluster</a> is available with an
SSH remote login and using <a href="https://en.wikipedia.org/wiki/X_Window_System">X11</a>
forwarding, I can access <a href="http://www.rstudio.org/">RStudio</a> and run analyses
that require more memory than my office iMac has.  However, logging into the
SSCC over SSH isn&#8217;t as quick and launching a program in Spotlight.</p>

<p>While browsing a friend&#8217;s .bashrc on Github, I realized I could
use a simple Bash function to speed things up.  Copy and paste the following
into Terminal:</p>

<figure class='code'><figcaption><span>Launching RStudio Remotely over SSH</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nb">echo</span> <span class="s2">&quot;function Rsscc() {</span>
</span><span class='line'><span class="s2">    ssh  -c arcfour,blowfish-cbc \</span>
</span><span class='line'><span class="s2">        -XC netid@hardin.it.northwestern.edu rstudio</span>
</span><span class='line'><span class="s2">    wait $1</span>
</span><span class='line'><span class="s2">    exit 0</span>
</span><span class='line'><span class="s2">}&quot;</span> &gt;&gt; ~/.profile
</span></code></pre></td></tr></table></div></figure>


<p>After you restart Terminal.app, you can launch RStudio remotely by typing
<code>Rsscc</code>, or whatever you renamed my function to.  In principle, you could also
create a simple menu for choosing among multiple servers or programs using a bit of
<a href="http://ss64.com/bash/read.html">read</a> and
<a href="http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_07_03.html">case</a>.</p>

<figure class='code'><figcaption><span>Creating a Simple Command Menu</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>task_menu <span class="o">()</span> <span class="o">{</span>
</span><span class='line'>cat <span class="s">&lt;&lt; EOF</span>
</span><span class='line'><span class="s">$(tput setaf 5)Remote Login$(tput sgr0)</span>
</span><span class='line'><span class="s">$(tput setaf 5)============$(tput sgr0)</span>
</span><span class='line'>
</span><span class='line'><span class="s">Please choose one of the following:</span>
</span><span class='line'>
</span><span class='line'><span class="s">1) RStudio</span>
</span><span class='line'><span class="s">2) Stata</span>
</span><span class='line'>
</span><span class='line'><span class="s">EOF</span>
</span><span class='line'>  <span class="nb">read</span> -r choice
</span><span class='line'>  <span class="k">case</span> <span class="s2">&quot;$choice&quot;</span> in
</span><span class='line'>      1<span class="o">)</span> <span class="nv">task</span><span class="o">=</span><span class="s2">&quot;rstudio&quot;</span> ;;
</span><span class='line'>      2<span class="o">)</span> <span class="nv">task</span><span class="o">=</span><span class="s2">&quot;xstata&quot;</span> ;;
</span><span class='line'>      *<span class="o">)</span> <span class="nb">echo</span> <span class="s2">&quot;Please choose a number!&quot;</span> <span class="o">&amp;&amp;</span> task_menu ;;
</span><span class='line'>  <span class="k">esac</span>
</span><span class='line'><span class="k">fi</span>
</span><span class='line'>ssh -c arcfour,blowfish-cbc <span class="se">\</span>
</span><span class='line'>    -XC netid@hardin.it.northwestern.edu <span class="nv">$task</span>
</span><span class='line'>    <span class="nb">wait</span> <span class="nv">$1</span>
</span><span class='line'>    <span class="nb">exit </span>0
</span><span class='line'><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure>


<p><em>Note:</em>  This works best if you&#8217;re using an up-to-date version of X11, such as
<a href="http://xquartz.macosforge.org/trac/wiki">XQuartz</a> and are accessing the SSCC
using Ethernet.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Analyzing Qualtrics Data in R using Github Packages]]></title>
    <link href="http://frenchja.github.com/blog/2012/03/27/integrating-r-and-qualtrics/"/>
    <updated>2012-03-27T14:23:00-07:00</updated>
    <id>http://frenchja.github.com/blog/2012/03/27/integrating-r-and-qualtrics</id>
    <content type="html"><![CDATA[<p><a href="http://www.qualtrics.com/">Qualtrics</a> is an online survey platform similar to SurveyMonkey that is used by researchers to
collect data.  Until recently, one had to manually download the data in either SPSS or .csv format, making ongoing data
analysis difficult to check whether the trend of the incoming data supports the hypothesis.</p>

<p><a href="http://bryer.org/">Jason Bryer</a> has recently
developed an R package published to Github for downloading data from Qualtrics within R using the Qualtrics API
(<a href="https://github.com/jbryer/qualtrics">see his Github repo</a>).  Using this package, you can integrate your Qualtrics data
with other experimental data collected in the lab and, by running an Rscript as a cronjob, get daily updates for your
analyses in R.  I&#8217;ll demonstrate the use of this package below.</p>

<!-- more -->


<h2>Installing the Qualtrics Package from Github</h2>

<figure class='code'><figcaption><span>Installing Qualtrics on Mac/Linux  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='r'><span class='line'><span class="c1">#!/usr/bin/env Rscript</span>
</span><span class='line'><span class="c1"># Authors:  Jason A. French</span>
</span><span class='line'><span class="c1"># Email:    frenchja@u.northwestern.edu</span>
</span><span class='line'>install.packages<span class="p">(</span><span class="s">&#39;devtools&#39;</span><span class="p">,</span>dependencies<span class="o">=</span><span class="kc">TRUE</span><span class="p">)</span>
</span><span class='line'><span class="c1"># install.packages(&#39;RTools&#39;) # May be needed for some Windows versions.</span>
</span><span class='line'>devtools<span class="o">:::</span>install_github<span class="p">(</span>repo<span class="o">=</span><span class="s">&#39;qualtrics&#39;</span><span class="p">,</span>username<span class="o">=</span><span class="s">&#39;jbryer&#39;</span><span class="p">)</span>
</span><span class='line'>require<span class="p">(</span>qualtrics<span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>If you wanted to distribute the Rscript to colleagues with different setups, you would use something like this:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
</pre></td><td class='code'><pre><code class='r'><span class='line'><span class="c1">#!/usr/bin/env Rscript</span>
</span><span class='line'><span class="c1"># Authors:  Jason A. French</span>
</span><span class='line'><span class="c1"># Email:    frenchja@u.northwestern.edu</span>
</span><span class='line'><span class="c1"># Check for devtools</span>
</span><span class='line'><span class="kr">if</span> <span class="p">(</span><span class="o">!</span>require<span class="p">(</span>devtools<span class="p">))</span> <span class="p">{</span>
</span><span class='line'>    warning<span class="p">(</span><span class="s">&#39;devtools not found. Attempting to install!&#39;</span><span class="p">)</span>
</span><span class='line'>    install.packages<span class="p">(</span><span class="s">&#39;devtools&#39;</span><span class="p">,</span>dependencies<span class="o">=</span><span class="kc">TRUE</span><span class="p">)</span>
</span><span class='line'>    require<span class="p">(</span>devtools<span class="p">,</span>character.only<span class="o">=</span><span class="kc">TRUE</span><span class="p">)</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="c1"># Check Qualtrics Package from Github</span>
</span><span class='line'><span class="kr">if</span> <span class="p">(</span><span class="o">!</span>require<span class="p">(</span>qualtrics<span class="p">))</span> <span class="p">{</span>
</span><span class='line'>  warning<span class="p">(</span><span class="s">&#39;Qualtrics package not found&#39;</span><span class="p">)</span>
</span><span class='line'>  install_github<span class="p">(</span>repo<span class="o">=</span><span class="s">&#39;qualtrics&#39;</span><span class="p">,</span>username<span class="o">=</span><span class="s">&#39;jbryer&#39;</span><span class="p">)</span>
</span><span class='line'>  require<span class="p">(</span>qualtrics<span class="p">)</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Pulling Data from Qualtrics</h2>

<p><img class="right" src="http://frenchja.github.com/images/qualtricsid2.png">
First, you&#8217;ll need to find the Survey ID of the associated study on Qualtrics.  Access your <code>Account Settings</code> and click on
<code>Qualtrics IDs</code>.  From here, copy the entire ID into your R code (e.g., <code>SV_blahblah</code>).
<img class="center" src="http://frenchja.github.com/images/qualtricsid1.png"></p>

<p>Next, load the <code>qualtrics</code> package in R and pull the data using <code>getSurveyResults()</code>. <em>If you receive an error in R
regarding API permissions, you may need to email support@qualtrics.com and request API access.  The
R function accesses your survey using XML.</em></p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='r'><span class='line'><span class="c1"># Get Qualtrics Survey Data</span>
</span><span class='line'>qualtrics.data <span class="o">&lt;-</span> getSurveyResults<span class="p">(</span>username<span class="o">=</span>qualtrics.user<span class="p">,</span>
</span><span class='line'>                      password<span class="o">=</span>qualtrics.pass<span class="p">,</span>
</span><span class='line'>                      surveyid<span class="o">=</span><span class="s">&#39;SV_blahblah&#39;</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>However, readers have pointed out that the resulting data doesn&#8217;t have your variable names.  Alternatively, Trevor Kvaran points out that you can modify the getSurveyResults function to export the variable names by appending &#8220;&amp;ExportTags=1&#8221; to the url:</p>

<figure class='code'><figcaption><span>Modifying getSurveyResults to pull variable names  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
</pre></td><td class='code'><pre><code class='r'><span class='line'>getSurveyResults <span class="o">&lt;-</span> <span class="kr">function</span> <span class="p">(</span>username<span class="p">,</span> password<span class="p">,</span> surveyid<span class="p">,</span> truncNames <span class="o">=</span> <span class="m">20</span><span class="p">,</span> startDate <span class="o">=</span> <span class="kc">NULL</span><span class="p">,</span> endDate <span class="o">=</span> <span class="kc">NULL</span><span class="p">)</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    url <span class="o">=</span> paste<span class="p">(</span><span class="s">&quot;http://eu.qualtrics.com/Server...&quot;</span><span class="p">,</span> username<span class="p">,</span>
</span><span class='line'>                <span class="s">&quot;&amp;Password=&quot;</span><span class="p">,</span> password<span class="p">,</span>
</span><span class='line'>                <span class="s">&quot;&amp;SurveyID=&quot;</span><span class="p">,</span> surveyid<span class="p">,</span>
</span><span class='line'>                <span class="s">&quot;&amp;ExportTags=1&quot;</span><span class="p">,</span>
</span><span class='line'>                <span class="s">&quot;&amp;Format=CSV&quot;</span><span class="p">,</span>
</span><span class='line'>                ifelse<span class="p">(</span>is.null<span class="p">(</span>startDate<span class="p">),</span> <span class="s">&quot;&quot;</span><span class="p">,</span> paste<span class="p">(</span><span class="s">&quot;&amp;StartDate=&quot;</span><span class="p">,</span> startDate<span class="p">,</span> sep <span class="o">=</span> <span class="s">&quot;&quot;</span><span class="p">)),</span> ifelse<span class="p">(</span>is.null<span class="p">(</span>endDate<span class="p">),</span> <span class="s">&quot;&quot;</span><span class="p">,</span> paste<span class="p">(</span><span class="s">&quot;&amp;EndDate=&quot;</span><span class="p">,</span> endDate<span class="p">,</span> sep <span class="o">=</span> <span class="s">&quot;&quot;</span><span class="p">)),</span> sep <span class="o">=</span> <span class="s">&quot;&quot;</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>    t <span class="o">=</span> read.csv<span class="p">(</span>url<span class="p">)</span>
</span><span class='line'>    t<span class="o">&lt;-</span>t<span class="p">[</span><span class="m">-1</span><span class="p">,]</span>
</span><span class='line'>    t<span class="o">$</span>X <span class="o">=</span> <span class="kc">NULL</span>
</span><span class='line'>    n <span class="o">=</span> strsplit<span class="p">(</span>names<span class="p">(</span>t<span class="p">),</span> <span class="s">&quot;....&quot;</span><span class="p">,</span> fixed <span class="o">=</span> <span class="kc">TRUE</span><span class="p">)</span>
</span><span class='line'>    <span class="kr">for</span> <span class="p">(</span>i <span class="kr">in</span> <span class="m">1</span><span class="o">:</span>ncol<span class="p">(</span>t<span class="p">))</span> <span class="p">{</span>
</span><span class='line'>        names<span class="p">(</span>t<span class="p">)[</span>i<span class="p">]</span> <span class="o">=</span> n<span class="p">[[</span>i<span class="p">]][</span>length<span class="p">(</span>n<span class="p">[[</span>i<span class="p">]])]</span>
</span><span class='line'>        <span class="kr">if</span> <span class="p">(</span>nchar<span class="p">(</span>names<span class="p">(</span>t<span class="p">)[</span>i<span class="p">])</span> <span class="o">&gt;</span> truncNames<span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            names<span class="p">(</span>t<span class="p">)[</span>i<span class="p">]</span> <span class="o">=</span> substr<span class="p">(</span>names<span class="p">(</span>t<span class="p">)[</span>i<span class="p">],</span> <span class="m">1</span><span class="p">,</span> truncNames<span class="p">)</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>    t
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Again, if you are distributing the analysis to collaborators, you may want to use a setup like below, which reads the user and
password securely.  If you want to automate this, you&#8217;ll obviously need hardcode your username and password.  At this time,
I don&#8217;t believe R has a hashing mechanism for passwords like Python, meaning you&#8217;ll need to have a plaintext password.</p>

<figure class='code'><figcaption><span>Password Protection for the Paranoid  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
</pre></td><td class='code'><pre><code class='r'><span class='line'><span class="c1"># Get Qualtrics Survey Data</span>
</span><span class='line'><span class="c1"># Not sure this will work in R.app.  Only in Terminal.app</span>
</span><span class='line'>get_password <span class="o">&lt;-</span> <span class="kr">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  cat<span class="p">(</span><span class="s">&quot;Qualtrics Password: &quot;</span><span class="p">)</span>
</span><span class='line'>  system<span class="p">(</span><span class="s">&quot;stty -echo&quot;</span><span class="p">)</span>
</span><span class='line'>  a <span class="o">&lt;-</span> readline<span class="p">()</span>
</span><span class='line'>  system<span class="p">(</span><span class="s">&quot;stty echo&quot;</span><span class="p">)</span>
</span><span class='line'>  cat<span class="p">(</span><span class="s">&quot;\n&quot;</span><span class="p">)</span>
</span><span class='line'>  <span class="kr">return</span><span class="p">(</span>a<span class="p">)</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'>qualtrics.user <span class="o">&lt;-</span> readline<span class="p">(</span>prompt<span class="o">=</span><span class="s">&#39;Enter your Qualtrics username&#39;</span><span class="p">)</span>
</span><span class='line'>qualtrics.pass <span class="o">&lt;-</span> get_password<span class="p">()</span>
</span><span class='line'>qualtrics.data <span class="o">&lt;-</span> getSurvey<span class="p">(</span>username<span class="o">=</span>qualtrics.user<span class="p">,</span>
</span><span class='line'>                      password<span class="o">=</span>qualtrics.pass<span class="p">,</span>
</span><span class='line'>                      surveyid<span class="o">=</span><span class="s">&#39;SV_blahblah&#39;</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Outputting Data using xtable</h2>

<p>Now that we have our data pulled from Qualtrics, we can analyze it as if it were a regular R data.frame.
If you know your specific survey variables of interest, you&#8217;ll want to modify the code using <code>qualtrics.data[,c('Var1','Var2)]</code>.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='r'><span class='line'>require<span class="p">(</span>psych<span class="p">)</span>
</span><span class='line'>require<span class="p">(</span>xtable<span class="p">)</span>
</span><span class='line'>qualtrics.describe <span class="o">&lt;-</span> describe<span class="p">(</span>qualtrics.data<span class="p">)</span>
</span><span class='line'>qual.table <span class="o">&lt;-</span> xtable<span class="p">(</span>qualtrics.describe<span class="p">)</span>
</span><span class='line'>print.xtable<span class="p">(</span>qual.table<span class="p">,</span>type<span class="o">=</span><span class="s">&#39;html&#39;</span><span class="p">,</span>file<span class="o">=</span><span class="s">&#39;~/Desktop/Qualtrics.html&#39;</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="c1"># Or...</span>
</span><span class='line'>qual.lm <span class="o">&lt;-</span> lm<span class="p">(</span>DV <span class="o">~</span> IV1<span class="o">*</span>IV2<span class="p">,</span> data<span class="o">=</span>qualtrics.data<span class="p">)</span>
</span><span class='line'>lm.table <span class="o">&lt;-</span> xtable<span class="p">(</span>qual.lm<span class="p">)</span>
</span><span class='line'>print.xtable<span class="p">(</span>lm.table<span class="p">,</span>type<span class="o">=</span><span class="s">&quot;html&quot;</span><span class="p">,</span>file<span class="o">=</span><span class="s">&#39;~/Desktop/Qualtrics.html&#39;</span><span class="p">,</span>append<span class="o">=</span><span class="kc">TRUE</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Running an Rscript</h2>

<p>In order for your script to be run daily, it needs to be a) marked as executable (<a href="https://en.wikipedia.org/wiki/Filesystem_permissions">see here</a>)
and b) added to <a href="https://en.wikipedia.org/wiki/Cron">crontab</a>.  First, mark it
as executable:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>chmod +x ~/Qualtrics.R
</span></code></pre></td></tr></table></div></figure>


<p><em>Make sure that <code>#!/usr/bin/env Rscript</code> is at the top of your script!</em></p>

<p>Next, edit the system&#8217;s <a href="https://en.wikipedia.org/wiki/Cron">crontab</a> and add the script.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>sudo nano /etc/crontab
</span><span class='line'>
</span><span class='line'>0 1 * * * ~/Qualtrics.R
</span></code></pre></td></tr></table></div></figure>



]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Graphing Error Bars for Repeated-Measures Variables with ggplot2]]></title>
    <link href="http://frenchja.github.com/blog/2012/03/07/graphing-error-bars-for-repeated-measures-variables-with-ggplot2/"/>
    <updated>2012-03-07T10:37:00-08:00</updated>
    <id>http://frenchja.github.com/blog/2012/03/07/graphing-error-bars-for-repeated-measures-variables-with-ggplot2</id>
    <content type="html"><![CDATA[<p>When presenting data, confidence intervals and error bars let the audience know the amount of uncertainty in the data, and
see how much of the variance is explained by the reported effect of an experiment.  While this is straightforward for
between-subject variables, it&#8217;s less clear for mixed- and repeated-measures designs.</p>

<p>Consider the following.  When running an ANOVA, the test accounts for three sources of variance:  1) the fixed effect of the condition, 2) the
ability of the participants, and 3) the random error, as data = model + error.  Plotting the repeated-measures without taking the
different sources of variance into consideration would result in overlapping error bars that include between-subject variability, confusing the presentation&#8217;s audience.
While the ANOVA partials out the differences between the participants and allow you to assess the effect of the
repeated-measure, computing a regular confidence interval by
multiplying the standard error and the F-statistic doesn&#8217;t work in this way.</p>

<p>Winston Chang has developed a set of R functions based on Morey (2008) and Cousineau (2005) on his wiki that help deal with this problem, where the sample variance is
computed for the normalized data, and then multiplied by the sample variances in each condition by M(M-1), where M is the
number of within-subject conditions.</p>

<p><a href="http://goo.gl/9rD3P">See his wiki here</a> for more info.</p>

<!-- more -->


<h3>References</h3>

<p>Morey, R. D. (2008). <em>Confidence Intervals from Normalized Data:  
A correction to Cousineau (2005).</em></p>

<p>Cousineau,D. (2005). <em>Confidence intervals in within‐subject
designs:A simpler solution to Loftus and Masson’s
method.</em></p>

<p>Loftus, G.R., &amp; Masson, M.E.J. (1994). <em>Using confidence
intervals in within‐subject designs.</em></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Using Figures within Tables in LaTeX]]></title>
    <link href="http://frenchja.github.com/blog/2012/01/17/using-figures-within-tables-in-latex/"/>
    <updated>2012-01-17T18:23:00-08:00</updated>
    <id>http://frenchja.github.com/blog/2012/01/17/using-figures-within-tables-in-latex</id>
    <content type="html"><![CDATA[<p>By using LaTeX to author APA manuscripts, researchers can address many problems associated with formatting their results
into tables and figures. For example, ANOVA tables can be readily generated using the
<a href="http://cran.r-project.org/web/packages/xtable/index.html"><code>xtable</code></a> package in R, and graphs from
<a href="http://cran.r-project.org/web/packages/ggplot2/index.html"><code>ggplot2</code></a> can be rendered <em>within</em> the manuscript using
<code>Sweave</code> (see <a href="https://en.wikipedia.org/wiki/Sweave">Wikipedia</a>). However, more complicated layouts can be difficult to
achieve.</p>

<p>In order to make test items or stimuli easier to understand, researchers occasionally organize examples in a table or
figure. Using the standard <code>\table</code> command in LaTeX, it&#8217;s possible to include figures in an individual table cell
without breaking the <a href="http://ctan.org/pkg/apa6">APA6.cls</a> package. For example: <!-- more --></p>

<figure class='code'><figcaption><span>Bottom-Aligned Figures in LaTeX Tables</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
</pre></td><td class='code'><pre><code class='latex'><span class='line'><span class="k">\begin</span><span class="nb">{</span>table<span class="nb">}</span>
</span><span class='line'>  [ht] <span class="k">\caption</span><span class="nb">{</span>Stimuli Category Explanations<span class="nb">}</span> <span class="k">\label</span><span class="nb">{</span>tab:stimuli<span class="nb">}</span>
</span><span class='line'>  <span class="k">\begin</span><span class="nb">{</span>tabular<span class="nb">}</span>
</span><span class='line'>      <span class="nb">{</span>lllll<span class="nb">}</span> <span class="k">\hline</span> Category <span class="nb">&amp;</span> Familiar Organism <span class="nb">&amp;</span> Growth Model <span class="nb">&amp;</span> Metamorphosis <span class="nb">&amp;</span> Figure <span class="k">\\</span>
</span><span class='line'>      <span class="k">\hline</span> <span class="k">\textbf</span><span class="nb">{</span>FDM<span class="nb">}</span> <span class="nb">&amp;</span> Yes <span class="nb">&amp;</span> Dramatic <span class="nb">&amp;</span> Yes <span class="nb">&amp;</span>
</span><span class='line'>      <span class="k">\includegraphics</span><span class="na">[width=1in]</span><span class="nb">{</span>&quot;Figure Stimuli&quot;/Fam-Meta-Dramatic<span class="nb">}</span> <span class="k">\\</span>
</span><span class='line'>      FDN <span class="nb">&amp;</span> Yes <span class="nb">&amp;</span> Dramatic <span class="nb">&amp;</span> No <span class="nb">&amp;</span>
</span><span class='line'>      <span class="k">\includegraphics</span><span class="na">[width=1in]</span><span class="nb">{</span>&quot;Figure Stimuli&quot;/Fam-Dramatic<span class="nb">}</span> <span class="k">\\</span>
</span><span class='line'>      FGM <span class="nb">&amp;</span> Yes <span class="nb">&amp;</span> Growth <span class="nb">&amp;</span> Yes <span class="nb">&amp;</span>
</span><span class='line'>      <span class="k">\includegraphics</span><span class="na">[width=1in]</span><span class="nb">{</span>&quot;Figure Stimuli&quot;/Fam-Meta-Growth<span class="nb">}</span> <span class="k">\\</span>
</span><span class='line'>      <span class="k">\textbf</span><span class="nb">{</span>FGN<span class="nb">}</span> <span class="nb">&amp;</span> Yes <span class="nb">&amp;</span> Growth <span class="nb">&amp;</span> No <span class="nb">&amp;</span>
</span><span class='line'>      <span class="k">\includegraphics</span><span class="na">[width=1in]</span><span class="nb">{</span>&quot;Figure Stimuli&quot;/Fam-Growth<span class="nb">}</span> <span class="k">\\</span>
</span><span class='line'>      FIM <span class="nb">&amp;</span> Yes <span class="nb">&amp;</span> Identical <span class="nb">&amp;</span> Yes <span class="nb">&amp;</span>
</span><span class='line'>      <span class="k">\includegraphics</span><span class="na">[width=1in]</span><span class="nb">{</span>&quot;Figure Stimuli&quot;/Fam-Meta-ID<span class="nb">}</span> <span class="k">\\</span>
</span><span class='line'>      FIN <span class="nb">&amp;</span> Yes <span class="nb">&amp;</span> Identical <span class="nb">&amp;</span> No <span class="nb">&amp;</span>
</span><span class='line'>      <span class="k">\includegraphics</span><span class="na">[width=1in]</span><span class="nb">{</span>&quot;Figure Stimuli&quot;/Fam-Identical<span class="nb">}</span> <span class="k">\\</span>
</span><span class='line'>      FSM <span class="nb">&amp;</span> Yes <span class="nb">&amp;</span> Species Change <span class="nb">&amp;</span> Yes <span class="nb">&amp;</span>
</span><span class='line'>      <span class="k">\includegraphics</span><span class="na">[width=1in]</span><span class="nb">{</span>&quot;Figure Stimuli&quot;/Fam-Meta-Species<span class="nb">}</span> <span class="k">\\</span>
</span><span class='line'>      FSN <span class="nb">&amp;</span> Yes <span class="nb">&amp;</span> Species Change <span class="nb">&amp;</span> No <span class="nb">&amp;</span>
</span><span class='line'>      <span class="k">\includegraphics</span><span class="na">[width=1in]</span><span class="nb">{</span>&quot;Figure Stimuli&quot;/Fam-Species<span class="nb">}</span> <span class="k">\\</span>
</span><span class='line'>      <span class="k">\textbf</span><span class="nb">{</span>UDM<span class="nb">}</span> <span class="nb">&amp;</span> No <span class="nb">&amp;</span> Dramatic <span class="nb">&amp;</span> Yes <span class="nb">&amp;</span>
</span><span class='line'>      <span class="k">\includegraphics</span><span class="na">[width=1in]</span><span class="nb">{</span>&quot;Figure Stimuli&quot;/Un2-Meta-Dramatic<span class="nb">}</span> <span class="k">\\</span>
</span><span class='line'>      UDN <span class="nb">&amp;</span> No <span class="nb">&amp;</span> Dramatic <span class="nb">&amp;</span> No <span class="nb">&amp;</span>
</span><span class='line'>      <span class="k">\includegraphics</span><span class="na">[width=1in]</span><span class="nb">{</span>&quot;Figure Stimuli&quot;/Un-Dramatic<span class="nb">}</span> <span class="k">\\</span>
</span><span class='line'>      UGM <span class="nb">&amp;</span> No <span class="nb">&amp;</span> Growth <span class="nb">&amp;</span> Yes <span class="nb">&amp;</span>
</span><span class='line'>      <span class="k">\includegraphics</span><span class="na">[width=1in]</span><span class="nb">{</span>&quot;Figure Stimuli&quot;/Un2-Meta-Growth<span class="nb">}</span> <span class="k">\\</span>
</span><span class='line'>      <span class="k">\textbf</span><span class="nb">{</span>UGN<span class="nb">}</span> <span class="nb">&amp;</span> No <span class="nb">&amp;</span> Growth <span class="nb">&amp;</span> No <span class="nb">&amp;</span>
</span><span class='line'>      <span class="k">\includegraphics</span><span class="na">[width=1in]</span><span class="nb">{</span>&quot;Figure Stimuli&quot;/Un-Growth<span class="nb">}</span> <span class="k">\\</span>
</span><span class='line'>      UIM <span class="nb">&amp;</span> No <span class="nb">&amp;</span> Identical <span class="nb">&amp;</span> Yes <span class="nb">&amp;</span>
</span><span class='line'>      <span class="k">\includegraphics</span><span class="na">[width=1in]</span><span class="nb">{</span>&quot;Figure Stimuli&quot;/Un2-Meta-ID<span class="nb">}</span> <span class="k">\\</span>
</span><span class='line'>      UIN <span class="nb">&amp;</span> No <span class="nb">&amp;</span> Identical <span class="nb">&amp;</span> No <span class="nb">&amp;</span>
</span><span class='line'>      <span class="k">\includegraphics</span><span class="na">[width=1in]</span><span class="nb">{</span>&quot;Figure Stimuli&quot;/Un-Identical<span class="nb">}</span> <span class="k">\\</span>
</span><span class='line'>      USM <span class="nb">&amp;</span> No <span class="nb">&amp;</span> Species Change <span class="nb">&amp;</span> Yes <span class="nb">&amp;</span>
</span><span class='line'>      <span class="k">\includegraphics</span><span class="na">[width=1in]</span><span class="nb">{</span>&quot;Figure Stimuli&quot;/Un2-Meta-Species<span class="nb">}</span> <span class="k">\\</span>
</span><span class='line'>      USN <span class="nb">&amp;</span> No <span class="nb">&amp;</span> Species Change <span class="nb">&amp;</span> No <span class="nb">&amp;</span>
</span><span class='line'>      <span class="k">\includegraphics</span><span class="na">[width=1in]</span><span class="nb">{</span>&quot;Figure Stimuli&quot;/Un-Species<span class="nb">}</span> <span class="k">\\</span>
</span><span class='line'>      USM <span class="nb">&amp;</span> No <span class="nb">&amp;</span> Species Change <span class="nb">&amp;</span> Yes <span class="nb">&amp;</span>
</span><span class='line'>      <span class="k">\includegraphics</span><span class="na">[width=1in]</span><span class="nb">{</span>&quot;Figure Stimuli&quot;/Un2-Meta-Species<span class="nb">}</span> <span class="k">\\</span>
</span><span class='line'>      <span class="k">\hline</span>
</span><span class='line'>  <span class="k">\end</span><span class="nb">{</span>tabular<span class="nb">}</span>
</span><span class='line'>  <span class="k">\tabfnt</span><span class="nb">{</span>Note: Bold categories are biologically correct growth models.<span class="nb">}</span>
</span><span class='line'><span class="k">\end</span><span class="nb">{</span>table<span class="nb">}</span>
</span></code></pre></td></tr></table></div></figure>


<h2>Center-Aligned Figures</h2>

<p>However, the above code vertically aligned my images according to their bottom-edge, producing an awkward looking table.
Instead, we want the figures to be vertically centered. A Google search revealed the <a href="https://en.wikibooks.org/wiki/LaTeX/Tables#Vertically_centered_images">LaTeX
Wikibook</a>, which suggests a few methods to force
figures to vertically align according to their center. Below, I surround each <code>\includegraphics{}</code> command with the
<code>\parbox{}</code> command, which centers it along 1 unit of measurement, set to 12 pts. in my apa6 class options.</p>

<figure class='code'><figcaption><span>Center-Aligned Figures in LaTeX Tables  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
</pre></td><td class='code'><pre><code class='latex'><span class='line'><span class="k">\begin</span><span class="nb">{</span>table<span class="nb">}</span>
</span><span class='line'>  [ht] <span class="k">\caption</span><span class="nb">{</span>Stimuli Category Explanations<span class="nb">}</span> <span class="k">\label</span><span class="nb">{</span>tab:stimuli<span class="nb">}</span>
</span><span class='line'>  <span class="k">\begin</span><span class="nb">{</span>tabular<span class="nb">}</span>
</span><span class='line'>      <span class="nb">{</span>lllll<span class="nb">}</span> <span class="k">\hline</span> Stimuli Category <span class="nb">&amp;</span> Familiar Organism <span class="nb">&amp;</span> Growth Model <span class="nb">&amp;</span> Metamorphosis <span class="nb">&amp;</span> Figure <span class="k">\\</span>
</span><span class='line'>      <span class="k">\hline</span> <span class="k">\textbf</span><span class="nb">{</span>FDM<span class="nb">}</span> <span class="nb">&amp;</span> Yes <span class="nb">&amp;</span> Dramatic <span class="nb">&amp;</span> Yes <span class="nb">&amp;</span> <span class="k">\parbox</span><span class="na">[c]</span><span class="nb">{</span>1em<span class="nb">}{</span>
</span><span class='line'>      <span class="k">\includegraphics</span><span class="na">[width=1in]</span><span class="nb">{</span>&quot;Figure Stimuli&quot;/Fam-Meta-Dramatic<span class="nb">}}</span> <span class="k">\\</span>
</span><span class='line'>      FDN <span class="nb">&amp;</span> Yes <span class="nb">&amp;</span> Dramatic <span class="nb">&amp;</span> No <span class="nb">&amp;</span> <span class="k">\parbox</span><span class="na">[c]</span><span class="nb">{</span>1em<span class="nb">}{</span>
</span><span class='line'>      <span class="k">\includegraphics</span><span class="na">[width=1in]</span><span class="nb">{</span>&quot;Figure Stimuli&quot;/Fam-Dramatic<span class="nb">}}</span> <span class="k">\\</span>
</span><span class='line'>      FGM <span class="nb">&amp;</span> Yes <span class="nb">&amp;</span> Growth <span class="nb">&amp;</span> Yes <span class="nb">&amp;</span> <span class="k">\parbox</span><span class="na">[c]</span><span class="nb">{</span>1em<span class="nb">}{</span>
</span><span class='line'>      <span class="k">\includegraphics</span><span class="na">[width=1in]</span><span class="nb">{</span>&quot;Figure Stimuli&quot;/Fam-Meta-Growth<span class="nb">}}</span> <span class="k">\\</span>
</span><span class='line'>      <span class="k">\textbf</span><span class="nb">{</span>FGN<span class="nb">}</span> <span class="nb">&amp;</span> Yes <span class="nb">&amp;</span> Growth <span class="nb">&amp;</span> No <span class="nb">&amp;</span> <span class="k">\parbox</span><span class="na">[c]</span><span class="nb">{</span>1em<span class="nb">}{</span>
</span><span class='line'>      <span class="k">\includegraphics</span><span class="na">[width=1in]</span><span class="nb">{</span>&quot;Figure Stimuli&quot;/Fam-Growth<span class="nb">}}</span> <span class="k">\\</span>
</span><span class='line'>      FIM <span class="nb">&amp;</span> Yes <span class="nb">&amp;</span> Identical <span class="nb">&amp;</span> Yes <span class="nb">&amp;</span> <span class="k">\parbox</span><span class="na">[c]</span><span class="nb">{</span>1em<span class="nb">}{</span>
</span><span class='line'>      <span class="k">\includegraphics</span><span class="na">[width=1in]</span><span class="nb">{</span>&quot;Figure Stimuli&quot;/Fam-Meta-ID<span class="nb">}}</span> <span class="k">\\</span>
</span><span class='line'>      FIN <span class="nb">&amp;</span> Yes <span class="nb">&amp;</span> Identical <span class="nb">&amp;</span> No <span class="nb">&amp;</span> <span class="k">\parbox</span><span class="na">[c]</span><span class="nb">{</span>1em<span class="nb">}{</span>
</span><span class='line'>      <span class="k">\includegraphics</span><span class="na">[width=1in]</span><span class="nb">{</span>&quot;Figure Stimuli&quot;/Fam-Identical<span class="nb">}}</span> <span class="k">\\</span>
</span><span class='line'>      FSM <span class="nb">&amp;</span> Yes <span class="nb">&amp;</span> Species Change <span class="nb">&amp;</span> Yes <span class="nb">&amp;</span> <span class="k">\parbox</span><span class="na">[c]</span><span class="nb">{</span>1em<span class="nb">}{</span>
</span><span class='line'>      <span class="k">\includegraphics</span><span class="na">[width=1in]</span><span class="nb">{</span>&quot;Figure Stimuli&quot;/Fam-Meta-Species<span class="nb">}}</span> <span class="k">\\</span>
</span><span class='line'>      FSN <span class="nb">&amp;</span> Yes <span class="nb">&amp;</span> Species Change <span class="nb">&amp;</span> No <span class="nb">&amp;</span> <span class="k">\parbox</span><span class="na">[c]</span><span class="nb">{</span>1em<span class="nb">}{</span>
</span><span class='line'>      <span class="k">\includegraphics</span><span class="na">[width=1in]</span><span class="nb">{</span>&quot;Figure Stimuli&quot;/Fam-Species<span class="nb">}}</span> <span class="k">\\</span>
</span><span class='line'>      <span class="k">\textbf</span><span class="nb">{</span>UDM<span class="nb">}</span> <span class="nb">&amp;</span> No <span class="nb">&amp;</span> Dramatic <span class="nb">&amp;</span> Yes <span class="nb">&amp;</span> <span class="k">\parbox</span><span class="na">[c]</span><span class="nb">{</span>1em<span class="nb">}{</span>
</span><span class='line'>      <span class="k">\includegraphics</span><span class="na">[width=1in]</span><span class="nb">{</span>&quot;Figure Stimuli&quot;/Un2-Meta-Dramatic<span class="nb">}}</span> <span class="k">\\</span>
</span><span class='line'>      UDN <span class="nb">&amp;</span> No <span class="nb">&amp;</span> Dramatic <span class="nb">&amp;</span> No <span class="nb">&amp;</span> <span class="k">\parbox</span><span class="na">[c]</span><span class="nb">{</span>1em<span class="nb">}{</span>
</span><span class='line'>      <span class="k">\includegraphics</span><span class="na">[width=1in]</span><span class="nb">{</span>&quot;Figure Stimuli&quot;/Un-Dramatic<span class="nb">}}</span> <span class="k">\\</span>
</span><span class='line'>      UGM <span class="nb">&amp;</span> No <span class="nb">&amp;</span> Growth <span class="nb">&amp;</span> Yes <span class="nb">&amp;</span> <span class="k">\parbox</span><span class="na">[c]</span><span class="nb">{</span>1em<span class="nb">}{</span>
</span><span class='line'>      <span class="k">\includegraphics</span><span class="na">[width=1in]</span><span class="nb">{</span>&quot;Figure Stimuli&quot;/Un2-Meta-Growth<span class="nb">}}</span> <span class="k">\\</span>
</span><span class='line'>      <span class="k">\textbf</span><span class="nb">{</span>UGN<span class="nb">}</span> <span class="nb">&amp;</span> No <span class="nb">&amp;</span> Growth <span class="nb">&amp;</span> No <span class="nb">&amp;</span> <span class="k">\parbox</span><span class="na">[c]</span><span class="nb">{</span>1em<span class="nb">}{</span>
</span><span class='line'>      <span class="k">\includegraphics</span><span class="na">[width=1in]</span><span class="nb">{</span>&quot;Figure Stimuli&quot;/Un-Growth<span class="nb">}}</span> <span class="k">\\</span>
</span><span class='line'>      UIM <span class="nb">&amp;</span> No <span class="nb">&amp;</span> Identical <span class="nb">&amp;</span> Yes <span class="nb">&amp;</span> <span class="k">\parbox</span><span class="na">[c]</span><span class="nb">{</span>1em<span class="nb">}{</span>
</span><span class='line'>      <span class="k">\includegraphics</span><span class="na">[width=1in]</span><span class="nb">{</span>&quot;Figure Stimuli&quot;/Un2-Meta-ID<span class="nb">}}</span> <span class="k">\\</span>
</span><span class='line'>      UIN <span class="nb">&amp;</span> No <span class="nb">&amp;</span> Identical <span class="nb">&amp;</span> No <span class="nb">&amp;</span> <span class="k">\parbox</span><span class="na">[c]</span><span class="nb">{</span>1em<span class="nb">}{</span>
</span><span class='line'>      <span class="k">\includegraphics</span><span class="na">[width=1in]</span><span class="nb">{</span>&quot;Figure Stimuli&quot;/Un-Identical<span class="nb">}}</span> <span class="k">\\</span>
</span><span class='line'>      USM <span class="nb">&amp;</span> No <span class="nb">&amp;</span> Species Change <span class="nb">&amp;</span> Yes <span class="nb">&amp;</span> <span class="k">\parbox</span><span class="na">[c]</span><span class="nb">{</span>1em<span class="nb">}{</span>
</span><span class='line'>      <span class="k">\includegraphics</span><span class="na">[width=1in]</span><span class="nb">{</span>&quot;Figure Stimuli&quot;/Un2-Meta-Species<span class="nb">}}</span> <span class="k">\\</span>
</span><span class='line'>      USN <span class="nb">&amp;</span> No <span class="nb">&amp;</span> Species Change <span class="nb">&amp;</span> No <span class="nb">&amp;</span> <span class="k">\parbox</span><span class="na">[c]</span><span class="nb">{</span>1em<span class="nb">}{</span>
</span><span class='line'>      <span class="k">\includegraphics</span><span class="na">[width=1in]</span><span class="nb">{</span>&quot;Figure Stimuli&quot;/Un-Species<span class="nb">}}</span> <span class="k">\\</span>
</span><span class='line'>      USM <span class="nb">&amp;</span> No <span class="nb">&amp;</span> Species Change <span class="nb">&amp;</span> Yes <span class="nb">&amp;</span> <span class="k">\parbox</span><span class="na">[c]</span><span class="nb">{</span>1em<span class="nb">}{</span>
</span><span class='line'>      <span class="k">\includegraphics</span><span class="na">[width=1in]</span><span class="nb">{</span>&quot;Figure Stimuli&quot;/Un2-Meta-Species<span class="nb">}}</span> <span class="k">\\</span>
</span><span class='line'>      <span class="k">\hline</span>
</span><span class='line'>  <span class="k">\end</span><span class="nb">{</span>tabular<span class="nb">}</span>
</span><span class='line'>  <span class="k">\tabfnt</span><span class="nb">{</span>Note: Bold categories are biologically correct growth models.<span class="nb">}</span>
</span><span class='line'><span class="k">\end</span><span class="nb">{</span>table<span class="nb">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Output:
<img class="center" src="http://frenchja.github.com/images/origins.png" title="'Broken LaTeX Table'" ></p>

<p>By using <code>\parbox</code>, figures are now vertically aligned with text cells. However, with the addition of figures the table
is too long and we must span the table across 2-pages. To solve this, split the information across two tables. In this
case, I can split by the <strong>stimuli category</strong>.</p>

<p>Alternatively, <a href="http://www.edpsych.net/brian/">Brian Beitzel</a> also pointed out that we can invoke
<a href="http://tug.ctan.org/pkg/longtable"><code>longtable</code></a> as a class option in <a href="http://ctan.org/pkg/apa6">APA6.cls</a>, which allows
tables to span multiple pages.</p>
]]></content>
  </entry>
  
</feed>
