{"id":747,"date":"2017-02-05T11:46:37","date_gmt":"2017-02-05T16:46:37","guid":{"rendered":"http:\/\/www.clayford.net\/statistics\/?p=747"},"modified":"2023-08-20T18:18:19","modified_gmt":"2023-08-20T22:18:19","slug":"revisiting-some-old-r-code","status":"publish","type":"post","link":"https:\/\/www.clayford.net\/statistics\/revisiting-some-old-r-code\/","title":{"rendered":"Revisiting some old R-code"},"content":{"rendered":"<p><a href=\"http:\/\/www.clayford.net\/statistics\/stabilization-simulation-of-relative-frequency\/\">One of my first blog posts<\/a> on this site simulated rolling a die 6 times and observing if side <em>i<\/em> was observed on the <em>i<sup>th<\/sup><\/em> roll at least once. (For example, rolling a 3 on my 3rd roll would be a success.) I got the idea from one of my statistics textbooks which had a nice picture of the simulation converging to the true probability of 0.665 over the course of 500 trials. I was able to recreate the simulation in R and I guess I got excited and blogged about it. I was reminded of this today when I opened that old textbook and came across the R code that I had actually <em>written in the margin by hand<\/em>. Apparently I was super proud of my ground-breaking R code and decided to preserve it for posterity in writing. smh<\/p>\n<p>Over 5 years later my precious R code looks pretty juvenile. It&#8217;s way more complicated than it needs to be and doesn&#8217;t take advantage of R&#39;s vectorized calculations. As Venables and Ripley say in <a href=\"http:\/\/www.stats.ox.ac.uk\/pub\/MASS4\/\">MASS<\/a>, &ldquo;Users coming to S from other languages are often slow to take advantage of the power of S to do vectorized calculations&hellip;This often leads to unnecessary loops.&rdquo; Indeed. I&#39;m living proof of that. <\/p>\n<p>I shouldn&#8217;t be too hard on my myself though. I was not yet familiar with functions like <code>replicate<\/code> and <code>cumsum<\/code>. And I was more focused on recreating the plot than writing optimal R code. I went with what I knew. And R, so forgiving and flexible, accommodated my novice enthusiasm.<\/p>\n<p>Here is how I would approach the problem today:<\/p>\n<pre><code class=\"r\">r.out &lt;- replicate(n = 500, any(sample(1:6, size = 6, replace = T) == 1:6))\r\np.out &lt;- cumsum(r.out)\/seq(500)\r\nplot(x = seq(500), y = p.out, type = &quot;l&quot;, ylim = c(0,1), \r\n     main = &quot;Convergence to probability as n increases&quot;, xlab = &quot;n&quot;)\r\nabline(h = 0.665)\r\n<\/code><\/pre>\n<p><img decoding=\"async\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAfgAAAH4CAMAAACR9g9NAAAAflBMVEUAAAAAADoAAGYAOjoAOpAAZpAAZrY6AAA6ADo6AGY6OmY6OpA6kNtmAABmADpmAGZmOgBmZjpmtv+QOgCQOjqQOmaQZgCQkGaQtpCQ29uQ2\/+2ZgC2tma2\/7a2\/9u2\/\/\/bkDrb25Db\/7bb\/9vb\/\/\/\/tmb\/25D\/\/7b\/\/9v\/\/\/+hcrm9AAAACXBIWXMAAAsSAAALEgHS3X78AAAN9UlEQVR4nO2dDXviuBVGldk0dDuw28K03Ya2Ybfhw\/\/\/D9ayZeMvwEbCEnnPeZ4JE9u6Nj6WdCVibDKQxMQ+AIgD4kVBvCiIFwXxoiBeFMSLgnhREC8K4kVBvCiIFwXxoiBeFMSLgnhREC8K4kVBvCiIFwXxoiBeFMSLgnhREC9KLPHHlTFm+dh9bNfjtjttvn0MLziuvn1U\/8bHc5SFUiWS+L0peHvkPrbGW7yl9jc63lMQR\/xpY2v7zry8259F1c9P9r+Nyc\/xtrgcip921dquevlbvmle6Nt\/Vq+fjeWuiI1XvFZryl2YKsay2qvb3gVs79oGttdjvrxe0Kjx\/7Xx\/mSviL2L5zbODgu38+YRZeUV0zvE5q7XQ0GqFY2oDyGO+MPCnubTZm0Nl1W\/EGX\/sy\/PeH42ylXLctXr\/+zPn2zB1vJz2eKiMZVnJ74KXy+yQsuAn51dv34W\/U+1vlzQFv+2y6VsrSjXWTUKNfZQ7q4U3znE1q6X\/SDdFQ9TEEf8vu7eD4v8NFrNRSOwL856vsT+p7g6bKubr3qzW+Zmd53lS7dlIX1drylC26a5Dm8XFNvnZ3RdBWzuutrI6SoXtPr4Mt5bsx+wy8uLuKQ+olak5iFWu24caDNIvaIZ9SHEFr8vqsfOnpFCQ\/52d\/lKe5JdHmDFWCfFlnaD9vJyybnxdU1nlrkYLrxdUJ7pPHwjYLnrInWzG9mKVjTQ5YKe+NPm9Y9VlZmUGxd1s27qqzeRVeI7h1jtuj7QdpB6RTPqQ4jd1LfPfnHO8h9\/rJon4bJ4V2TvGldf8bZfvS4+2738tli69+D6l+I\/VZtSvYms7uPbh9gR3w1yfgeNqA8hjvj8enbJXaO9rc\/Z9uWfdnXd2pUnq93Ul8tdEbdq2W4frzX1ZcBuU2\/bGhvrclNvfTgb1cb1vrJr4qtDrHbtDrQbpP8OHkX04dw5w6rPWXVyt3UuZn89dZI7u9wV6SR37txtryR3jfiN5K48qjolayV3H2W8fJULX21cV9rsmvhzctd6a70g1Ypm1IcQfwJnZ6oxVX3Ots7UtrToTlZexA3n6uXnRsKcr5WqzuTnrsgYOsO5c8D+cC4vvizb\/t5w7sPF29aTD27jolF2rcBl8dUhVruuDrQXpFrRiPoQnmzKdu8zwulN1NzD7otM4zyP+HJk6zPNG0J8kIsnBZ5HfNmp+kzyBpC2M1+kwj+TeAgJ4kVBvCiIFwXxoiBeFMSLgnhREC8K4kVBvCiIFwXxoiBeFMSLgnhREC8K4kVBvCiIF8VHvIGUeaB4j7LwaBAvCuJFQbwoiBfFW3x5w+7QHbuITxlf8cU3FOXs+7epIj5lfMUff\/1ovU4pCxGhxovi3ce7+9Lp458MsnpREC9KKPGN5G7kxwAQFWq8KIgXBfGiIF4U75m7lcvk+gN5xKeMd40\/bS59pyDiU8a\/qT\/+cuErVRGfMvTxoiBeFMSLgnhREC8K4kVBvCiIFwXxoiBeFMSLgnhREC8K4kVBvCiIFwXxoiBeFMSLgnhREC8K4kVBvCiIFwXxoiBeFMSLgnhREC8K4kVBvCiIFwXxoiBeFMSLgnhREC8K4kVBvCiIFwXxoiBeFMSLgnhRoonnsogL4kWJJZ5nVEUG8aIgXpRI4g19fGQQLwriRYkj3jCciw3iRfEWf1iYt93Q8wYRnzS+4k8\/3rPdW+7\/++f4smZMZHgovuLtc+N3y9bz42+XRXx8qPGihOjjl1P7eMTHJ0pWj\/j4IF6UUOIbyZ2puBqVEV1cYtZ4xEcE8aKEyOotU7J6434gPiLe4\/jNunjdv44fxxv3E\/ERCTFz13wdU9aJN1T6iESs8YZKHxHvPv64uq+PL8Tzl3fRiJDVm\/oF8fFAvCjxxGck9jFBvChRxTOciwfiRZlfvBmxDTwcxIuCeFHmFG\/6n8kxXR8LxIsSWTyTd7FAvCiIFyW6eDr5OCBelNjiM9zHAfGiJCGeBG9+EhBPZh8DxIuShHj6+PmZXfxARMRHIAXxZPURmFF8ccvUcHeO+NlJSLxp\/nI7MheLF+mIr9ZcS\/HNeQtGAn6kIb7o\/seKNxeHBzCehMS7mnxtn6ZWjnhPkhFf1flr4qsbq6ufcD\/zir84LV+Lv1yTTWM4SHbnTUriyy0u7NO1Fc3ymPdgdvGXtm2KH5zd61dzxHuQiPh6iHYeqbW2HOzTTWctF8IEkhFfbzPYJ1wcC5SFzDnxg3GkJr7a1PRr\/KVCpo5MPzCeOcVnXZ0Xy5hOmnftcmn2C+cCfMZ\/g8TEN8o2W\/ub4jvbMdy7yVOIvz6lM7BPxN\/kkeIhZR4ovvf7tH7XZN2ee8w+mrPCppPr9+IJtwwJi29P0I4t0m\/8TXNV4+s0jWuUNM0nLb762MaL8yc7WdUclLpNFR3xk1dPKnuP+An54LUwJssa9TzrJoVfYujneu5W793r5YZWDUfzOZLe73ec4JtZyNgwV9c+\/Xeot1qvUdlc6uID2bgZpXT\/RFW\/1nkjR7\/UWYqIH7uvwb215gNvX0LGVGljd955TPFRnAPdHTB58TMzcIT1kLD6LGhw6+oTZdfW1gvPY4ogmaoJdfkgvkPvGEtdnXnE1sjQuI8Th400RhMu\/riz0Bh5VIFCjj0R36Uz\/2N6i+vRfz0yvD7H1P+k8drDOeqeu9rnOVkPevbmFe8RbUZMY27njrxoRIH2nQFVg9FoxXuTUMFPHeIHCJeFjdjPuT7PeoIQH5dopwTxoniLPyzWp40x\/cfOIT5pfMXbBw5u17n\/7zcfOIj4lPAVf\/z14\/TjfdQjRhGfEt5NfV7d98ss27\/dLIv4lPBP7rbFiKTvHfFJQ1YvCuJFCSW+kdxd+jtOxKfErDUe0gHxogSYuSua9W+9YTzikybEzJ1l35+zRXzKBJi5a71eKYv4lKDGi+Ldxx9X9PHPCFm9KIgXBfGiIF4UxIuCeFEQLwriRUG8KIgXBfGiIF4UxIsySnz5YfvAR+6TQiM+JUaIdx+8Dt4YOSU04lNiQo33DY34lKCPF2Vcjb\/4VzZTQiM+JSbU+N3SLzTiU2KCeLL6r8QE8Xua+i\/ElD5+7Rca8SlBVi8K4kUZJ95+odnUiTvEJ80o8aeNHcntmLL9QvAhjSjUeFHo40UhqxcF8aIwVy8KNV4UxIsyIasf+J7iSaERnxJTxvETzSM+ZZi5E2VcU19Udmr8V2LKH2JM\/HNLxKcMWb0oiBcF8aIgXhTEi4J4URAvCuJFQbwoiBcF8aIgXhTEi4J4URAvShjxh58HPqhHfMr4ir\/yNxqITxnvGn9c5cqp8U9HgKb+uHr9HfHPRpA+\/rAY+mM8xKcMWb0oiBcllPjG3Ram4t5YMAPUeFEQL4q3+MPi0j02iE8ZX\/GnTfkNt\/v+VyMhPmW8p2xdUjdwKy3iU4YaL0qAuXr6+GeErF4UxIuCeFEQLwriRUG8KIgXBfGiIF4UxIuCeFEQLwriRUG8KIgXBfGiIF4UxIuCeFEQLwriRUG8KIgXBfGiIF4UxIuCeFEQLwriRUG8KIgXBfGiIF4UxIuCeFEQLwriRUG8KIgXBfGiIF4UxIuCeFHmE4\/3pEC8KIgXBfGiIF4UxIuCeFEQLwriRUG8KN7iDwvz8j7muXOITwpf8fa5c6fNEvHPhq\/4Uvj2DfFPRogan7P76WfEPxXeffxxtbQvu\/6jJhGfMmT1oiBelFDiG8mdqbgzFMwBNV4UxIsSYuZu3PPjEZ8Ugcbx2f7180ZZxCdFmJk75uqfDmq8KAFm7ujjnxGyelEQLwriRUG8KIgXBfGiIF4UxIuCeFEQLwriRUG8KIgXBfGiIF4UxIuCeFEQLwriRUG8KIgXBfGiIF4UxIuCeFEQLwriRUG8KIgXBfGiIF4UxIuCeFEQLwriRUG8KIgXBfGiIF4UxIuCeFEQLwriRUG8KIgXBfGiIF4UxIuCeFEQLwriRUG8KIgXBfGieIvnEaPPia94Hjj4pPiK5xGjTwo1XhTvPp5HjD4nZPWiIF6UUOIbyZ2puDMUzMF8NR6SAvGizDdzB0kx3zgekmK+mTtICmq8KPPN3EFSkNWLgnhREC8K4kVBvCiIF+WR4iFlHif+UZEINkMwxIsGQ7xoMMSLBkO8aDDEiwZDvGgwJmFEQbwoiBcF8aIgXhTEi4J4URAvCuJFQbwogcQfV6Z\/p80dHH7+qIN5xrQ3e65DBduXd5SECeZuTwoTbGeKQ5scLIx4+0Z2b\/5x9vY9uGCeMY+\/vGeHP7+HCWavx3MU\/3e7yy\/JQMG2xR1u04OFEW\/vqCwqqx\/bl9\/yIC6YZ8y9ff\/bdZhglnMU72CHv\/x1Hehtnn6825fpwcKIP3z\/LKqYf6D8qF2wADHPUQIEy2tSoGCnH\/\/Ka2aYYMWdjfcECyPe3kobTLwL5h\/ztFkGC3ZYvLyHCrZb2iY5TLC8N7O1fnqwL1zjj6tllmLzkRc\/BavxBdt1rBofqI8vxQfqSQ+LdXZP53eRUAnDrvir92XkIwuV1S+DZPXFUbtgnjFL74GCuSY0TLCsTMLDHdnp7x\/Tg33ZcXxZr9bhRst5H5\/oOP6uI2PmThTEi4J4URAvCuJFQbwoiBcF8aIgXhTEi4J4URAvCuJFQbwoiBcF8aIgXhTEi4J4URAvCuJFQbwoiC84fP9HcVO1DogvOCyWQ8\/S\/MIgvqC4Zy\/EPWBPA+ILEC8K4kVBvCiIBxEQLwriRUG8KIgXBfGiIF4UxIuCeFEQLwriRUG8KIgXBfGiIF4UxIuCeFEQL8r\/ARU84ZKsb\/\/GAAAAAElFTkSuQmCC\" alt=\"plot of chunk unnamed-chunk-9\"\/><\/p>\n<p>On line 1, we use the <code>sample<\/code> function to &ldquo;roll a die 6 times&rdquo; by sampling the numbers 1 &#8211; 6, with replacement, 6 times. Then we compare the 6 results with the vector of numbers 1 &#8211; 6 using the <code>==<\/code> operator and use the <code>any<\/code> function to check if any are TRUE. Next we <code>replicate<\/code> that 500 times and store the result in <code>r.out<\/code>. This is a vector of TRUE\/FALSE values which R treats numerically as 1 and 0. This means we can use <code>cumsum<\/code> to find the cumulative sum of successes. To determine the cumulative proportion of successes, we divide each cumulative sum by the trial number. The result is a vector of proportions that should start converging to 0.665. Finally we plot using base R <code>plot<\/code> and <code>abline<\/code>.<\/p>\n<p>This is more efficient than my original attempt 5 years ago and better captures the spirit of the simulation. I&#39;m sure 5 years from now if I stumble upon this post I&#39;ll have yet <em>another<\/em> more elegant way to do it. I&#39;m already looking at it thinking, &ldquo;I should have generalized this with a function, and used ggplot2 to make the graph. And I shouldn&#39;t do <code>seq(500)<\/code> twice.&rdquo; In fact I know I could have avoided the <code>replicate<\/code> function by using the fact that there&#39;s a probability of \\(\\frac{1}{6}\\) of observing side <em>i<\/em> on the <em>i<sup>th<\/sup><\/em> roll of a die. So I could have used a single <code>rbinom<\/code> call to do the simulation, like so:<\/p>\n<pre><code class=\"r\">r.out2 &lt;- cumsum(rbinom(n = 500, size = 6, prob = 1\/6) &gt; 0)\r\np.out2 &lt;- r.out2\/seq(500)\r\nplot(x = seq(500), y = p.out2, type = &quot;l&quot;, ylim = c(0,1),\r\n     main = &quot;Convergence to probability as n increases&quot;, xlab = &quot;n&quot;)\r\nabline(h = 0.665)\r\n<\/code><\/pre>\n<p><img decoding=\"async\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAfgAAAH4CAMAAACR9g9NAAAAflBMVEUAAAAAADoAAGYAOjoAOpAAZpAAZrY6AAA6ADo6AGY6OmY6OpA6kNtmAABmADpmAGZmOgBmZjpmtv+QOgCQOjqQOmaQZgCQkGaQtpCQ29uQ2\/+2ZgC2tma2\/7a2\/9u2\/\/\/bkDrb25Db\/7bb\/9vb\/\/\/\/tmb\/25D\/\/7b\/\/9v\/\/\/+hcrm9AAAACXBIWXMAAAsSAAALEgHS3X78AAAN8UlEQVR4nO2dDXujuBVGlZk07nTs3daZttu4bbzb+IP\/\/weLQAJssAciAcLvOc9unAF0+ThIuihgTAaSmLk3AOYB8aIgXhTEi4J4URAvCuJFQbwoiBcF8aIgXhTEi4J4URAvCuJFQbwoiBcF8aIgXhTEi4J4URAvCuJFQbwoiBdlLvGnjTFmPe46dtt+y51fv7x3Tzhtvrz7\/\/vHc5SFUmUm8QdT8DLmOnYmWLyl8tc73iKYR\/z51db2vXl6sz+Lqp8f7H8bkx\/jXXE6FD\/trK2d9fS3fNG80Jf\/bJ4\/GtNdERuv+PRzylUYH2Pt1+qWdwEvV20D2\/Mxn15NaNT4\/9p4f7JnxMHFcwtnx5VbeXOLsvKMaW1ic9XbriB+RiPqKMwj\/riyh\/n8urWGy6pfiLK\/HMojnh+Ncta6nPX8P\/vzqy14Mb0uW5w0xnt24n34apIVWgb8uFr180fR\/\/j55YRL8S\/7XMrOinKdVaNQYw3l6krxV5t4sep1O8j1jNEUzCP+UHXvx1V+GK3mohE4FEc9n2J\/Kc4O2+rms17skrnZ\/dX0tVuykL6t5hShbdNchbcTiuXzI7r1AZur9gs5XeWEiz6+jPfS7Afs9PIkLqm26CJScxP9qhsb2gxSzWhGHYW5xR+K6rG3R6TQkO\/uPp9pD7LLA6wY66RY0i5wOb2cUje+runMMhfDhbcTyiOdh28ELFddpG52IVvRiga6nNASf359\/mPjM5Ny4aJuVk2934nMi7\/aRL\/qakMvg1QzmlFHYe6m\/vLoF8cs\/\/HHpnkQbot3RQ6ucQ0Vb\/vV++Kz\/dNvq7XbB9e\/FL\/4NsXvRFb18ZebeCX+Oki9B42oozCP+Px8dsldo72tjtnu6Z92dtXalQfrsqkvp7sibtb6sn2819SXAa+betvW2Fi3m3rrw9nwC1fryu6J95voV+029DpIew\/GYvbLuTrDqo6ZP7i7Khez\/zxfJXd2uityldy5Y7e7k9w14jeSu3KrqpTsIrl7L+Pls1x4v3BVabN74uvk7mLXWkH8jGbUUZh\/AGdv\/DVVdcx2ztSutOgOVl7EXc5V0+tGwtTniq8z+bErMoary7k6YPtyLi++Ltv+1uXcu4u3qwYf3MJFo+xagdvi\/Sb6VfsNbQXxMxpRR2FhQ7aHkCuc1kDNZ9g\/yDDOcsSXV7Yhw7wxxEc5eVJgOeLLTjVkkDeCtL15kAq\/JPEQE8SLgnhREC8K4kVBvCiIFwXxoiBeFMSLgnhREC8K4kVBvCiIFwXxoiBeFMSLgnhREC9KiHgDKTOi+ICyMDaIFwXxoiBeFMSLEiy+fGC364ldxKdMqPjiG4pyDu3HVBGfMqHiT7++X3wOKQszQo0XJbiPd8+l08cvDLJ6URAvSizxjeSu558BYFao8aIgXhTEi4J4UYJH7jYuk2tfyCM+ZYJr\/Pn11ncKIj5lwpv60y83vlIV8SlDHy8K4kVBvCiIFwXxoiBeFMSLgnhREC8K4kVBvCiIFwXxoiBeFMSLgnhREC8K4kVBvCiIFwXxoiBeFMSLgnhREC8K4kVBvCiIFwXxoiBeFMSLgnhREC8K4kVBvCiIFwXxoiBeFMSLgnhREC8K4kVBvCiIFwXxoiBeFMSLgnhREC8K4kVBvCiIFwXxoiBelGDxx5V52Xe9bxDxSRMq\/vzjLdu\/5P6\/fwwuCzMSKt6+N36\/vnh\/fO+yMCPUeFFi9PFr+vjlQVYvCuJFiSW+kdwZz+e3CkaHGi8K4kWJkdVbyOoXRvB1\/Ou2+Dw8cx2\/KGKM3DU\/h5SFGaHGixLcx5829PFLhKxeFMSLgnhREC8K4kVBvCiIFwXxoiBelInFG\/8fp8XMIF4UxIsyl\/gx7sjjXBrA44jn7s5BLF68cdEMNX4QCxdf3sZtMsQPZeniiyrvpTdiVvE5G7qZR7wxEcxXddw0plS\/mfGSyIcgNfH9V1j2692lfbdvDEnfDeYQXwgZLv6yF+\/s003W0RDcb11UT40ZxBsv\/sYCd+I1XN5apjtumQK0k0CXHN6M97gkJv6OgUaR26JMZ0PgVlr9zHzfX7cOiB80e3BZU\/n7jPi6Eb+11J3pjaJuA5q23ckwdH+X20vMJr6zlt25GL\/wFsr1xV\/mG5QeoRvXjsadwEu0P7V480nxVe8+WnfsbN6WaCrPZa\/hlzTVKVD3JOkzj3j\/+9UiplnKXM\/xpQI26eeYrtag2oRadnt2feK4k6LPht5a2fjMIb6a3yW+eS1e\/2YulxkVn\/xfThuy3iqFvfe9IP6CoqoK0\/pPR7y5I37iOlG1PLcr+KBgprkPlyeEqSdOu5cJiK9b1\/qfF0ngPN1mNe4XmrtVaYH\/R\/faMneetS44+m3sVdfo\/3qV3dr+GcVnF+IbF+mN\/KmePz2VhngBf+azbvgH9Sw12dVxM6Ze4qrQT2IOWH+Psq3KW5\/e9RlRXyBpjqmV9P3usMsl+rcV6YhvdKhV5V\/mJXJcGnWgOl5VXvj5wzO5+NYyvi9q9v2TZvHJU7XizQuA0Boxu3g\/FnerTUf8OKQiHr8Tg3hR5hZvuqfD2CQiHu9TM6H4riYd8XMxpnhImRHFt\/\/dCme6F4XRQbwoaYiHyZlZPMwF4kVBvCiIFwXxoiBeFMSLMql4vKcD4kVBvCiIFyVY\/HG1Pb8a037tHOKTJlS8feHgbpv7\/\/7TFw4iPiVCxZ9+fT\/\/eOv1ilHEp0RwU59X98M6yw4vPy2L+JQIT+52xY08be+ITxqyelEQL0os8Y3k7tZ9nIhPCWq8KIgXJcLIXdGsf2ldxiM+aWKM3FkO7TFbxKdMhJG7i887ZRGfElPWeB6NTIjgPv606d3HIz4hpszqEZ8QiBcF8aIgXhTEi4J4URAvCuJFQbwok4oPCAaR6SP+uDJP3XdQDwqN+JToId7+Heb8ukb8Q9FDfCl894L4R6Jnjc\/Zf\/2G+MehTx9\/2qztx77jT69DQiM+JcjqReklvuzd6eMfiT7J3cY9INHxDPyQ0IhPiQE1PjQ04lOCPl6UfjX+5g2VQ0IjPiUG1Pj9Oiw04lNigHiy+kdigPgDTf0DMaSP34aFRnxKkNWLgnhR+om33105dOCu42lZSIde4u1tGPnlXOiQ7aDSMC5T\/pFmUGkYF2q8KPTxokyZ1QfEgtggXpQpx+oHlYZxocaLgnhRBmT1HV9JPyg04lNiyHX8QPOITxlG7kTp19QXlZ0a\/0gMuRFj4O2WiE8ZsnpREC8K4kVBvCiIFwXxoiBeFMSLgnhREC8K4kVBvChxxB+7vvsQ8SkTKv7OH+4QnzLBNf60yZVT4xdHhKb+tHn+HfFLI0off1x13aGB+JQhqxcF8aLEEt+4Bdd4PhsLJoAaLwriRQkWf1zduvEa8SkTKt69sCY7tL8vA\/EpEzxk65K6juerEJ8y1HhRIozV08cvEbJ6URAvCuJFQbwoiBcF8aIgXhTEi4J4URAvCuJFQbwoiBcF8aIgXhTEi4J4URAvCuJFQbwoiBcF8aIgXhTEi4J4URAvCuJFQbwoiBcF8aIgXhTEi4J4URAvCuJFQbwoiBcF8aIgXhTEi4J4URAvCuJFmU483pMC8aIgXhTEi4J4URAvCuJFQbwoiBcF8aIEiz+uzNNbn\/fOIT4pQsXb986dX9eIXxqh4kvhuxfEL4wYNT5n\/\/Ub4hdFcB9\/2qztx779qknEpwxZvSiIFyWW+EZyZzyfDAVTQI0XBfGixBi56\/f+eMQnRaTr+Ozw\/PGTsohPijgjd4zVLw5qvCgRRu7o45cIWb0oiBcF8aIgXhTEi4J4URAvCuJFQbwoiBcF8aIgXhTEi4J4URAvCuJFQbwoiBcF8aIgXhTEi4J4URAvCuJFQbwoiBcF8aIgXhTEi4J4URAvCuJFQbwoiBcF8aIgXhTEi4J4URAvCuJFQbwoiBcF8aIgXhTEi4J4URAvCuJFQbwoiBcF8aIgXhTEi4J4UYLF84rRZRIqnhcOLpRQ8bxidKFQ40UJ7uN5xegyIasXBfGixBLfSO6M55OhYAqmq\/GQFIgXZbqRO0iK6a7jISmmG7mDpKDGizLdyB0kBVm9KIgXBfGiIF4UxIuCeFHGFA8pM574sSIRbIJgiBcNhnjRYIgXDYZ40WCIFw2GeNFgDMKIgnhREC8K4kVBvCiIFwXxoiBeFMSLgnhRIok\/bUz7SZtPcPz2XgULjGkf9tzGCnYonyiJE8w9nhQn2N4UmzY4WBzxdkf2L+FxDnYfXLDAmKdf3rLjn9\/iBLPnYx0lfG\/3+SkZKdiueMJteLA44u0TlUVlDWP39FsexAULjHmw+7\/bxglmqaMEBzv+5a\/bSLt5\/vFmP4YHiyP++P2jqGLhgfKtdsEixKyjRAiW16RIwc4\/\/pXXzDjBiicbPxMsjnj7KG008S5YeMzz6zpasOPq6S1WsP3aNslxguW9ma31w4M9cI0\/bdZZis1HXvwcrcYX7LZz1fhIfXwpPlJPelxts890fjeJlTDsi7ve1zNvWaysfh0lqy+22gULjFl6jxTMNaFxgmVlEh5vy85\/fx8e7GGv48t6tY13tZz38Ylex39qyxi5EwXxoiBeFMSLgnhREC8K4kVBvCiIFwXxoiBeFMSLgnhREC8K4kVBvCiIFwXxoiBeFMSLgnhREC8K4guO3\/9RPFStA+ILjqt117s0HxjEFxTP7MV4BmwxIL4A8aIgXhTEi4J4EAHxoiBeFMSLgnhREC8K4kVBvCiIFwXxoiBeFMSLgnhREC8K4kVBvCiIFwXxovwf6PLkBtGL04kAAAAASUVORK5CYII=\" alt=\"plot of chunk unnamed-chunk-10\"\/><\/p>\n<p>In this version instead of simulating 6 literal die rolls, we simulate the number of successes in 6 die rolls. We turn each roll of the die into a binomial event: success or failure. The <code>rbinom<\/code> function allows us to simulate binomial events where <code>size<\/code> is the number of trials (or rolls in this case) and <code>prob<\/code> is the probability of success at each trial. So <code>rbinom(n = 1, size = 6, prob = 1\/6)<\/code> would return a number ranging 0 to 6 indicating the number of success. Think of it as flipping 6 coins, each with probability of getting heads as \\(\\frac{1}{6}\\), and then counting the number of heads we observed. Setting the <code>n<\/code> argument to 500 replicates it 500 times. After that it&#39;s simply a matter of logically checking which outcomes were greater than 0 and using <code>cumsum<\/code> on the resulting TRUE\/FALSE vector. <\/p>\n<p>This version is way faster. I mean <em>way<\/em> faster. Compare the time it takes it to do each 1,000,000 times:<\/p>\n<pre><code class=\"r\">system.time({\r\nr.out &lt;- replicate(n = 1e6, any(sample(1:6, size = 6, replace = T) == 1:6))\r\np.out &lt;- cumsum(r.out)\/seq(1e6)\r\n})\r\n<\/code><\/pre>\n<pre>##    user  system elapsed \r\n##    5.26    0.00    5.26\r\n<\/pre>\n<pre><code class=\"r\">system.time({\r\nr.out2 &lt;- cumsum(rbinom(n = 1e6, size = 6, prob = (1\/6)) &gt; 0)\r\np.out2 &lt;- r.out2\/seq(1e6)\r\n})\r\n<\/code><\/pre>\n<pre>##    user  system elapsed \r\n##    0.06    0.00    0.06\r\n<\/pre>\n<p>It&#39;s not even close. Who was the dummy that wrote that first version with <code>replicate<\/code>?<\/p>\n<p>But does the new faster version reflect the experimental setting better? Not really. Remember, we&#39;re demonstrating probability concepts with die rolls in the first chapter of an intro stats textbook. That&#39;s probably not the best time to break out <code>rbinom<\/code>. And the demo was for 500 trials, not 1,000,000. I had to ramp up the trials to see the speed difference. Maybe the &ldquo;right&rdquo; R code in this situation is not the fastest version but rather the one that&#39;s easier to understand. <\/p>\n","protected":false},"excerpt":{"rendered":"<p>One of my first blog posts on this site simulated rolling a die 6 times and observing if side i&#8230; <a class=\"read-more\" href=\"https:\/\/www.clayford.net\/statistics\/revisiting-some-old-r-code\/\">Read more<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7,8,13],"tags":[67,65,66],"class_list":["post-747","post","type-post","status-publish","format-standard","hentry","category-probability","category-simulation","category-using-r","tag-probability","tag-r","tag-simulation"],"_links":{"self":[{"href":"https:\/\/www.clayford.net\/statistics\/wp-json\/wp\/v2\/posts\/747","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.clayford.net\/statistics\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.clayford.net\/statistics\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.clayford.net\/statistics\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.clayford.net\/statistics\/wp-json\/wp\/v2\/comments?post=747"}],"version-history":[{"count":3,"href":"https:\/\/www.clayford.net\/statistics\/wp-json\/wp\/v2\/posts\/747\/revisions"}],"predecessor-version":[{"id":905,"href":"https:\/\/www.clayford.net\/statistics\/wp-json\/wp\/v2\/posts\/747\/revisions\/905"}],"wp:attachment":[{"href":"https:\/\/www.clayford.net\/statistics\/wp-json\/wp\/v2\/media?parent=747"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.clayford.net\/statistics\/wp-json\/wp\/v2\/categories?post=747"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.clayford.net\/statistics\/wp-json\/wp\/v2\/tags?post=747"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}