<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-4200017933558803500</id><updated>2012-02-12T20:40:35.759+01:00</updated><category term='instalación'/><category term='ggplot2'/><category term='correspondencias'/><category term='componentes principales'/><category term='HistData'/><category term='R'/><title type='text'>El blog de los erreros</title><subtitle type='html'>En este blog se pretende dar todo tipo de informaciones y consejos sobre el lenguaje de programación R, así como de los programas relacionados para facilitar su utilización como editores, interfaces gráficas e incluso sistemas operativos. Como dicho lenguaje está orientado al trabajo en Estadística, también es posible que aparezcan elementos teóricos y prácticos de esta materia.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://erre-que-erre-paco.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4200017933558803500/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://erre-que-erre-paco.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Paco</name><uri>http://www.blogger.com/profile/05414727581731452919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_Lsnfr2zsR8A/SwkQF-4sS9I/AAAAAAAAA0c/GGwOyuhdv68/S220/francesc.png'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>55</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4200017933558803500.post-6980705854974182440</id><published>2012-02-12T19:15:00.008+01:00</published><updated>2012-02-12T20:40:35.777+01:00</updated><title type='text'>Una animación con R</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;iframe src="http://www.youtube.com/embed/dxz7Anr5KUQ" allowfullscreen="" width="480" frameborder="0" height="360"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;La idea es sencilla. Se trata de componer un  vídeo mediante la unión de imágenes como en una película de dibujos animados.&lt;br /&gt;En este ejemplo, vamos a utilizar el parámetro de amplitud &lt;span style="font-style: italic;"&gt;h&lt;/span&gt; de una función coseno&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;f&lt;/span&gt;(&lt;span style="font-style: italic;"&gt;t&lt;/span&gt;) = &lt;span style="font-style: italic;"&gt;h&lt;/span&gt;*&lt;span style="font-style: italic;"&gt;cos&lt;/span&gt;(omega(&lt;span style="font-style: italic;"&gt;t&lt;/span&gt;-rho))&lt;br /&gt;&lt;br /&gt;con omega=1 y rho=0 fijos.&lt;br /&gt;&lt;br /&gt;En primer lugar fijamos los parámetros y hacemos un gráfico preliminar:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;h &amp;lt;- 1&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;rho &amp;lt;- 0&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;omega &amp;lt;- 1&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;x &amp;lt;- seq(-1.5*pi+0.5, 2*pi+0.5, length=250)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;y &amp;lt;- h*cos(omega*(x-rho))&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;plot(x, y, type="l", ylim=c(-1.5,1.5))&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;abline(h=0, v=0, col="grey75")&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/-0OPn1kquWfA/TzgIi-1b3oI/AAAAAAAABkk/PX6gn8rwM_E/s1600/Rplot.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 327px;" src="http://1.bp.blogspot.com/-0OPn1kquWfA/TzgIi-1b3oI/AAAAAAAABkk/PX6gn8rwM_E/s400/Rplot.png" alt="" id="BLOGGER_PHOTO_ID_5708321924767800962" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Ahora vamos a crear una secuencia de imágenes variando el parámetro &lt;span style="font-style: italic;"&gt;h&lt;/span&gt; entre los valores 1 y 1.5 primero, después bajándolo hasta 0.5 y luego subiéndolo otra vez hasta 1.&lt;br /&gt;Para un vídeo de 8 segundos necesitamos al menos 8*25=200 imágenes.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;hnew &amp;lt;- c(seq(1,    1.5, by=0.01),&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;            seq(1.48, 0.5, by=-0.01),&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;          seq(0.52, 1,   by=0.01))&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;También debemos crear una carpeta donde guardaremos todas las imágenes separadas del resto de documentos. La carpeta debe existir realmente para que la podamos utilizar.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;# imagesDir &amp;lt;- "C:/Mis documentos/R/video"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;imagesDir &amp;lt;- "/home/francesc/R/video"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A continuación abrimos el dispositivo para crear múltiples imágenes en formato PNG, dentro de la carpeta escogida y con una numeración de tres dígitos correlativa.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;png(file.path(imagesDir, "Rplot%03d.png"))&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ahora ya podemos generar las imágenes con un &lt;span style="font-family:courier new;"&gt;for&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;for (i in 1:length(hnew)){&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  plot(x, y, type="l", ylim=c(-1.5,1.5),&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;       main=expression(f(t)==h*cos(omega*t-omega*rho)), lwd=2)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  abline(h=0, v=0, col="grey75")&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  h &amp;lt;- hnew[i]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  lines(x, h*cos(omega*(x-rho)), col=2)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  lines(c(0,0),c(0,h), col=2, lwd=2)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  lines(c(-0.05,0.05),c(h,h), col=2, lwd=2)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  lines(c(-0.05,0.05),c(0,0), col=2, lwd=2)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  lines(c(0,1.8), c(h/2,0.85), col=2, lwd=2)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  text(1.9,0.87, paste("h=", round(h,2), sep=""), adj=0, col=2)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  text(1.9,1.1, "Changing the amplitude:", font=2, adj=0, col=2)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;dev.off()&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;La última instrucción cierra el dispositivo &lt;span style="font-family:courier new;"&gt;png&lt;/span&gt;.&lt;br /&gt;El último paso es crear el vídeo con algún programa específico. Una opción es ImageMagick que se puede ejecutar desde la consola con la instrucción:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;convert /home/francesc/R/video/*.png  video.mpeg&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;En este caso no ha funcionado (otras veces sí) y he utilizado el programa OpenShot que permite crear vídeos con la importación de una secuencia de imágenes con el mismo nombre que nosotros le hemos dado: &lt;span style="font-family: courier new;"&gt;Rplot%03d.png&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;¿Os animáis a crear vuestros vídeos?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4200017933558803500-6980705854974182440?l=erre-que-erre-paco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://erre-que-erre-paco.blogspot.com/feeds/6980705854974182440/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://erre-que-erre-paco.blogspot.com/2012/02/una-animacion-con-r.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4200017933558803500/posts/default/6980705854974182440'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4200017933558803500/posts/default/6980705854974182440'/><link rel='alternate' type='text/html' href='http://erre-que-erre-paco.blogspot.com/2012/02/una-animacion-con-r.html' title='Una animación con R'/><author><name>Paco</name><uri>http://www.blogger.com/profile/05414727581731452919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_Lsnfr2zsR8A/SwkQF-4sS9I/AAAAAAAAA0c/GGwOyuhdv68/S220/francesc.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://img.youtube.com/vi/dxz7Anr5KUQ/default.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4200017933558803500.post-1851176169197357202</id><published>2012-02-08T19:13:00.008+01:00</published><updated>2012-02-08T21:10:09.161+01:00</updated><title type='text'>Sweave desde un editor de texto</title><content type='html'>&lt;a href="http://3.bp.blogspot.com/-HsR-uqAk0xA/TzLDPePpqSI/AAAAAAAABkY/bIVnl1yNa2E/s1600/Texmaker1.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 250px;" src="http://3.bp.blogspot.com/-HsR-uqAk0xA/TzLDPePpqSI/AAAAAAAABkY/bIVnl1yNa2E/s400/Texmaker1.png" alt="" id="BLOGGER_PHOTO_ID_5706838348416002338" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;En algún otro artículo ya he resaltado la importancia de utilizar Sweave para mezclar código de R con texto y producir informes automáticos con resultados estadísticos y gráficos dinámicos. Sweave se puede utilizar desde LibreOffice, no sin ciertas dificultades, con el paquete &lt;a href="http://erre-que-erre-paco.blogspot.com/2009/11/de-r-odf-el-paquete-odfweave.html"&gt;odfWeave&lt;/a&gt;, pero sin duda los mejores resultados se obtienen con el texto en formato &lt;a href="http://erre-que-erre-paco.blogspot.com/2009/08/latex-y-r.html"&gt;LaTeX&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Supongamos que tenemos una buena instalación de R y de algún programa de LaTeX para nuestro sistema operativo. Entonces se puede ejecutar Sweave desde la consola de R o incluso desde una GUI como RStudio, pero es mucho mejor ejecutarlo desde el propio editor de LaTeX que seguramente es donde hemos escrito el documento .Rnw que queremos compilar. Este es el objetivo: ejecutar Sweave sobre el documento que estamos editando sin salir del editor.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Sweave en un sistema Windows&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Supongamos que utilizamos Texmaker con la distribución MikTeX de LaTeX, aunque el procedimiento es similar si utilizamos otro editor y otra distribución de LaTeX.&lt;br /&gt;Sweave viene con la distribución estándar de R y se puede ejecutar desde su consola, pero yo prefiero compilar el documento directamente desde el editor. Para ello necesitamos un archivo llamado &lt;span style="font-family:courier new;"&gt;Sweave.bat&lt;/span&gt; que se puede obtener en el &lt;a href="http://cran.r-project.org/contrib/extra/batchfiles/"&gt;CRAN&lt;/a&gt; dentro del archivo &lt;span style="font-family:courier new;"&gt;batchfiles_x.x-x.zip&lt;/span&gt;. Para instalar el archivo &lt;span style="font-family:courier new;"&gt;Sweave.bat&lt;/span&gt; debemos dejarlo en alguna carpeta que sea accesible en nuestro PATH o añadir dicha carpeta al PATH.&lt;br /&gt;Ahora ya deberíamos ser capaces de ejecutar este &lt;span style="font-family:courier new;"&gt;.bat&lt;/span&gt; desde la consola, sólo necesitamos indicarle al editor donde encontrarlo.&lt;br /&gt;Abrimos Texmaker y seleccionamos &lt;span style="font-family:arial;"&gt;Opciones -&amp;gt; Configurar Texmaker&lt;/span&gt; e incluir la orden:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Sweave.bat --pdf %.Rnw&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;en alguna de las categorías, por ejemplo como &lt;span style="font-family:arial;"&gt;Montaje rápido&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Un detalle importante: en Windows hay una dificultad añadida ya que necesitamos que LaTeX sea capaz de hallar el archivo &lt;span style="font-family:courier new;"&gt;Sweave.sty&lt;/span&gt;. Para ello copiaremos este archivo desde&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;C:\Archivos de programa\R\R-x.x.x\share\texmf&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;en alguna carpeta de la distribución de MikTeX y luego refrescaremos la base de datos.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Sweave en un sistema Mac OS X&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Los pasos para poner a punto un ordenador Mac OS X son incluso más sencillos que los explicados para un ordenador con Windows. Necesitamos el script &lt;span style="font-family:courier new;"&gt;Sweave.sh&lt;/span&gt; que hallaremos en el &lt;a href="http://cran.r-project.org/contrib/extra/scripts/"&gt;CRAN&lt;/a&gt;.&lt;br /&gt;Para instalarlo, debemos copiarlo en&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;/usr/local/bin&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;y, dentro del programa Terminal, escribimos&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;sudo chmod +x /usr/local/bin/Sweave.sh&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;para hacerlo ejecutable.&lt;br /&gt;&lt;br /&gt;Ahora ya podemos ejecutar este script desde la consola.  Sin embargo, para que podamos ejecutarlo desde TEXshop, sólo hay que indicarle a TEXShop donde hallar dicho &lt;span style="font-family:courier new;"&gt;Sweave.sh&lt;/span&gt;.&lt;br /&gt;Abrimos TEXShop  y buscamos &lt;span style="font-family:arial;"&gt;TEXShop→Preferences&lt;/span&gt;. Hacemos click en la pestaña &lt;span style="font-family:arial;"&gt;Misc&lt;/span&gt; y escribimos&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;/usr/local/bin/Sweave.sh −ld&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;en el campo &lt;span style="font-family:arial;"&gt;LaTeX Progam Personal Script&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Sweave en un sistema Linux&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Para poner a punto un ordenador con Linux, el procedimiento es también muy sencillo, aunque los detalles pueden variar ligeramente dependiendo de la distribución y el editor utilizados. El ejemplo que explicaré se basa en Kubuntu Linux y el editor es Kile.&lt;br /&gt;Para ejecutar Sweave desde el editor necesitamos el script &lt;span style="font-family:courier new;"&gt;Sweave.sh&lt;/span&gt; que podemos hallar en el &lt;a href="http://cran.r-project.org/contrib/extra/scripts/"&gt;CRAN&lt;/a&gt;. Luego instalaremos ese script en&lt;br /&gt;&lt;br /&gt;/usr/local/bin&lt;br /&gt;&lt;br /&gt;entonces abrimos la Konsole y escribimos&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;sudo chmod +x /usr/local/bin/Sweave.sh&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;para hacerlo ejecutable.&lt;br /&gt;El siguiente paso es indicarle a Kile donde hallar este script. Abrimos Kile y hacemos click en &lt;span style="font-family:arial;"&gt;Settings→Configure Kile&lt;/span&gt;.  Nos vamos a &lt;span style="font-family:arial;"&gt;Tools→Build&lt;/span&gt; y añadiremos una nueva herramienta que podemos llamar &lt;span style="font-family:arial;"&gt;Sweave&lt;/span&gt;. En la ventana superior escribiremos la orden &lt;span style="font-family:courier new;"&gt;Sweave.sh&lt;/span&gt;  y&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;−ld '%source'&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;en la de abajo.&lt;br /&gt;Recordemos que el archivo &lt;span style="font-family:courier new;"&gt;Sweave.sty&lt;/span&gt; debe ser accesible.&lt;br /&gt;&lt;br /&gt;Más información en el artículo:&lt;br /&gt;&lt;a href="http://www.scribd.com/doc/6451985/Learning-to-Sweave-in-APA-Style"&gt;http://www.scribd.com/doc/6451985/Learning-to-Sweave-in-APA-Style&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4200017933558803500-1851176169197357202?l=erre-que-erre-paco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://erre-que-erre-paco.blogspot.com/feeds/1851176169197357202/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://erre-que-erre-paco.blogspot.com/2012/02/sweave-desde-un-editor-de-texto.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4200017933558803500/posts/default/1851176169197357202'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4200017933558803500/posts/default/1851176169197357202'/><link rel='alternate' type='text/html' href='http://erre-que-erre-paco.blogspot.com/2012/02/sweave-desde-un-editor-de-texto.html' title='Sweave desde un editor de texto'/><author><name>Paco</name><uri>http://www.blogger.com/profile/05414727581731452919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_Lsnfr2zsR8A/SwkQF-4sS9I/AAAAAAAAA0c/GGwOyuhdv68/S220/francesc.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-HsR-uqAk0xA/TzLDPePpqSI/AAAAAAAABkY/bIVnl1yNa2E/s72-c/Texmaker1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4200017933558803500.post-3373482592590568967</id><published>2011-12-31T07:18:00.004+01:00</published><updated>2011-12-31T08:10:58.256+01:00</updated><title type='text'>Sweave, FactoMineR y PDFs</title><content type='html'>&lt;a href="http://1.bp.blogspot.com/-zhghZKnTqRs/Tv6pg7XRhQI/AAAAAAAABjk/JZBwR792yvs/s1600/FactoMineR.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 68px;" src="http://1.bp.blogspot.com/-zhghZKnTqRs/Tv6pg7XRhQI/AAAAAAAABjk/JZBwR792yvs/s400/FactoMineR.png" alt="" id="BLOGGER_PHOTO_ID_5692173362199102722" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;El asunto es que estoy escribiendo un informe en LaTeX con Sweave. Lo hago así porque de esta forma me aseguro que añadir una variable o cambiar un dato no será un problema. El informe se volverá a generar en un minuto con todos los cambios.&lt;br /&gt;El análisis que hago en concreto es un Análisis Factorial Múltiple o MFA (&lt;a href="http://factominer.free.fr/advanced-methods/multiple-factor-analysis.html"&gt;Multiple Factor Analysis&lt;/a&gt;) con el paquete &lt;a href="http://factominer.free.fr/index.html"&gt;FactoMineR&lt;/a&gt;. Se trata de un análisis de reducción de la dimensión cuando tenemos varios grupos de variables, tanto cuantitativas como cualitativas. Además este análisis permite estudiar los ejes principales mediante algunos gráficos y, como era de esperar, la representación de los individuos con las componentes principales.&lt;br /&gt;En concreto utilizo PDFLaTeX directamente con el archivo .tex que resulta de procesar el archivo .Rnw con el Sweave. Así, los gráficos deben estar en formato PDF o PNG y no EPS. Ahora con Sweave esta es la opción por defecto.&lt;br /&gt;Bueno, el caso es que los gráficos generados por el Sweave estaban vacíos. Eran archivos PDF con el nombre habitual por defecto, pero vacíos. ¿Sería un bug de Sweave? ¿Un error de mi instalación de R? ¿Un problema al cambiar de carpeta los archivos PDF?&lt;br /&gt;&lt;br /&gt;Pues me costó un buen rato descubrir la razón del problema. Como siempre, lo primero fue aislar el error. No era un problema de Sweave, ni de mi instalación de R, ni de las opciones del Sweave (cambio de carpeta para las imágenes). Tuve que hacer unas cuantas pruebas, para descubrir que el problema estaba en los gráficos que generaba el paquete FactoMineR. En mi caso la función &lt;span style="font-family: courier new;"&gt;plot.MFA()&lt;/span&gt;. Tal vez, si hubiera leído mejor la ayuda de la función...&lt;br /&gt;&lt;br /&gt;Bien, pues aquí va la explicación:&lt;br /&gt;Resulta que para generar un gráfico en PDF, debemos desviar el dispositivo de salida gráfica hacia un archivo PDF. Eso se hace manualmente con la instrucción &lt;span style="font-family: courier new;"&gt;pdf()&lt;/span&gt; y seguramente lo debemos cerrar con la instrucción &lt;span style="font-family: courier new;"&gt;dev.off()&lt;/span&gt;. Eso es lo que hace automáticamente el Sweave.&lt;br /&gt;Resulta que leyendo el código de la función &lt;span style="font-family: courier new;"&gt;plot.MFA()&lt;/span&gt; observé que, por defecto, hace una llamada a un nuevo dispositivo con la instrucción &lt;span style="font-family: courier new;"&gt;dev.new()&lt;/span&gt;. Ese era el problema.&lt;br /&gt;Si abrimos el dispositivo &lt;span style="font-family: courier new;"&gt;pdf()&lt;/span&gt; y luego otro dispositivo con &lt;span style="font-family: courier new;"&gt;dev.new()&lt;/span&gt;, entonces el gráfico va al segundo dispositivo y al cerrarlo con &lt;span style="font-family: courier new;"&gt;dev.off()&lt;/span&gt;, cerramos el segundo y no el primero. La gente de FactoMineR tenía el problema previsto con un parámetro &lt;span style="font-family: courier new;"&gt;new.plot=TRUE&lt;/span&gt; que para mi gusto debería estar en &lt;span style="font-family: courier new;"&gt;FALSE&lt;/span&gt; por defecto. Ellos lo han puesto en &lt;span style="font-family: courier new;"&gt;TRUE&lt;/span&gt; para que podamos ver unos cuantos gráficos sin machacar el anterior, pero eso en mi caso era mortal.&lt;br /&gt;En resumen, con la opción &lt;span style="font-family: courier new;"&gt;new.plot=FALSE&lt;/span&gt;, he podido generar el informe con PDFLaTeX sin problemas.&lt;br /&gt;Moraleja: si pensáis en una función que genere varios gráficos seguidos, hay que pensar en un parámetro que regule la presentación uno a uno y que, mejor por defecto, no abra un nuevo dispositivo para cada uno.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4200017933558803500-3373482592590568967?l=erre-que-erre-paco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://erre-que-erre-paco.blogspot.com/feeds/3373482592590568967/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://erre-que-erre-paco.blogspot.com/2011/12/sweave-factominer-y-pdfs.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4200017933558803500/posts/default/3373482592590568967'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4200017933558803500/posts/default/3373482592590568967'/><link rel='alternate' type='text/html' href='http://erre-que-erre-paco.blogspot.com/2011/12/sweave-factominer-y-pdfs.html' title='Sweave, FactoMineR y PDFs'/><author><name>Paco</name><uri>http://www.blogger.com/profile/05414727581731452919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_Lsnfr2zsR8A/SwkQF-4sS9I/AAAAAAAAA0c/GGwOyuhdv68/S220/francesc.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-zhghZKnTqRs/Tv6pg7XRhQI/AAAAAAAABjk/JZBwR792yvs/s72-c/FactoMineR.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4200017933558803500.post-7592261854332636693</id><published>2011-11-05T19:16:00.002+01:00</published><updated>2011-11-05T19:51:23.416+01:00</updated><title type='text'>RKWard 0.5.7 para el nuevo R 2.14.0</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-NcVpLAurPWA/TrV9oycuHrI/AAAAAAAABjA/tTw8zHbPjnc/s1600/rkward.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 285px;" src="http://1.bp.blogspot.com/-NcVpLAurPWA/TrV9oycuHrI/AAAAAAAABjA/tTw8zHbPjnc/s400/rkward.png" alt="" id="BLOGGER_PHOTO_ID_5671577445433482930" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Los desarrolladores de RKWard han lanzado una nueva versión (23 de octubre de 2011) de este magnífico software. Lo que me ha pasado es que al actualizar R a su versión 2.14.0, el RKWard dejó de funcionar. Pero como era de esperar, los amigos de RKWard ya estaban preparados.&lt;br /&gt;Como yo utilizo Kubuntu (natty) he buscado el repositorio adecuado para actualizar RKWard que es&lt;br /&gt;&lt;br /&gt;deb http://ppa.launchpad.net/rkward-devel/rkward-stable-cran/ubuntu  natty main&lt;br /&gt;&lt;br /&gt;y automáticamente se ha actualizado sin problema ninguno. Como veis todavía sigo con la versión natty o 11.04 de Kubuntu, ya que me gusta esperar algunos días antes de pasar a la nueva 11.10.&lt;br /&gt;&lt;br /&gt;Además de nuevos detalles y corrección de errores, esta versión de RKWard viene con una importante mejora en la forma de añadir complementos, ya que ahora estos complementos se instalan como paquetes de R.&lt;br /&gt;&lt;br /&gt;Aunque hay una versión para Windows, yo no la recomiendo ya que requiere un escritorio KDE para Windows y todavía no está demasiado desarrollada. Una opción alternativa y que comentaré próximamente es el programa multiplataforma RStudio que viene pegando fuerte.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4200017933558803500-7592261854332636693?l=erre-que-erre-paco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://erre-que-erre-paco.blogspot.com/feeds/7592261854332636693/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://erre-que-erre-paco.blogspot.com/2011/11/rkward-057-para-el-nuevo-r-2140.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4200017933558803500/posts/default/7592261854332636693'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4200017933558803500/posts/default/7592261854332636693'/><link rel='alternate' type='text/html' href='http://erre-que-erre-paco.blogspot.com/2011/11/rkward-057-para-el-nuevo-r-2140.html' title='RKWard 0.5.7 para el nuevo R 2.14.0'/><author><name>Paco</name><uri>http://www.blogger.com/profile/05414727581731452919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_Lsnfr2zsR8A/SwkQF-4sS9I/AAAAAAAAA0c/GGwOyuhdv68/S220/francesc.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-NcVpLAurPWA/TrV9oycuHrI/AAAAAAAABjA/tTw8zHbPjnc/s72-c/rkward.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4200017933558803500.post-30746826009569704</id><published>2011-04-12T09:46:00.007+02:00</published><updated>2011-04-12T11:20:59.279+02:00</updated><title type='text'>El código de una función</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-e5k4wgjq8Ng/TaQIH8b9EVI/AAAAAAAABL0/wFQwPWbowfc/s1600/matrix.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 326px; height: 262px;" src="http://3.bp.blogspot.com/-e5k4wgjq8Ng/TaQIH8b9EVI/AAAAAAAABL0/wFQwPWbowfc/s400/matrix.png" alt="" id="BLOGGER_PHOTO_ID_5594605569676480850" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Una de las ventajas de utilizar un programa como R de código libre es la posibilidad de aprender a través de la lectura del código de las funciones incorporadas, ya sea de los paquetes oficiales del CRAN o de los que proporcionan todas las personas que contribuyen de forma particular.&lt;br /&gt;&lt;br /&gt;La forma más sencilla de acceder al código de una función es con la llamada a su nombre (sin paréntesis). Por ejemplo, para ver el código de la función &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;matrix()&lt;/span&gt;&lt;/span&gt;:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&amp;gt; matrix&lt;br /&gt;function (data = NA, nrow = 1, ncol = 1, byrow = FALSE, dimnames = NULL)&lt;br /&gt;{&lt;br /&gt;data &amp;lt;- as.vector(data)&lt;br /&gt;if (missing(nrow))&lt;br /&gt;nrow &amp;lt;- ceiling(length(data)/ncol)&lt;br /&gt;else if (missing(ncol))&lt;br /&gt;ncol &amp;lt;- ceiling(length(data)/nrow)&lt;br /&gt;.Internal(matrix(data, nrow, ncol, byrow, dimnames))&lt;br /&gt;}&lt;br /&gt;&amp;lt; environment: namespace:base &amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Desgraciadamente los comentarios de estas funciones en los paquetes instalados se han eliminado para ahorrar memoria. Si queremos acceder al código fuente original, podemos descargar directamente el código de los paquetes del CRAN y descomprimirlos. Como los archivos están escritos con texto plano, podemos utilizar cualquier editor de texto para leer su contenido. Para los paquetes básicos de R, la carpeta es &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;$R_HOME/src/library/NombrePaquete/R/&lt;/span&gt;&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;En algunos casos, una función llama a otra función parcialmente oculta. Esa función oculta está en un &lt;span style="font-style: italic;"&gt;namespace&lt;/span&gt; y se puede acceder a ella mediante la función &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;getAnywhere("NombreFunción")&lt;/span&gt;&lt;/span&gt;. Esta función proporciona el namespace del que procede la función requerida y entonces podemos acceder a las fuentes de paquete correspondiente. Esto es así para los métodos S3 tales como &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;plot.factor&lt;/span&gt;&lt;/span&gt;:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&amp;gt; plot.factor&lt;br /&gt;Error: object 'plot.factor' not found&lt;br /&gt;&amp;gt; getAnywhere("plot.factor")&lt;br /&gt;A single object matching ‘plot.factor’ was found&lt;br /&gt;It was found in the following places&lt;br /&gt;registered S3 method for plot from namespace graphics&lt;br /&gt;namespace:graphics&lt;br /&gt;with value&lt;br /&gt;&lt;br /&gt;function (x, y, legend.text = NULL, ...)&lt;br /&gt;{&lt;br /&gt;...&lt;br /&gt;}&lt;br /&gt;&amp;lt; environment: namespace:graphics &amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;El archivo que contiene el código de plot.factor es &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;$R_HOME/src/graphics/R/plot.R&lt;/span&gt;&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Como ejemplo consideremos la función &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;t.test()&lt;/span&gt;&lt;/span&gt;. Si queremos acceder a su código tenemos:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&amp;gt; t.test&lt;br /&gt;function (x, ...)&lt;br /&gt;UseMethod("t.test")&lt;br /&gt;&amp;lt; environment: namespace:stats &amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;La llamada a &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;UseMethod()&lt;/span&gt;&lt;/span&gt; oculta el código, pero nos indica que se trata de una función S3 genérica que llama a un método específico que será el apropiado para la clase del objeto. De modo que podemos preguntar cuales son los métodos apropiados así:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&amp;gt; methods(t.test)&lt;br /&gt;[1] t.test.default* t.test.formula*&lt;br /&gt;&lt;br /&gt;  Non-visible functions are asterisked&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;De modo que ahora ya conocemos los métodos y podemos ver el código:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&amp;gt; getAnywhere(t.test.default)&lt;br /&gt;A single object matching ‘t.test.default’ was found&lt;br /&gt;It was found in the following places&lt;br /&gt; registered S3 method for t.test from namespace stats&lt;br /&gt; namespace:stats&lt;br /&gt;with value&lt;br /&gt;&lt;br /&gt;function (x, y = NULL, alternative = c("two.sided", "less", "greater"),&lt;br /&gt;   mu = 0, paired = FALSE, var.equal = FALSE, conf.level = 0.95,&lt;br /&gt;   ...)&lt;br /&gt;{&lt;br /&gt;AQUÍ VEMOS EL CÓDIGO&lt;br /&gt;   }&lt;br /&gt;&amp;lt; environment: namespace:stats &amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;En el caso de fuentes S4 es conveniente trabajar con los archivos fuente del paquete. Las funciones &lt;span style="font-size:85%;"&gt;&lt;span style="font-family: courier new;"&gt;getClass()&lt;/span&gt;&lt;/span&gt;, &lt;span style="font-size:85%;"&gt;&lt;span style="font-family: courier new;"&gt;getGeneric()&lt;/span&gt;&lt;/span&gt; y &lt;span style="font-size:85%;"&gt;&lt;span style="font-family: courier new;"&gt;getMethod()&lt;/span&gt;&lt;/span&gt; nos pueden ayudar.&lt;br /&gt;&lt;br /&gt;Cuando en el código de una función de R aparecen funciones del tipo &lt;span style="font-size:85%;"&gt;&lt;span style="font-family: courier new;"&gt;.C()&lt;/span&gt;&lt;/span&gt;, &lt;span style="font-size:85%;"&gt;&lt;span style="font-family: courier new;"&gt;.Call()&lt;/span&gt;&lt;/span&gt;, &lt;span style="font-size:85%;"&gt;&lt;span style="font-family: courier new;"&gt;.Fortran()&lt;/span&gt;&lt;/span&gt;, &lt;span style="font-size:85%;"&gt;&lt;span style="font-family: courier new;"&gt;.External()&lt;/span&gt;&lt;/span&gt; o &lt;span style="font-size:85%;"&gt;&lt;span style="font-family: courier new;"&gt;.Internal()&lt;/span&gt;&lt;/span&gt; y &lt;span style="font-size:85%;"&gt;&lt;span style="font-family: courier new;"&gt;.Primitive()&lt;/span&gt;&lt;/span&gt; es que llaman a código compilado. En estos casos deberemos mirar las fuentes originales (en C, C++ o Fortran) si queremos comprender todo el código.&lt;br /&gt;&lt;br /&gt;Para més información consultar el artículo de Uwe Ligges:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.r-project.org/doc/Rnews/Rnews_2006-4.pdf"&gt;R Help Desk en la Rnews_2006-4&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4200017933558803500-30746826009569704?l=erre-que-erre-paco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://erre-que-erre-paco.blogspot.com/feeds/30746826009569704/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://erre-que-erre-paco.blogspot.com/2011/04/el-codigo-de-una-funcion.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4200017933558803500/posts/default/30746826009569704'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4200017933558803500/posts/default/30746826009569704'/><link rel='alternate' type='text/html' href='http://erre-que-erre-paco.blogspot.com/2011/04/el-codigo-de-una-funcion.html' title='El código de una función'/><author><name>Paco</name><uri>http://www.blogger.com/profile/05414727581731452919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_Lsnfr2zsR8A/SwkQF-4sS9I/AAAAAAAAA0c/GGwOyuhdv68/S220/francesc.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-e5k4wgjq8Ng/TaQIH8b9EVI/AAAAAAAABL0/wFQwPWbowfc/s72-c/matrix.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4200017933558803500.post-7917389370330496677</id><published>2011-03-10T11:45:00.000+01:00</published><updated>2011-03-10T11:44:06.452+01:00</updated><title type='text'>El gráfico beanplot</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-As-zLXYf9R8/TVbvoCHOW-I/AAAAAAAABLM/SYIAZ_ljg00/s1600/sprays.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 400px;" src="http://3.bp.blogspot.com/-As-zLXYf9R8/TVbvoCHOW-I/AAAAAAAABLM/SYIAZ_ljg00/s400/sprays.png" alt="" id="BLOGGER_PHOTO_ID_5572905059958545378" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Ciertamente, cuando se desea representar gráficamente unos datos cuantitativos univariantes existen varias posibilidades con diversas propiedades. Podemos hacer un histograma, un diagrama de tallo y hojas (stem-and-leaf), un diagrama de caja (boxplot), una densidad estimada y muchos más. Pero cuando se trata de comparar los valores de una variable cuantitativa para varias poblaciones o tratamientos, la mayoría no sirve. Por ejemplo, comparar un conjunto de histogramas o de gráficos de tallo y hojas es muy difícil, básicamente por el espacio que requieren. Así, para comparar datos univariantes en diferentes poblaciones casi siempre se utiliza el boxplot de Tukey o un gráfico de puntos unidimensional tipo stripchart cuando hay pocos datos.&lt;br /&gt;Aunque hay algunas variaciones del boxplot clásico, como incrementar la anchura de la caja en función del número de observaciones con el parámetro &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;varwidth=T&lt;/span&gt;&lt;/span&gt;, este gráfico se basa esencialmente en los estadísticos de posición como la mediana y las bisagras.&lt;br /&gt;Otra posibilidad es el gráfico de violín descrito por Hintze and Nelson (1998) en el que una densidad se combina con los cuartiles del boxplot. En este gráfico no se muestran los valores atípicos (outliers).&lt;br /&gt;Algunas críticas que se pueden hacer al boxplot se deben precisamente a la utilización de los cuartiles como elementos de difícil explicación (?) para los no matemáticos y la definición arbitraria del concepto de outlier. En un gráfico de violín la distribución subyacente es más visible, pero los datos concretos no se ven y no se conoce el número de observaciones del grupo.&lt;br /&gt;El &lt;span style="font-weight: bold;"&gt;beanplot&lt;/span&gt; es una combinación de un gráfico de densidad (doble) con las marcas de todos los datos. Dichas marcas cambian de color si se salen del interior de la doble densidad y se alargan si coinciden algunos datos con el mismo valor.&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/-BBJQ6yS07KM/TXioIVGHeVI/AAAAAAAABLs/HHLJ_r58IwE/s1600/beanplot2.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 214px;" src="http://3.bp.blogspot.com/-BBJQ6yS07KM/TXioIVGHeVI/AAAAAAAABLs/HHLJ_r58IwE/s400/beanplot2.png" alt="" id="BLOGGER_PHOTO_ID_5582396599180949842" border="0" /&gt;&lt;/a&gt;Para poder comparar los grupos, se señalan las medias de cada grupo y la media general.&lt;br /&gt;Por otra parte, si en la población general hay un factor con dos niveles, como el sexo, de puede considerar un beanplot asimétrico con dos densidades distintas en función del factor.&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/-G2Ueh_Z_J2Y/TXinSnw9muI/AAAAAAAABLc/X_DeJW605QM/s1600/beanplot1.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 315px;" src="http://2.bp.blogspot.com/-G2Ueh_Z_J2Y/TXinSnw9muI/AAAAAAAABLc/X_DeJW605QM/s400/beanplot1.png" alt="" id="BLOGGER_PHOTO_ID_5582395676479560418" border="0" /&gt;&lt;/a&gt;Sin embargo, aunque la vistosidad del beanplot parece aventajar al boxplot, no debemos olvidar que el boxplot se creó con la intención de tener un gráfico sencillo y sobre todo robusto, es decir, basado en estadísticos de orden.&lt;br /&gt;&lt;br /&gt;Como es gratis, con cualquier conjunto de datos podemos hacer los dos gráficos, incluso no es difícil añadir al boxplot los datos concretos en otro color, y representaremos el que mejor explique nuestro experimento o los dos, si lo creemos conveniente.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4200017933558803500-7917389370330496677?l=erre-que-erre-paco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://erre-que-erre-paco.blogspot.com/feeds/7917389370330496677/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://erre-que-erre-paco.blogspot.com/2011/02/el-grafico-beanplot.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4200017933558803500/posts/default/7917389370330496677'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4200017933558803500/posts/default/7917389370330496677'/><link rel='alternate' type='text/html' href='http://erre-que-erre-paco.blogspot.com/2011/02/el-grafico-beanplot.html' title='El gráfico beanplot'/><author><name>Paco</name><uri>http://www.blogger.com/profile/05414727581731452919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_Lsnfr2zsR8A/SwkQF-4sS9I/AAAAAAAAA0c/GGwOyuhdv68/S220/francesc.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-As-zLXYf9R8/TVbvoCHOW-I/AAAAAAAABLM/SYIAZ_ljg00/s72-c/sprays.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4200017933558803500.post-1516676250048645044</id><published>2011-02-12T00:20:00.004+01:00</published><updated>2011-02-12T08:37:46.819+01:00</updated><title type='text'>La velocidad de la luz (3)</title><content type='html'>En primer lugar vamos a calcular los estadísticos más comunes con la ayuda del paquete &lt;span style="font-weight: bold;font-family:arial;" &gt;fBasics&lt;/span&gt; y su función &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;basicStats&lt;/span&gt;&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&gt; library(fBasics)&lt;br /&gt;Loading required package: MASS&lt;br /&gt;Loading required package: timeDate&lt;br /&gt;Loading required package: timeSeries&lt;br /&gt;&lt;br /&gt;Attaching package: 'fBasics'&lt;br /&gt;&lt;br /&gt;The following object(s) are masked from 'package:base':&lt;br /&gt;&lt;br /&gt;norm&lt;br /&gt;&lt;br /&gt;&gt; basicStats(tiempo)&lt;br /&gt;        tiempo&lt;br /&gt;nobs         66.000000&lt;br /&gt;NAs           0.000000&lt;br /&gt;Minimum          -44.000000&lt;br /&gt;Maximum       40.000000&lt;br /&gt;1. Quartile    24.000000&lt;br /&gt;3. Quartile   30.750000&lt;br /&gt;Mean                 26.212121&lt;br /&gt;Median             27.000000&lt;br /&gt;Sum                1730.000000&lt;br /&gt;SE Mean             1.322658&lt;br /&gt;LCL Mean        23.570591&lt;br /&gt;UCL Mean        28.853652&lt;br /&gt;Variance       115.462005&lt;br /&gt;Stdev               10.745325&lt;br /&gt;Skewness        -4.391574&lt;br /&gt;Kurtosis         25.518829&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;A primera vista podemos ver que hay mucha diferencia entre la media y la mediana, el recorrido es muy ancho y la asimetría elevada.&lt;br /&gt;&lt;br /&gt;Podemos calcular los límites para que un valor sea considerado como atípico (&lt;span style="font-style: italic;"&gt;outlier&lt;/span&gt;) con las bisagras (según Tukey)&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;LowerHinge - 1.5*(UH-LH), UpperHinge + 1.5*(UH-LH)&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&gt; lh &lt;- fivenum(tiempo)[2]  &lt;br&gt;&lt;br /&gt;&gt; uh &lt;- fivenum(tiempo)[4] &lt;br&gt;&lt;br /&gt;&gt; iqr &lt;- uh - lh  &lt;br&gt;&lt;br /&gt;&gt; c(lh,uh) + c(-1,1)*1.5*iqr &lt;br&gt;&lt;br /&gt;[1] 13.5 41.5&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;o con los cuartiles:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;Q1 - 1.5*IQR, Q3 + 1.5*IQR&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&gt; q1 &lt;- as.numeric(quantile(tiempo,0.25)) &lt;br&gt;&lt;br /&gt;&gt; q3 &lt;- as.numeric(quantile(tiempo,0.75)) &lt;br&gt;&lt;br /&gt;&gt; c(q1,q3) + c(-1,1)*1.5*IQR(tiempo) &lt;br&gt;&lt;br /&gt;[1] 13.875 40.875&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;En cualquier caso resulta evidente que los valores –44 y –2 son atípicos. El tratamiento de los outliers es otro de los asuntos que requieren un poco de sentido común. Algunas veces los valores atípicos tienen un especial interés como evidencia de un suceso extraordinario. Un valor atípico en la distribución del brillo observado por un satélite de vigilancia puede representar el lanzamiento de un misil. Un valor atípico en la distribución de las alturas puede mostrar a un jugador de baloncesto. En estos casos la distribución general muestra la rutina o la normalidad, mientras que los sucesos extraordinarios caen fuera. Pero Newcomb esperaba una distribución bien formada, con un claro centro y, en cambio, dos valores atípicos molestaban.&lt;br /&gt;&lt;br /&gt;Cuando los valores atípicos son sorprendentes o inesperados, en primer lugar, hemos de buscar la causa o explicación, tal como un error del equipo de medida o un error de escritura del dato. Casi todos los grandes conjuntos de datos contienen errores, con frecuencia por erratas al entrar los datos en el archivo informático. Los valores atípicos sirven para detectar estos errores y corregirlos al repasar los datos originales. Si el equipo de medida falla o alguna otra condición anormal ha provocado el valor atípico, entonces debemos borrar el dato sin ningún problema. También el valor atípico puede evidenciar una extraordinaria incidencia o una inesperada variabilidad de los datos.&lt;br /&gt;&lt;br /&gt;Newcomb, finalmente, despreció el más pequeño de los valores (–44) y retuvo los otros. El basó su estimación de la velocidad de la luz en el término medio (la media) de sus observaciones. La media de las 66 observaciones es 26.21; la media de las 65 retenidas es 27.29. El fuerte efecto de un único valor –44 sobre la media es un motivo para descartarlo, cuando nuestro interés es el centro de la distribución como un todo.&lt;br /&gt;&lt;br /&gt;Para estos datos, la media recortada al 5% es 27.4.&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&gt; mean(tiempo)&lt;br /&gt;[1] 26.21212&lt;br /&gt;&lt;br /&gt;&gt; mean(tiempo[-6])&lt;br /&gt;[1] 27.29231&lt;br /&gt;&lt;br /&gt;&gt; mean(tiempo, trim=0.05)&lt;br /&gt;[1] 27.4&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;La mediana es directamente 27 o puede subir a 27,5 si suprimimos los dos valores negativos.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&gt; median(tiempo)&lt;br /&gt;[1] 27&lt;br /&gt;&lt;br /&gt;&gt; median(tiempo[-c(6,10)])&lt;br /&gt;[1] 27.5&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Todavía podemos contemplar los datos de Newcomb con otro gráfico. Cuando los datos representan observaciones similares tomadas a lo largo del tiempo, es bastante sensato dibujarlas con el tiempo o el orden temporal en que las observaciones fueron hechas.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-h1_f3dX6nPE/TVXARsaY_3I/AAAAAAAABLE/C_QyW8KohYE/s1600/newcomb.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 400px;" src="http://2.bp.blogspot.com/-h1_f3dX6nPE/TVXARsaY_3I/AAAAAAAABLE/C_QyW8KohYE/s400/newcomb.png" alt="" id="BLOGGER_PHOTO_ID_5572571524153016178" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;La figura dibuja los lapsos de tiempo de Newcomb con su orden de recogida. El gráfico contiene una cierta sugerencia en el sentido de que la variabilidad (la anchura vertical del gráfico) disminuye con el tiempo. En particular, las dos observaciones atípicas fueron hechas muy pronto. Puede que él ganara experiencia y se hizo más hábil en la utilización de su aparato. Los efectos del aprendizaje, como en este caso, son bastante comunes. Si dejamos a Newcomb 20 observaciones para aprender, la media de los 46 restantes es 28.15.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&gt; mean(tiempo[-(1:20)])&lt;br /&gt;[1] 28.15217&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Las medidas más modernas sugieren que el "verdadero valor" del lapso de tiempo medido por el experimento de Newcomb es 33.02. Eliminar los valores atípicos o permitir un período de aprendizaje no mueven el término medio más cerca del valor cierto. En todo caso, los ajustes basados sólo en criterios subjetivos son sospechosos. Si es posible, siempre es necesario hallar la razón de un valor atípico.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4200017933558803500-1516676250048645044?l=erre-que-erre-paco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://erre-que-erre-paco.blogspot.com/feeds/1516676250048645044/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://erre-que-erre-paco.blogspot.com/2011/02/la-velocidad-de-la-luz-3.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4200017933558803500/posts/default/1516676250048645044'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4200017933558803500/posts/default/1516676250048645044'/><link rel='alternate' type='text/html' href='http://erre-que-erre-paco.blogspot.com/2011/02/la-velocidad-de-la-luz-3.html' title='La velocidad de la luz (3)'/><author><name>Paco</name><uri>http://www.blogger.com/profile/05414727581731452919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_Lsnfr2zsR8A/SwkQF-4sS9I/AAAAAAAAA0c/GGwOyuhdv68/S220/francesc.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-h1_f3dX6nPE/TVXARsaY_3I/AAAAAAAABLE/C_QyW8KohYE/s72-c/newcomb.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4200017933558803500.post-9130953624850417107</id><published>2010-11-19T20:05:00.001+01:00</published><updated>2010-11-19T20:10:24.156+01:00</updated><title type='text'>La velocidad de la luz (2)</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_Lsnfr2zsR8A/TOa58XOUqEI/AAAAAAAABKk/wzJWice3VXk/s1600/histogramas.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 400px;" src="http://2.bp.blogspot.com/_Lsnfr2zsR8A/TOa58XOUqEI/AAAAAAAABKk/wzJWice3VXk/s400/histogramas.png" alt="" id="BLOGGER_PHOTO_ID_5541320838203353154" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-size:85%;"&gt;Figura 1. Diferentes histogramas con los 66 datos de Newcomb.&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;        &lt;br /&gt;La primera observación evidente sobre los datos de Newcomb es que éstos varían. ¿Porqué? Se supone que, sobre todo, cada observación se hizo con el mismo patrón, medida por un observador cualificado y con el mismo aparato cada vez. Newcomb sabía, y nosotros también, que las medidas más precisas casi siempre varían. El entorno de cada medida es ligeramente diferente. El aparato cambia un poco con la temperatura, la densidad de la atmósfera también cambia de un día a otro, y así con otros detalles. Newcomb hizo lo que pudo para eliminar las fuentes de variación que podía anticipar y su experimento 0btuvo unas observaciones con menos variación que las de los científicos anteriores. Pero incluso el mejor experimento produce resultados variables. Por ello Newcomb tomó muchas medidas y no sólo una. La media de los 66 valores es menos variable que el resultado de una única medida, la media no depende tanto de la temperatura y la densidad atmosférica como una sola observación.&lt;br /&gt;&lt;br /&gt;Si nos ponemos ahora en el lugar de Newcomb, estaremos tentados por calcular la media de los datos, convertir esta velocidad en una nueva y mejor estimación de la velocidad de la luz y salir corriendo para incrementar nuestra reputación al publicar el resultado. La tentación de hacer un cálculo rutinario y anunciar la respuesta se presenta siempre que los datos han sido recogidos para contestar una cuestión específica. Las computadoras son muy buenas para los cálculos rutinarios, de manera que sucumbir a la tentación es un camino fácil. El primer paso hacia la sofisticación estadística es resistir la tentación de calcular sin pensar. Como la variabilidad está presente en cualquier conjunto de datos, debemos primero examinar la naturaleza de la variación y, en algunos casos, quedaremos sorprendidos por lo que veremos.&lt;p&gt;&lt;/p&gt;&lt;h2&gt;La distribución&lt;/h2&gt; &lt;p&gt;&lt;i&gt;El patrón de variación de una variable es su distribución. La distribución presenta los valores numéricos que toma una variable y la frecuencia con la que cada valor ocurre.&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;La mejor manera de observar una distribución es representarla gráficamente. Conocemos varias técnicas gráficas para representar los datos de Newcomb. En particular el histograma.&lt;/p&gt;          &lt;p&gt;Para hacer un histograma, se procede en tres pasos:&lt;/p&gt; &lt;ol&gt;&lt;li&gt;Se divide el rango de los datos en clases, casi siempre de la misma longitud. &lt;/li&gt;&lt;br /&gt;&lt;li&gt;Se cuenta el número de observaciones  que caen en cada clase, es decir, las frecuencias  absolutas y se construye la  tabla de frecuencias.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Se dibuja el histograma.&lt;/li&gt;&lt;/ol&gt;  &lt;p&gt;Como el propósito de un histograma es mostrar la forma de una distribución,  debemos estar muy atentos a los aspectos más visuales del gráfico. Nuestros ojos responden al área de las barras, de forma que ésta ha de ser proporcional a la frecuencia de la clase.&lt;/p&gt; &lt;p&gt;Ahora bien, antes de dibujar un histograma hay que decidir el número de clases, y eso es  cuestión de opiniones.&lt;/p&gt;&lt;p&gt;La figura 1 se ha creado con el siguiente código:&lt;/p&gt;&lt;code&gt;tiempo &lt;- Newcomb$Time*10^9 - 24800&lt;br /&gt;&lt;br /&gt;png("histogramas.png") &lt;br /&gt;oldpar &lt;- par(mfrow=c(2,2))    &lt;br /&gt;&lt;br /&gt;hist.a &lt;- hist(tiempo, breaks=-60+5*1:25, main=NULL, xlab="Tiempo (a)", ylab="Frecuencia", lim=c(0,30), col="grey") &lt;br /&gt;text(hist.a$mids, hist.a$counts, labels=ifelse(hist.a$counts==0,"",hist.a$counts), pos=3)     &lt;br /&gt;&lt;br /&gt;hist.b &lt;- hist(tiempo, breaks=-52.5+5*1:25, main=NULL, xlab="Tiempo (b)", ylab="Frecuencia", ylim=c(0,30), col="grey") &lt;br /&gt;text(hist.b$mids, hist.b$counts, labels=ifelse(hist.b$counts==0,"",hist.b$counts), pos=3)    &lt;br /&gt;&lt;br /&gt;hist.c &lt;- hist(tiempo, breaks=c(-44,-33.5,-23,-12.5,-2,8.5,19,29.5,40,50.5), main=NULL, xlab="Tiempo (c)", ylab="Frecuencia", ylim=c(0,45), col="grey") &lt;br /&gt;text(hist.c$mids, hist.c$counts, labels=ifelse(hist.c$counts==0,"",hist.c$counts), pos=3)    &lt;br /&gt;&lt;br /&gt;hist.d &lt;- hist(tiempo, breaks=-60+10*1:12, main=NULL, xlab="Tiempo (d)", ylab="Frecuencia", ylim=c(0,45), col="grey") &lt;br /&gt;text(hist.d$mids, hist.d$counts, labels=ifelse(hist.d$counts==0,"",hist.d$counts), pos=3)    &lt;br /&gt;&lt;br /&gt;par(oldpar) &lt;br /&gt;dev.off()  &lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Los histogramas de la figura 1 son diferentes en función de les clases que formemos.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;En  el caso (a) el histograma está formado con los intervalos&lt;br /&gt;]-60,-55], ]-55,-50],...  de anchura 5 y marca de clase en los puntos  –57.5,&lt;br /&gt;-52.5,..., -2.5, 2.5,..., 52.5, 57.5.  &lt;/li&gt;&lt;br /&gt;&lt;li&gt;En (b)  el histograma está formado con los intervalos&lt;br /&gt;]-52.5,-47.5],  ]-47.5,-42.5],...,  también con una longitud de 5 y con las marcas de clase en los  valores -50, -45,...,  -5, 0, 5,...,60. &lt;/li&gt;&lt;br /&gt;&lt;li&gt;Si  nosotros no decidimos los límites de los intervalos, la macro de Excel  “Análisis de datos:Histograma” proporciona el gráfico (c).  La anchura de los intervalos es 10.5 y el límite inferior del primer  intervalo es el valor mínimo –44. El programa de Estadística SPSS construye un histograma con las marcas de clase -40, -30,..., -10, 0, 10,..., 40 y, por tanto, intervalos de longitud 10.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Cuando consideramos intervalos de anchura 10 y centrados con marcas de clase -55, -45,..., -5, 5,..., 55, tenemos el histograma (d).&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;Los histogramas anteriores tienen la característica común de que todos los intervalos son de la misma longitud. Con estos datos podríamos  considerar un primer intervalo, como por ejemplo ]-45,-15]  que tiene una frecuencia absoluta de 2, y dibujar una barra con  la altura de manera que el área sea proporcional a 2.&lt;br /&gt;&lt;code&gt;&lt;br /&gt;hist.e &lt;- hist(tiempo, breaks=c(-45,15,20,25,30,35,40), main=NULL, xlab="Tiempo (e)", ylab="Frecuencia", ylim=c(0,0.09), col="grey")&lt;br /&gt;text(hist.e$mids, hist.e$intensities, labels=ifelse(hist.e$counts==0,"",hist.e$counts), pos=3)&lt;br /&gt;lines(density(tiempo)) &lt;/code&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_Lsnfr2zsR8A/TObFhZg7mxI/AAAAAAAABKs/bKptX8bJd9I/s1600/histogramas.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 400px;" src="http://1.bp.blogspot.com/_Lsnfr2zsR8A/TObFhZg7mxI/AAAAAAAABKs/bKptX8bJd9I/s400/histogramas.png" alt="" id="BLOGGER_PHOTO_ID_5541333569101339410" border="0" /&gt;&lt;/a&gt;          Otro tipo de gráfico que podemos utilizar con estos datos es el gráfico de tallo y hojas (stem and leaf):&lt;br /&gt;&lt;code&gt;&lt;br /&gt;stem(tiempo)&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;El resultado es, más o menos, así:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_Lsnfr2zsR8A/TObH4zoMB5I/AAAAAAAABK0/eZ2F7iSBZEw/s1600/Captura.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 217px;" src="http://4.bp.blogspot.com/_Lsnfr2zsR8A/TObH4zoMB5I/AAAAAAAABK0/eZ2F7iSBZEw/s400/Captura.png" alt="" id="BLOGGER_PHOTO_ID_5541336170271344530" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;La construcción de este gráfico no es tan arbitraria como el histograma y permite la reproducción de los datos originales.&lt;br /&gt;&lt;br /&gt;Cualquier científico de laboratorio sabe que incluso las medidas más precisas varían, pero espera una distribución simétrica y con un único pico. Entonces el mejor estimador del verdadero valor de la cantidad medida es el centro de la distribución. Los histogramas y el gráfico de tallo y hojas muestran que Newcomb no fue afortunado, ya que los datos contienen valores atípicos (outliers). ¿Qué hay que hacer con ellos?&lt;br /&gt;&lt;br /&gt;(continuará)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4200017933558803500-9130953624850417107?l=erre-que-erre-paco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://erre-que-erre-paco.blogspot.com/feeds/9130953624850417107/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://erre-que-erre-paco.blogspot.com/2010/11/la-velocidad-de-la-luz-2.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4200017933558803500/posts/default/9130953624850417107'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4200017933558803500/posts/default/9130953624850417107'/><link rel='alternate' type='text/html' href='http://erre-que-erre-paco.blogspot.com/2010/11/la-velocidad-de-la-luz-2.html' title='La velocidad de la luz (2)'/><author><name>Paco</name><uri>http://www.blogger.com/profile/05414727581731452919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_Lsnfr2zsR8A/SwkQF-4sS9I/AAAAAAAAA0c/GGwOyuhdv68/S220/francesc.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_Lsnfr2zsR8A/TOa58XOUqEI/AAAAAAAABKk/wzJWice3VXk/s72-c/histogramas.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4200017933558803500.post-5911162812526401420</id><published>2010-11-16T10:04:00.009+01:00</published><updated>2010-11-16T12:29:51.813+01:00</updated><title type='text'>La velocidad de la luz (1)</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_Lsnfr2zsR8A/TOJKYeYVjUI/AAAAAAAABKM/9O72H6QOgrs/s1600/225px-Simon_Newcomb.jpg"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 225px; height: 267px;" src="http://3.bp.blogspot.com/_Lsnfr2zsR8A/TOJKYeYVjUI/AAAAAAAABKM/9O72H6QOgrs/s400/225px-Simon_Newcomb.jpg" alt="" id="BLOGGER_PHOTO_ID_5540072275951586626" border="0" /&gt;&lt;/a&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:arial;"&gt;Simon Newcomb&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;Los viajes de la luz son rápidos, pero no instantáneos. La luz tarda alrededor de un segundo en llegar desde la luna y sobre 10 billones de años desde el objeto más distante que se ha observado en nuestro expansivo universo. Como la radio y el radar también viajan a la velocidad de la luz, un valor ajustado de esta velocidad es muy importante para la comunicación con los astronautas y los satélites en órbita. Un valor ajustado de la velocidad de la luz también es muy importante para los diseñadores de computadoras, ya que las señales eléctricas viajan a esta velocidad.&lt;br /&gt;La primera medida razonablemente ajustada de la velocidad de la luz se hizo hace más de 100 años gracias a los experimentos de A. A. Michelson y &lt;a href="http://en.wikipedia.org/wiki/Simon_Newcomb"&gt;Simon Newcomb&lt;/a&gt;. La siguiente tabla contiene las 66 medidas hechas por Newcomb entre julio y septiembre de 1882.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-family:courier new;"&gt; 28 22 36 26 28 28&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt; 26 24 32 30 27 24&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt; 33 21 36 32 31 25&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt; 24 25 28 36 27 32&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt; 34 30 25 26 26 25&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;-44 23 21 30 33 29&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt; 27 29 28 22 26 27&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt; 16 31 29 36 32 28&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt; 40 19 37 23 32 29&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt; -2 24 25 27 24 16&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt; 29 20 28 27 39 23&lt;/span&gt;&lt;br /&gt;Tabla. Medidas de Newcomb del lapso de la luz&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Un conjunto de datos como estos no tiene sentido sin la información sobre su contexto. Debemos contestar algunas preguntas iniciales sobre cualquier conjunto de datos. Primero, ¿qué variable se está midiendo? Newcomb midió cuanto tiempo tardaba la luz en ir y volver desde su laboratorio en el río Potomac hasta un espejo en la base del monumento a Washington, una distancia de aproximadamente 7400 metros. Tal como nosotros calculamos la velocidad de un coche como el tiempo necesario para recorrer un kilómetro, Newcomb calculó la velocidad de la luz a partir del tiempo de ese viaje.&lt;br /&gt;Contestar la pregunta “¿Qué variable se está midiendo?” requiere una descripción del instrumento utilizado para hacer la medida. Entonces podremos juzgar si la variable medida es apropiada para nuestro propósito. Este juicio frecuentemente pide un conocimiento de experto en el campo particular de estudio. Por ejemplo, Newcomb inventó un nuevo y complicado aparato para medir el lapso de la luz. Nosotros como estadísticos aceptamos el juicio de los físicos en el sentido de que este instrumento es apropiado para la tarea encomendada y más preciso que los instrumentos anteriores.&lt;br /&gt;El estudio de Newcomb de la velocidad de la luz mide una variable claramente definida y fácilmente comprensible. Preguntas sobre las medidas son mucho más difíciles de contestar en los campos de las Ciencias Sociales y Económicas que en las Físicas. Nosotros nos podemos poner de acuerdo fácilmente en el tipo de medida apropiado para calcular la altura de una persona, pero ¿como medimos la inteligencia?&lt;br /&gt;Los usuarios de datos deberían ser conscientes de que considerar los números con su valor nominal, sin pensar en la variable medida y el proceso utilizado para medirla, puede producir serias malinterpretaciones.&lt;br /&gt;&lt;br /&gt;Las dos preguntas que faltan sobre cualquier conjunto de datos deberían contestarse con mayor senzillez: ¿Cuales son las unidades de medida? y ¿Como están registrados los datos?&lt;br /&gt;&lt;br /&gt;El paquete &lt;span style="font-family: arial;"&gt;MASS&lt;/span&gt; contiene la base de datos &lt;span style="font-family: courier new;"&gt;newcomb&lt;/span&gt; con los datos de la tabla anterior, pero desordenados. Es mejor obtener los datos originales en la siguiente dirección:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://people.reed.edu/%7Ejones/141/Newcomb.html"&gt;http://people.reed.edu/~jones/141/Newcomb.html&lt;br /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;La primera medida de Newcomb del lapso de la luz fué 0,000024828 segundos. De manera que su unidad de medida fueron los segundos. Pero los valores de la tabla inicial no se parecen a 0,000024828. Estos números son incómodos de escribir y difíciles de tratar aritméticamente. En consecuencia nosotros hemos movido la coma decimal nueve posiciones a la derecha, esto es 24828, y hemos registrado únicamente la desviación respecto a 24800. Así pues, 28 es el resumen de 0,000024828  y  –2 significa 0,000024798. Este procedimiento  se conoce como &lt;span style="font-style: italic;"&gt;codificación de los datos&lt;/span&gt;. Se debe codificar cuando los datos originales contienen muchas cifras de las cuales sólo algunas varían de observación en observación. Los datos codificados son más fáciles de leer. Además, si utilizamos una calculadora o una computadora, reducir el número de cifras mejora los cálculos aritméticos y su precisión.&lt;br /&gt;Ahora que hemos entendido lo que significan los datos de la tabla y su procedencia, podemos empezar a mirarlos más de cerca y estudiarlos más a fondo. En cualquier caso, y aunque parezca que los datos ya se entienden, conviene siempre contestar las tres preguntas preliminares.&lt;br /&gt;&lt;br /&gt;(continuará...)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Bibliografía&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;D.S. Moore &amp;amp; G.P. McCabe, &lt;span style="font-style: italic;"&gt;Introduction to the Practice of Statistics&lt;/span&gt;, W.H. Freeman &amp;amp; Company.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4200017933558803500-5911162812526401420?l=erre-que-erre-paco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://erre-que-erre-paco.blogspot.com/feeds/5911162812526401420/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://erre-que-erre-paco.blogspot.com/2010/11/la-velocidad-de-la-luz-1.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4200017933558803500/posts/default/5911162812526401420'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4200017933558803500/posts/default/5911162812526401420'/><link rel='alternate' type='text/html' href='http://erre-que-erre-paco.blogspot.com/2010/11/la-velocidad-de-la-luz-1.html' title='La velocidad de la luz (1)'/><author><name>Paco</name><uri>http://www.blogger.com/profile/05414727581731452919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_Lsnfr2zsR8A/SwkQF-4sS9I/AAAAAAAAA0c/GGwOyuhdv68/S220/francesc.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_Lsnfr2zsR8A/TOJKYeYVjUI/AAAAAAAABKM/9O72H6QOgrs/s72-c/225px-Simon_Newcomb.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4200017933558803500.post-7113880099537542760</id><published>2010-11-01T17:10:00.006+01:00</published><updated>2010-11-01T18:37:15.787+01:00</updated><title type='text'>Instalar R y Bioconductor en Ubuntu</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_Lsnfr2zsR8A/TM7pLGJCW6I/AAAAAAAABKE/fij0wTzXCk0/s1600/Ubuntu-bioconductor.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 298px;" src="http://3.bp.blogspot.com/_Lsnfr2zsR8A/TM7pLGJCW6I/AAAAAAAABKE/fij0wTzXCk0/s400/Ubuntu-bioconductor.png" alt="" id="BLOGGER_PHOTO_ID_5534617368921267106" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.bioconductor.org/images/logo_bioconductor.gif"&gt;&lt;/a&gt;&lt;br /&gt;Estos días he tenido que instalar Ubuntu en algunos ordenadores portátiles del departamento. Como es habitual los portátiles vienen con Windows 7 instalado, pero a la mayoría de compañeros y compañeras nos gusta trabajar con Linux y su distribución más popular es Ubuntu o Kubuntu (versión de Ubuntu con el escritorio KDE). La verdad es que ya quedan muy lejos los días en los que era muy difícil instalar una distribución de Linux. Ahora con &lt;a href="http://www.ubuntu.com/desktop/get-ubuntu/download"&gt;Ubuntu&lt;/a&gt; es realmente muy sencillo.&lt;br /&gt;Después de instalar el sistema operativo y sus aplicaciones por defecto, llega la hora de instalar las aplicaciones para trabajar en serio y, entre ellas, nuestro amado R. La cosa es tan sencilla como ir al &lt;span style="font-weight: bold;font-family:arial;" &gt;Centro de software de Ubuntu&lt;/span&gt; del menú &lt;span style="font-family:arial;"&gt;Aplicaciones&lt;/span&gt; y buscar en el apartado de &lt;span style="font-family:arial;"&gt;Ciencia e ingeniería&lt;/span&gt; -&gt; &lt;span style="font-family:arial;"&gt;Matemáticas&lt;/span&gt; el famoso programa R Commander o, como alternativa RKWard (mejor en Kubuntu). Se instalan con un sólo click. Fabuloso.&lt;br /&gt;Sin embargo, si deseamos tener siempre la última versión, es mejor añadir el repositorio oficial del R-project a nuestro conjunto de fuentes de programas. Para ello seguiremos las instrucciones del siguiente enlace&lt;span style="text-decoration: underline;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div style="text-align: center;"&gt;&lt;span style="text-decoration: underline;"&gt;&lt;/span&gt;&lt;a href="http://cran.es.r-project.org/bin/linux/ubuntu/"&gt;http://cran.es.r-project.org/bin/linux/ubuntu/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;Si no hay ninguna dificultad, así tendremos la última versión, tanto para 32 como para 64 bits, y cuando salga la siguiente el propio sistema de Ubuntu nos avisará para actualizarnos.&lt;br /&gt;El único detalle que puede sorprender al principio es la utilización de un APT seguro con las claves de Vincent Goulet. Basta con ejecutar las dos instrucciones que se muestran en una Terminal y ya está.&lt;br /&gt;&lt;br /&gt;Una vez instalados todos los paquetes de R, ya que siempre se necesita alguno de ellos, queremos instalar Bioconductor.&lt;br /&gt;Bioconductor es un conjunto de paquetes de R, más de 400, para el análisis de datos de genómica que ha tenido un brillante desarrollo en los últimos años. De hecho, el proyecto de Bioconductor es uno de los más activos y ha impulsado notablemente el desarrollo del propio R.&lt;br /&gt;Instalar el Bioconductor básico es muy sencillo. En una sesión de R (mejor si la hemos iniciado como administrador, con &lt;span style="font-family:courier new;"&gt;"sudo R"&lt;/span&gt;), debemos introducir las instrucciones&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&gt; source("http://bioconductor.org/biocLite.R")&lt;br /&gt;&gt; biocLite()&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;Pero, tras esperar un buen rato que se bajen, descompriman y compilen un motón de paquetes, nuestra frustración será grande cuando veamos que algunos paquetes no se han instalado con un mensaje final del tipo&lt;br /&gt;&lt;br /&gt;&lt;code&gt;installation of package 'XML' had non-zero exit status&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;El problema es que la instalación por defecto de Ubuntu no permite compilar algunos paquetes de Bioconductor. La solución es instalar previamente todo el software necesario.&lt;br /&gt;En el &lt;a href="http://reidjf.wordpress.com/2010/07/21/installing-r-and-bioconductor-on-ubuntu-10-4/"&gt;blog de James Reid&lt;/a&gt; está muy bien explicado. Los paquetes de Ubuntu necesarios se instalan así:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;sudo apt-get install build-essential curl graphviz-dev  libcurl4-gnutls-dev libboost-dev libgd2-xpm-dev libglu1-mesa-dev  libgtk2.0-dev libmysqlclient-dev libxml2-dev mesa-common-dev  sun-java6-jdk unixodbc-dev&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;De paso, dejo estas instrucciones como recordatorio para nuestras propias instalaciones.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4200017933558803500-7113880099537542760?l=erre-que-erre-paco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://erre-que-erre-paco.blogspot.com/feeds/7113880099537542760/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://erre-que-erre-paco.blogspot.com/2010/11/instalar-r-y-bioconductor-en-ubuntu.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4200017933558803500/posts/default/7113880099537542760'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4200017933558803500/posts/default/7113880099537542760'/><link rel='alternate' type='text/html' href='http://erre-que-erre-paco.blogspot.com/2010/11/instalar-r-y-bioconductor-en-ubuntu.html' title='Instalar R y Bioconductor en Ubuntu'/><author><name>Paco</name><uri>http://www.blogger.com/profile/05414727581731452919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_Lsnfr2zsR8A/SwkQF-4sS9I/AAAAAAAAA0c/GGwOyuhdv68/S220/francesc.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_Lsnfr2zsR8A/TM7pLGJCW6I/AAAAAAAABKE/fij0wTzXCk0/s72-c/Ubuntu-bioconductor.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4200017933558803500.post-7702470181124631685</id><published>2010-06-08T18:16:00.005+02:00</published><updated>2010-06-08T19:12:43.083+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ggplot2'/><category scheme='http://www.blogger.com/atom/ns#' term='HistData'/><category scheme='http://www.blogger.com/atom/ns#' term='R'/><title type='text'>El paquete HistData</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_Lsnfr2zsR8A/TA5vH8HpDDI/AAAAAAAABJM/E5wqRBO4wwE/s1600/nt.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 400px;" src="http://1.bp.blogspot.com/_Lsnfr2zsR8A/TA5vH8HpDDI/AAAAAAAABJM/E5wqRBO4wwE/s400/nt.png" alt="" id="BLOGGER_PHOTO_ID_5480439978744417330" border="0" /&gt;&lt;/a&gt;Gracias a dos alumnos del postgrado de Bioestadística de la UOC he descubierto el paquete &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:arial;"&gt;HistData&lt;/span&gt;&lt;/span&gt; que contiene, entre otros, los datos de &lt;a href="http://erre-que-erre-paco.blogspot.com/2010/06/los-datos-de-florence-nightingale.html"&gt;Florence Nightingale&lt;/a&gt; y que utilicé en el artículo anterior.&lt;br /&gt;El paquete &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:arial;"&gt;HistData&lt;/span&gt;&lt;/span&gt; recoge algunos de los más famosos conjuntos de datos de la historia de la Estadística, como los datos de Sir Francis Galton que sirvieron para entrever la normal bivariante y los conceptos de correlación y regresión. Pero además, el paquete contiene la reproducción con R de gráficos famosos asociados a esos datos. De esta forma los docentes podemos hacer memoria histórica estadística, que siempre va bien.&lt;br /&gt;Así, debo rectificar parcialmente mi afirmación en el sentido de que no hay una función de &lt;span style="font-weight: bold;font-family:arial;" &gt;R&lt;/span&gt; que reproduzca el coxcomb o rosa de Nightingale. Si bien es estrictamente cierta, el código que acompaña los datos de Nightingale permite generar el gráfico que veis al principio de este artículo y que compara las frecuencias de soldados muertos por diversas causas, antes y después de aplicar las mejoras sanitarias.&lt;br /&gt;Este código utiliza el lenguaje gráfico del paquete &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:arial;"&gt;ggplot2&lt;/span&gt;&lt;/span&gt; que es una auténtica maravilla. Aprender este lenguaje no es trivial, pero si se domina se pueden hacer gráficos que combinan los mejores aspectos de los gráficos base de &lt;span style="font-weight: bold;font-family:arial;" &gt;R&lt;/span&gt; y los lattice. Ya tengo otro buen tema de estudio para este verano.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;data(Nightingale)&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;# For some graphs, it is more convenient to reshape death rates to long format&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;# keep only Date and death rates&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;require(reshape)&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;Night&lt;- Nightingale[,c(1,8:10)]&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;melted &lt;- melt(Night, "Date")&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;names(melted) &lt;- c("Date", "Cause", "Deaths")&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;melted$Cause &lt;- sub("\\.rate", "", melted$Cause)&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;melted$Regime &lt;- ordered( rep(c(rep('Before', 12), rep('After', 12)), 3), levels=c('Before','After')) &lt;/span&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;Night &lt;- melted&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;require(ggplot2)&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;cxc &lt;- ggplot(Night, aes(x = factor(Date), y=Deaths, fill = Cause)) +&lt;br /&gt;# do it as a stacked bar chart first&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;geom_bar(width = 1, position="identity", color="black") +&lt;br /&gt;# set scale so area ~ Deaths&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;scale_y_sqrt() +&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;facet_grid(. ~ Regime, scales="free", labeller=label_both)&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;# A coxcomb plot =  bar chart + polar coordinates&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;cxc + coord_polar(start=3*pi/2) +&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;opts(title="Causes of Mortality in the Army in the East") +&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;xlab("")&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;La idea fundamental es que un coxcomb es un diagrama de barras con áreas proporcionales a los datos y en coordenadas polares. Justamente su definición. ¡Fantástico!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4200017933558803500-7702470181124631685?l=erre-que-erre-paco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://erre-que-erre-paco.blogspot.com/feeds/7702470181124631685/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://erre-que-erre-paco.blogspot.com/2010/06/el-paquete-histdata.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4200017933558803500/posts/default/7702470181124631685'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4200017933558803500/posts/default/7702470181124631685'/><link rel='alternate' type='text/html' href='http://erre-que-erre-paco.blogspot.com/2010/06/el-paquete-histdata.html' title='El paquete HistData'/><author><name>Paco</name><uri>http://www.blogger.com/profile/05414727581731452919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_Lsnfr2zsR8A/SwkQF-4sS9I/AAAAAAAAA0c/GGwOyuhdv68/S220/francesc.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_Lsnfr2zsR8A/TA5vH8HpDDI/AAAAAAAABJM/E5wqRBO4wwE/s72-c/nt.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4200017933558803500.post-4958546549020553721</id><published>2010-06-03T10:03:00.015+02:00</published><updated>2010-06-06T10:56:42.798+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='componentes principales'/><category scheme='http://www.blogger.com/atom/ns#' term='correspondencias'/><category scheme='http://www.blogger.com/atom/ns#' term='R'/><title type='text'>Los datos de Florence Nightingale</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_Lsnfr2zsR8A/TAdiILNRoXI/AAAAAAAABIk/EmXmxRndfPA/s1600/FlorenceN.jpg"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 250px; height: 332px;" src="http://3.bp.blogspot.com/_Lsnfr2zsR8A/TAdiILNRoXI/AAAAAAAABIk/EmXmxRndfPA/s400/FlorenceN.jpg" alt="" id="BLOGGER_PHOTO_ID_5478455364306444658" border="0" /&gt;&lt;/a&gt;     &lt;style type="text/css"&gt;  &lt;!--   @page { margin: 2cm }   P { margin-bottom: 0.21cm }  --&gt;  &lt;/style&gt;  &lt;p style="margin-bottom: 0cm;"&gt;&lt;a href="http://es.wikipedia.org/wiki/Florence_Nightingale"&gt;&lt;b&gt;Florence Nightingale&lt;/b&gt;&lt;/a&gt; (Florencia, 12 de mayo de 1820 - Londres, 13 de septiembre de 1910), fue una enfermera británica considerada una de les pioneras en la práctica de la enfermería moderna y creadora del primer modelo conceptual de enfermería. Pero además destacó desde muy joven en matemáticas, aplicando después la estadística a la epidemiología y explotando la estadística sanitaria. Fue la primera mujer admitida en la &lt;i&gt;Royal Statistical Society&lt;/i&gt; británica, y miembro honorario de la &lt;i&gt;American Statistical Association&lt;/i&gt;.&lt;/p&gt;&lt;p style="margin-bottom: 0cm;"&gt;Sin embargo, esta mujer, estudiada y reconocida en enfermería, es poco conocida entre los estudiantes de estadística y de matemáticas. Con motivo del pasado Día Internacional de la Mujer (8 de marzo) compartí con Carmina Olivé un acto de CCOO en la Universitat Politècnica de Catalunya (conjunto con la UB) en la que ella explicó su importancia en la enfermería moderna y yo glosé sus dotes científico-matemáticas-estadísticas. Voy a explicar brevemente mis argumentos.&lt;br /&gt;&lt;/p&gt;&lt;p style="margin-bottom: 0cm;"&gt;&lt;/p&gt;&lt;p style="margin-bottom: 0cm;"&gt;A través de su trabajo como enfermera en &lt;a href="http://understandinguncertainty.org/node/204"&gt;guerra de Crimea&lt;/a&gt;, Florence Nightingale fue pionera al establecer la importancia de la higiene en los hospitales, en particular los hospitales de campaña. Ella reunió muchos datos en relación al coste en vidas por la falta de limpieza y, con sus gráficos y razonamientos matemáticos, también fue una avanzada en estadística aplicada. Con todo ello consiguió convencer a las autoridades de la época y, en especial, a los entonces muy obtusos militares para mejorar las condiciones sanitarias de los hospitales militares y civiles.&lt;/p&gt;&lt;p style="margin-bottom: 0cm;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_Lsnfr2zsR8A/TAdsK5pRoeI/AAAAAAAABIs/CX758s27pUg/s1600/Coxcombs.jpg"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 266px;" src="http://2.bp.blogspot.com/_Lsnfr2zsR8A/TAdsK5pRoeI/AAAAAAAABIs/CX758s27pUg/s400/Coxcombs.jpg" alt="" id="BLOGGER_PHOTO_ID_5478466406247932386" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p style="margin-bottom: 0cm;"&gt;Entre los resultados estadísticos de Nightingale el más famoso es este gráfico, conocido como coxcomb o rosa de Nightingale, en el que se comparan los datos de soldados muertos por diversas causas, antes y después de aplicar las mejoras sanitarias en los hospitales.&lt;/p&gt;&lt;p style="margin-bottom: 0cm;"&gt;Una versión más moderna y dinámica de este gráfico se puede hallar en el siguiente enlace:&lt;/p&gt;&lt;p style="margin-bottom: 0cm;"&gt;&lt;a href="http://understandinguncertainty.org/node/213"&gt;http://understandinguncertainty.org/node/213&lt;/a&gt;&lt;/p&gt;&lt;p style="margin-bottom: 0cm;"&gt;y las matemáticas y los datos para generar dicho gráfico se pueden consultar aquí:&lt;/p&gt;&lt;p style="margin-bottom: 0cm;"&gt;&lt;a href="http://understandinguncertainty.org/node/214"&gt;http://understandinguncertainty.org/node/214&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style="margin-bottom: 0cm;"&gt;Por desgracia y que yo sepa, &lt;span style="font-weight: bold;font-family:arial;" &gt;R&lt;/span&gt; no dispone de este tipo de gráfico. Llegados a este punto y, aunque hay algunas técnicas univariantes descriptivas para ayudar a Florence Nightingale, vamos a utilizar &lt;span style="font-weight: bold;font-family:arial;" &gt;R&lt;/span&gt; y un par de técnicas multivariantes para describir sus datos.&lt;/p&gt;&lt;p style="margin-bottom: 0cm;"&gt;La enfermera Nightingale recogió el número de soldados muertos por diversas causas: &lt;span style="font-style: italic;"&gt;Zymotic diseases&lt;/span&gt; (ZD), &lt;span style="font-style: italic;"&gt;Wounds &amp;amp; injuries&lt;/span&gt; (WI) y &lt;span style="font-style: italic;"&gt;All other causes&lt;/span&gt; (OC), con ellos  calculó unos índices de mortalidad anual relativa por cada 1000. Son precisamente esos  índices los que vamos a utilizar como variables para un análisis de componentes principales.&lt;/p&gt;&lt;br /&gt;&lt;code&gt;&lt;/code&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;dades &lt;- read.table(file="dades.csv",header=T,sep=";")&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;dades$treatment &lt;- factor(c(rep(0,12),rep(1,12)))&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;levels(dades$treatment) &lt;- c("No", "Yes")&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;&lt;br /&gt;dades$active &lt;- dades$size - (dades$zymotic_diseases + dades$wounds.injuries + dades$all_other)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;dades$zymotic_diseases_ar &lt;- dades$zymotic_diseases*12000/dades$size&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;dades$wounds.injuries_ar &lt;- dades$wounds.injuries*12000/dades$size &lt;/span&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;dades$all_other_ar &lt;- dades$all_other*12000/dades$size&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;&lt;br /&gt;attach(dades) &lt;/span&gt;&lt;/span&gt;&lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;library(FactoMineR)&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;&lt;br /&gt;dades.res &lt;- dades[8:11]&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;&lt;br /&gt;rownames(dades.res) &lt;- idx&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;res.pca &lt;- PCA(dades.res, quali.sup = 1)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;plot(res.pca,habillage=1)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-bottom: 0cm;"&gt;Con este código se obtiene el siguiente gráfico que se explica con mucha facilidad:&lt;/p&gt;&lt;p  style="margin-bottom: 0cm;font-family:times new roman;"&gt;&lt;span style="font-size:100%;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_Lsnfr2zsR8A/TAd_Fg0ECTI/AAAAAAAABI0/gmbXLl21Olw/s1600/PCA_var.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 392px;" src="http://4.bp.blogspot.com/_Lsnfr2zsR8A/TAd_Fg0ECTI/AAAAAAAABI0/gmbXLl21Olw/s400/PCA_var.png" alt="" id="BLOGGER_PHOTO_ID_5478487204403874098" border="0" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-bottom: 0cm;"&gt;En él observamos que, si bien el primer eje admite la típica explicación de &lt;span style="font-style: italic;"&gt;tamaño&lt;/span&gt;, en este caso depende básicamente de la causa evitable ZD y de OC (menos importante). El otro eje se explica con la variable WI.&lt;/p&gt;&lt;p style="margin-bottom: 0cm;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_Lsnfr2zsR8A/TAeD9z8sccI/AAAAAAAABI8/-Jz4TDecCUw/s1600/PCAplot.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 400px;" src="http://1.bp.blogspot.com/_Lsnfr2zsR8A/TAeD9z8sccI/AAAAAAAABI8/-Jz4TDecCUw/s400/PCAplot.png" alt="" id="BLOGGER_PHOTO_ID_5478492569659535810" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p style="margin-bottom: 0cm;"&gt;En el gráfico con los 24 meses observados sobre las dos primeras componentes principales, donde los 12 primeros son antes de aplicar sus nuevos métodos de cuidado en los hospitales militares, observamos que los meses con el tratamiento se sitúan claramente a la izquierda, indicando la mejora en las muertes por causas evitables.&lt;/p&gt;&lt;p style="margin-bottom: 0cm;"&gt;Por otra parte, y como los datos iniciales son frecuencias, podemos realizar un análisis de correspondencias tomando los meses como perfiles.&lt;/p&gt;&lt;p  style="margin-bottom: 0cm;font-family:courier new;"&gt;&lt;span style="font-size:85%;"&gt;tabla &lt;- data.frame(zymotic_diseases, wounds.injuries, all_other, active)&lt;br /&gt;library(ca)&lt;br /&gt;my.ca &lt;- ca(tabla)&lt;br /&gt;plot(my.ca, map="rowprincipal", xlim=c(-0.2,0.8), ylim=c(-0.2,0.2))&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-bottom: 0cm;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_Lsnfr2zsR8A/TAeNQRhySCI/AAAAAAAABJE/4IVzgZGuhVg/s1600/CAplot.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 400px;" src="http://1.bp.blogspot.com/_Lsnfr2zsR8A/TAeNQRhySCI/AAAAAAAABJE/4IVzgZGuhVg/s400/CAplot.png" alt="" id="BLOGGER_PHOTO_ID_5478502782442031138" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p style="margin-bottom: 0cm;"&gt;El resultado es similar. La explicación de los ejes que proporcionan los vértices (causas de mortalidad) es la misma que con el PCA e indica que la mejora en el tratamiento de las enfermedades en los hospitales hace que dichos meses estén a la izquierda. El único detalle es que en el gráfico se ha tenido que hacer un zoom sobre los puntos, ya que todos ellos quedaban fuertemente agrupados junto al vértice de "activos" que es el más pesado (el triángulo rojo del gráfico).&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4200017933558803500-4958546549020553721?l=erre-que-erre-paco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://erre-que-erre-paco.blogspot.com/feeds/4958546549020553721/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://erre-que-erre-paco.blogspot.com/2010/06/los-datos-de-florence-nightingale.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4200017933558803500/posts/default/4958546549020553721'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4200017933558803500/posts/default/4958546549020553721'/><link rel='alternate' type='text/html' href='http://erre-que-erre-paco.blogspot.com/2010/06/los-datos-de-florence-nightingale.html' title='Los datos de Florence Nightingale'/><author><name>Paco</name><uri>http://www.blogger.com/profile/05414727581731452919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_Lsnfr2zsR8A/SwkQF-4sS9I/AAAAAAAAA0c/GGwOyuhdv68/S220/francesc.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_Lsnfr2zsR8A/TAdiILNRoXI/AAAAAAAABIk/EmXmxRndfPA/s72-c/FlorenceN.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4200017933558803500.post-7130419352928047484</id><published>2010-05-16T22:02:00.008+02:00</published><updated>2010-06-06T11:04:03.935+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='R'/><title type='text'>Discriminador lineal de Fisher</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_Lsnfr2zsR8A/S_BVujlsASI/AAAAAAAABIA/eKNTrkBJj9Y/s1600/Rplot1.png"&gt;&lt;br /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_Lsnfr2zsR8A/S_BPZz_jRSI/AAAAAAAABH4/Jedy5AD0VEA/s1600/Dos_normales.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 400px;" src="http://1.bp.blogspot.com/_Lsnfr2zsR8A/S_BPZz_jRSI/AAAAAAAABH4/Jedy5AD0VEA/s400/Dos_normales.png" alt="" id="BLOGGER_PHOTO_ID_5471960852127237410" border="0" /&gt;&lt;/a&gt;Supongamos que queremos discriminar los datos entre dos poblaciones normales con diferente vector de medias y la misma matriz de covarianzas. Vamos a ver como hacerlo en el caso bivariante ya que así podemos representar el problema gráficamente.&lt;br /&gt;En vez de realizar el problema con datos simulados o reales, lo vamos a tratar con dos distribuciones teóricas concretas.&lt;br /&gt;Así pues, consideremos la distribución de una población normal bivariante con media mu1=(2.5,4) y matriz de covarianzas Sigma=(2,1,1,2) y otra población con la misma matriz de covarianzas, pero de media mu2=(6,3). El gráfico de arriba representa las densidades bivariantes de estas dos poblaciones. Un segmento de puntos une los dos puntos medios de las poblaciones.&lt;br /&gt;&lt;br /&gt;La idea de Fisher consistió en hallar una combinación lineal de las variables originales (X1,X2) de la forma w1X1+w2X2 y tal que discrimine "el máximo posible" las dos poblaciones. Él mismo definió el criterio de máxima discriminación como maximizar la razón entre la suma de cuadrados entre grupos y la suma de cuadrados dentro de los grupos sobre la combinación lineal (&lt;span style="font-style: italic;"&gt;discriminant scores&lt;/span&gt;). La solución viene dada por el vector w (o es proporcional al vector w)&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;w = Sigma^{-1} * (mu2 - mu1)&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;Es decir, entre todas las combinaciones lineales de la forma w1X1+w2X2, la que mejor discrimina es justamente esa. En el ejemplo propuesto, el vector solución w se ha dibujado en el gráfico como una flecha desde el punto mu1. Observemos que w tiene en cuenta la diferencia entre las medias pero también la relación de dependencia entre las variables.&lt;br /&gt;&lt;br /&gt;Para visualizar este resultado he dibujado las densidades de las dos poblaciones si consideramos el vector w=(1,0), es decir, que la combinación lineal considerada sea simplemente X1.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_Lsnfr2zsR8A/S_BVujlsASI/AAAAAAAABIA/eKNTrkBJj9Y/s1600/Rplot1.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 400px;" src="http://1.bp.blogspot.com/_Lsnfr2zsR8A/S_BVujlsASI/AAAAAAAABIA/eKNTrkBJj9Y/s400/Rplot1.png" alt="" id="BLOGGER_PHOTO_ID_5471967805570810146" border="0" /&gt;&lt;/a&gt;Esta no es la solución óptima.&lt;br /&gt;&lt;br /&gt;La solución exacta es w=(8/3,-11/6)&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_Lsnfr2zsR8A/S_BWz4YyhbI/AAAAAAAABII/TpambCWisJU/s1600/Rplot2.png"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 400px; height: 400px;" src="http://4.bp.blogspot.com/_Lsnfr2zsR8A/S_BWz4YyhbI/AAAAAAAABII/TpambCWisJU/s400/Rplot2.png" alt="" id="BLOGGER_PHOTO_ID_5471968996564829618" border="0" /&gt;&lt;/a&gt;En el gráfico inicial, la recta que discrimina las dos poblaciones tiene un vector director ortogonal al vector w. Esa recta es la recta de puntos que equidistan de los dos puntos medios según la distancia de Mahalanobis.&lt;br /&gt;&lt;br /&gt;El código para hacer todos los cálculos y los gráficos es el siguiente:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;mu1 &lt;- c(2.5,4)&lt;br /&gt;mu2 &lt;- c(6,3)&lt;br /&gt;Sigma &lt;- matrix(c(2,1,1,2),ncol=2)&lt;br /&gt;&lt;br /&gt;dnormbv &lt;- function(x1,x2,mu,Sigma) {&lt;br /&gt;           sigma1 &lt;- sqrt(Sigma[1,1])&lt;br /&gt;           sigma2 &lt;- sqrt(Sigma[2,2])&lt;br /&gt;           rho &lt;- Sigma[1,2]/(sigma1*sigma2)&lt;br /&gt;           cte &lt;- 1/(2*pi*sigma1*sigma2*sqrt(1-rho^2))&lt;br /&gt;           cte * exp((-1/2) * (1/(1-rho^2)) * (&lt;br /&gt;           (x1-mu[1])^2/sigma1^2 - 2*rho*(x1-mu[1])*(x2-mu[2])/(sigma1*sigma2) + (x2-mu[2])^2/sigma2^2)&lt;br /&gt;           )}&lt;br /&gt;          &lt;br /&gt;x1&lt;-seq(0,6,0.1)&lt;br /&gt;x2&lt;-seq(1,7,0.1)&lt;br /&gt;z &lt;- matrix(rep(0,length(x1)*length(x2)),ncol=length(x2))&lt;br /&gt;for (i in 1:length(x1)) {&lt;br /&gt;for (j in 1:length(x2)) {&lt;br /&gt;z[i,j] &lt;- dnormbv(x1[i],x2[j],mu1,Sigma)&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;plot(outer(x1,x2),xlim=c(0,9),ylim=c(0,9),xlab="",ylab="",type="n")&lt;br /&gt;contour(x1,x2,z,nlev=4,add=T)&lt;br /&gt;&lt;br /&gt;x1&lt;-seq(2,9,0.1)&lt;br /&gt;x2&lt;-seq(0,7,0.1)&lt;br /&gt;z &lt;- matrix(rep(0,length(x1)*length(x2)),ncol=length(x2))&lt;br /&gt;for (i in 1:length(x1)) {&lt;br /&gt;for (j in 1:length(x2)) {&lt;br /&gt;z[i,j] &lt;- dnormbv(x1[i],x2[j],mu2,Sigma)&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;contour(x1,x2,z,nlev=4,add=T)&lt;br /&gt;&lt;br /&gt;segments(mu1[1],mu1[2],mu2[1],mu2[2],lty="dotted")&lt;br /&gt;&lt;br /&gt;SigmaInv &lt;- matrix(c(2/3,-1/3,-1/3,2/3),ncol=2)&lt;br /&gt;&lt;br /&gt;w &lt;- SigmaInv %*% (mu2-mu1)&lt;br /&gt;&lt;br /&gt;arrows(mu1[1],mu1[2],mu1[1]+w[1],mu1[2]+w[2],lwd=2)&lt;br /&gt;&lt;br /&gt;pm &lt;- (mu1+mu2)/2&lt;br /&gt;a &lt;- w[1] * pm[1] / w[2] + pm[2]&lt;br /&gt;b &lt;- -w[1]/w[2]&lt;br /&gt;abline(a,b,lty="dashed")&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;ee &lt;- 3.5&lt;br /&gt;x1 &lt;- seq(mu1[1]-ee,mu1[1]+ee,by=0.1)&lt;br /&gt;x2 &lt;- dnorm(x1,mean=mu1[1],sd=sqrt(Sigma[1,1]))&lt;br /&gt;plot.new()&lt;br /&gt;plot.window(xlim=c(-1,9),ylim=c(0,0.5))&lt;br /&gt;axis(1)&lt;br /&gt;axis(2)&lt;br /&gt;lines(x1,x2)&lt;br /&gt;x1 &lt;- seq(mu2[1]-ee,mu2[1]+ee,by=0.1)&lt;br /&gt;x2 &lt;- dnorm(x1,mean=mu2[1],sd=sqrt(Sigma[1,1]))&lt;br /&gt;lines(x1,x2)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;E1 &lt;- t(w) %*% mu1&lt;br /&gt;E2 &lt;- t(w) %*% mu2&lt;br /&gt;var.w &lt;- as.numeric(t(w) %*% Sigma %*% w)&lt;br /&gt;&lt;br /&gt;ee &lt;- 7&lt;br /&gt;x1 &lt;- seq(E1-ee,E1+ee,by=0.1)&lt;br /&gt;x2 &lt;- dnorm(x1,mean=E1,sd=sqrt(var.w))&lt;br /&gt;plot.new()&lt;br /&gt;plot.window(xlim=c(-6,16),ylim=c(0,0.5))&lt;br /&gt;axis(1)&lt;br /&gt;axis(2)&lt;br /&gt;lines(x1,x2)&lt;br /&gt;x1 &lt;- seq(E2-ee,E2+ee,by=0.1)&lt;br /&gt;x2 &lt;- dnorm(x1,mean=E2,sd=sqrt(var.w))&lt;br /&gt;lines(x1,x2)&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Con datos reales o simulados podemos utilizar la función &lt;span style="font-family: courier new;"&gt;lda()&lt;/span&gt; del paquete &lt;span style="font-family: arial;"&gt;MASS&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Bibliografía&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Lattin, J. et al, &lt;span style="font-style: italic;"&gt;Analyzing Multivariate Data&lt;/span&gt;, Ed. Brooks/Cole, Belmont (2003).&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4200017933558803500-7130419352928047484?l=erre-que-erre-paco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://erre-que-erre-paco.blogspot.com/feeds/7130419352928047484/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://erre-que-erre-paco.blogspot.com/2010/05/discriminador-lineal-de-fisher.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4200017933558803500/posts/default/7130419352928047484'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4200017933558803500/posts/default/7130419352928047484'/><link rel='alternate' type='text/html' href='http://erre-que-erre-paco.blogspot.com/2010/05/discriminador-lineal-de-fisher.html' title='Discriminador lineal de Fisher'/><author><name>Paco</name><uri>http://www.blogger.com/profile/05414727581731452919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_Lsnfr2zsR8A/SwkQF-4sS9I/AAAAAAAAA0c/GGwOyuhdv68/S220/francesc.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_Lsnfr2zsR8A/S_BPZz_jRSI/AAAAAAAABH4/Jedy5AD0VEA/s72-c/Dos_normales.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4200017933558803500.post-7697672910799336684</id><published>2010-03-27T19:26:00.027+01:00</published><updated>2010-06-06T11:04:03.936+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='R'/><title type='text'>Análisis canónico de poblaciones</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_Lsnfr2zsR8A/S65eSLhLknI/AAAAAAAAA3k/-wo5z973QQo/s1600/Rplot.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 400px;" src="http://4.bp.blogspot.com/_Lsnfr2zsR8A/S65eSLhLknI/AAAAAAAAA3k/-wo5z973QQo/s400/Rplot.png" alt="" id="BLOGGER_PHOTO_ID_5453399865214866034" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;El análisis canónico de poblaciones es una técnica de análisis multivariante que tiene el objetivo de representar varios grupos de individuos de forma óptima mediante unos &lt;span style="font-style: italic;"&gt;ejes canónicos&lt;/span&gt; ortogonales. Eso se consigue de manera que la dispersión entre esos grupos sea máxima con relación a la dispersión dentro de cada grupo. Además, en esa representación, la distancia euclídea entre dos individuos coincide con la distancia de Mahalanobis entre ellos en las variables originales.&lt;br /&gt;Se trata pues de una técnica de representación de datos en dimensión reducida, normalmente los dos primeros ejes, que puede acompañar gráficamente un MANOVA de un factor (la población).&lt;br /&gt;&lt;br /&gt;Vamos a poner un ejemplo muy conocido. Se trata de los datos sobre cráneos de varones egipcios de cinco épocas históricas que se pueden obtener en el siguiente enlace:&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://lib.stat.cmu.edu/DASL/Datafiles/EgyptianSkulls.html"&gt;http://lib.stat.cmu.edu/DASL/Datafiles/EgyptianSkulls.html&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;También podemos bajarlos desde la &lt;a href="http://biostatistics.iop.kcl.ac.uk/publications/everitt/RSPCMA/Data/chap5skulls.zip"&gt;página del libro de Everitt (2005)&lt;/a&gt; y así los podremos cargar directamente en R con la siguientes instrucciones:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;skulls &lt;- source("/(path)/chap5skulls.dat")$value&lt;/span&gt;&lt;br&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;str(skulls)&lt;/span&gt;&lt;br&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;attach(skulls)&lt;/span&gt;&lt;br&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Donde el path debe ser la dirección a la carpeta donde hemos dejado el archivo una vez descomprimido. Así tendremos la base de datos &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;skulls&lt;/span&gt;&lt;/span&gt; con cinco variables. La primera variable es el factor EPOCH y las otras cuatro son las medidas biométricas del cráneo estudiadas.&lt;br /&gt;&lt;br /&gt;En primer lugar podemos realizar un MANOVA para contrastar la diferencia de medias entre los niveles del factor o poblaciones. No entraremos aquí en la comprobación de las hipótesis de normalidad y de igualdad de las matrices de covarianzas.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;skulls.manova &lt;- manova(cbind(MB,BH,BL,NH) ~ EPOCH)&lt;/span&gt;&lt;br&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;summary(skulls.manova, test="Wilks") # test="Pillai" or "Hotelling" or "Roy"&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;El test rechaza la igualdad de medias y, por lo tanto, justifica el análisis canónico de poblaciones.&lt;br /&gt;&lt;br /&gt;El siguiente paso es obtener el paquete &lt;span style="font-weight: bold;font-size:85%;" &gt;&lt;span style="font-family:arial;"&gt;candisc&lt;/span&gt;&lt;/span&gt; para un &lt;span style="font-style: italic;"&gt;Canonical discriminant analysis&lt;/span&gt; ya que los ejes canónicos también sirven ese tipo de análisis discriminante.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;library(candisc)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;La función &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;candisc&lt;/span&gt;&lt;/span&gt; realiza el análisis canónico discriminante, pero necesita como objeto principal un modelo lineal:&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;skulls.mod &lt;- lm(cbind(MB,BH,BL,NH) ~ EPOCH)&lt;/span&gt;&lt;br&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Anova(skulls.mod, test="Wilks")  # Manova  &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;skulls.can1 &lt;- candisc(skulls.mod, term="EPOCH") &lt;/span&gt;&lt;br&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;plot(skulls.can1, conf=0.90, type="n")   &lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;El gráfico que se obtiene es el que vemos al principio de este artículo. Como corresponde a un ejemplo de manual, los dos primeros ejes canónicos representan muy bien a los datos y las poblaciones se separan de forma cronológica. También se representan las variables en una especie de biplot que explica mejor las diferencias entre las poblaciones. Todo muy bonito, pero no es un auténtico gráfico del análisis canónico de poblaciones, donde los círculos deben ser regiones de confianza con los datos sin escalar. Son círculos y no elipses los que representan a las poblaciones, ya que los ejes son independientes.&lt;br /&gt;Por suerte, entre los resultados del objeto &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;skulls.can1&lt;/span&gt;&lt;/span&gt; disponemos de los coeficientes sin escalar que proporcionan las variables canónicas. Podemos pues aprovecharlos para calcular los &lt;span style="font-style: italic;"&gt;scores &lt;/span&gt;de todos los datos sin escalar. Observemos también la utilización de la función &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;aggregate&lt;/span&gt;&lt;/span&gt; para calcular las medias de cada población por separado como expliqué en el artículo &lt;a href="http://erre-que-erre-paco.blogspot.com/2010/02/aplicar-una-funcion-segun-el-grupo.html"&gt;Aplicar una función según el grupo&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;# raw scores &lt;br&gt;&lt;br /&gt;scores &lt;- as.matrix(skulls[,-1]) %*% skulls.can1$coeffs.raw &lt;br&gt;  plot(scores[,1],scores[,2],xlim=c(-1,6),ylim=c(20,25), xlab="1er. eje canónico",ylab="2o. eje canónico",pch=16) &lt;br&gt;  &lt;br /&gt;medias&lt;-aggregate(skulls[,-1],skulls["EPOCH"],mean) &lt;br&gt;   &lt;br /&gt;scores.medias &lt;- medias %*%  skulls.can1$coeffs.raw  &lt;br&gt; text(scores.medias[,1],scores.medias[,2],1:5,pch=15,col="red") &lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_Lsnfr2zsR8A/S65n7V-RhTI/AAAAAAAAA3s/Ns6nlpKY0vA/s1600/Rplot.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 392px;" src="http://3.bp.blogspot.com/_Lsnfr2zsR8A/S65n7V-RhTI/AAAAAAAAA3s/Ns6nlpKY0vA/s400/Rplot.png" alt="" id="BLOGGER_PHOTO_ID_5453410468000531762" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Ahora ya sólo queda añadir los círculos de confianza para un nivel de confianza especificado, por ejemplo el 90%. Para ello vamos a calcular los radios de cada círculo según el tamaño de la muestra de cada población y la función &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;symbols&lt;/span&gt;&lt;/span&gt;. Observemos que el objeto &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;r&lt;/span&gt;&lt;/span&gt; es un vector.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;resumen &lt;- table(EPOCH) &lt;br&gt;&lt;br /&gt;g &lt;- length(resumen) # número de poblaciones &lt;br&gt; &lt;br /&gt;p &lt;- dim(skulls[,-1])[2] # número de variables &lt;br&gt; &lt;br /&gt;n &lt;- as.vector(resumen) # tamaño de las muestras en cada población &lt;br&gt;   &lt;br /&gt;radios &lt;- function(g,p,n,conf.level=0.95) { &lt;br&gt; &lt;br /&gt;N &lt;- sum(n) &lt;br&gt; &lt;br /&gt;F &lt;- qf(conf.level,p,N-g-p+1) &lt;br&gt; &lt;br /&gt;sqrt(F*(N-g)*p/((N-g-p+1)*n)) &lt;br&gt;           &lt;br /&gt;} &lt;br&gt;  &lt;br /&gt;r &lt;- radios(g,p,n,0.90) &lt;br&gt;&lt;br&gt;      &lt;br /&gt;plot.new() &lt;br&gt; &lt;br /&gt;plot.window(xlim=c(0.5,4),ylim=c(21,24.5)) &lt;br&gt; &lt;br /&gt;axis(1) &lt;br&gt; &lt;br /&gt;axis(2) &lt;br&gt; &lt;br /&gt;box() &lt;br&gt; &lt;br /&gt;title(main="Análisis canónico", xlab="1er. eje", ylab="2o. eje")  &lt;br&gt;&lt;br /&gt;text(scores.medias[,1],scores.medias[,2],labels=levels(EPOCH),col="red") &lt;br&gt;&lt;br /&gt;symbols(scores.medias[,1],scores.medias[,2],circles=r,inches=FALSE,add=T,lwd=2,fg="red")      &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_Lsnfr2zsR8A/S68KxQMksoI/AAAAAAAAA38/9eUSQ3xMqrM/s1600/Rplot.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 392px;" src="http://3.bp.blogspot.com/_Lsnfr2zsR8A/S68KxQMksoI/AAAAAAAAA38/9eUSQ3xMqrM/s400/Rplot.png" alt="" id="BLOGGER_PHOTO_ID_5453589515046531714" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Bibliografía&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Cuadras, C.M. (2010). &lt;span style="font-style: italic;"&gt;Nuevos métodos de Análisis Multivariante&lt;/span&gt;. CMC Editions, Barcelona.&lt;br /&gt;&lt;br /&gt;Everitt, B. (2005). &lt;span style="font-style: italic;"&gt;An R and S-Plus Companion to Multivariate Analysis&lt;/span&gt;, Springer, London.&lt;br /&gt;&lt;br /&gt;Arthur Thomson &amp;amp; R. Randall-Maciver (1905). &lt;span style="font-style: italic;"&gt;The Ancian Races of the Thebaid&lt;/span&gt;. Oxford University Press.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4200017933558803500-7697672910799336684?l=erre-que-erre-paco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://erre-que-erre-paco.blogspot.com/feeds/7697672910799336684/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://erre-que-erre-paco.blogspot.com/2010/03/analisis-canonico-de-poblaciones.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4200017933558803500/posts/default/7697672910799336684'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4200017933558803500/posts/default/7697672910799336684'/><link rel='alternate' type='text/html' href='http://erre-que-erre-paco.blogspot.com/2010/03/analisis-canonico-de-poblaciones.html' title='Análisis canónico de poblaciones'/><author><name>Paco</name><uri>http://www.blogger.com/profile/05414727581731452919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_Lsnfr2zsR8A/SwkQF-4sS9I/AAAAAAAAA0c/GGwOyuhdv68/S220/francesc.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_Lsnfr2zsR8A/S65eSLhLknI/AAAAAAAAA3k/-wo5z973QQo/s72-c/Rplot.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4200017933558803500.post-3176867910561338271</id><published>2010-02-14T12:01:00.000+01:00</published><updated>2010-06-06T11:04:03.936+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='R'/><title type='text'>Aplicar una función según el grupo</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_Lsnfr2zsR8A/S3fKOAevGJI/AAAAAAAAA2E/do-GyV5TDcM/s1600-h/tres-grupos-de-personas-thumb5564900.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 300px; height: 305px;" src="http://1.bp.blogspot.com/_Lsnfr2zsR8A/S3fKOAevGJI/AAAAAAAAA2E/do-GyV5TDcM/s400/tres-grupos-de-personas-thumb5564900.jpg" alt="" id="BLOGGER_PHOTO_ID_5438037417069058194" border="0" /&gt;&lt;/a&gt;Para aplicar una función a unas columnas de datos, separadamente según las clases o grupos que queramos, en R disponemos de dos funciones: &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;tapply()&lt;/span&gt;&lt;/span&gt; y &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;aggregate()&lt;/span&gt;&lt;/span&gt;.&lt;br /&gt;La función &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;tapply()&lt;/span&gt;&lt;/span&gt; se aplica sobre un único vector de datos, cuyos valores se agrupan en función de una o unas variables o factores. Con los datos &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;mtcars&lt;/span&gt;&lt;/span&gt;, por ejemplo, para saber el máximo valor de mpg según el número de cilindros hacemos&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;&gt; data(mtcars)&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;&gt; attach(mtcars)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&gt; tapply(mpg, cyl, max)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;      4        6       8&lt;br /&gt;33.9 21.4 19.2 &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;En este caso el resultado es un vector, aunque también puede ser una lista si el resultado de la función aplicada no es un escalar:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;&gt; tapply(mpg,cyl,range)&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;$'4'&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;[1] 21.4 33.9&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;$'6'&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;[1] 17.8 21.4&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;$'8'&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;[1] 10.4 19.2&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Acceder a estos resultados significa utilizar las llamadas a elementos de una lista:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;&gt; rangos &lt;- tapply(mpg, cyl, range)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&gt; rangos[[1]]&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;[1] 21.4 33.9&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&gt; rangos$'4'&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;[1] 21.4 33.9&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&gt; rangos[['4']]&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;[1] 21.4 33.9&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&gt; rangos[["4"]]&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;[1] 21.4 33.9&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Cuando se utiliza más de una variable de agrupación y el resultado de la función a aplicar no es un escalar, el valor que retorna &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;tapply()&lt;/span&gt;&lt;/span&gt; es más difícil de gestionar.&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;&gt; rangos2 &lt;- tapply(mpg, mtcars[c("cyl","am")], range) &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&gt; rangos2&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;   am&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt; cyl 0         1&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;  4 Numeric,2 Numeric,2&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  6 Numeric,2 Numeric,2&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  8 Numeric,2 Numeric,2&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&gt; rangos2["4","0"]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;[[1]]&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;[1] 21.5 24.4&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Al llamar la función&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt; tapply()&lt;/span&gt;&lt;/span&gt; sin el argumento función resulta un índice de agrupación, según los grupos determinados, que puede ser útil en algunos casos:&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;&gt; idx &lt;- tapply(mpg,mtcars[c("cyl","am")])    &gt; idx&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;[1] 5 5 4 2 3 2 3 1 1 2 2 3 3 3 3 3 3 4 4 4 1 3 3 3 3 4 4 4 6 5 6 4&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Por otra parte, si lo que se pretende es resumir una o más columnas de un data.frame o matriz mediante un estadístico o función escalar, entonces utilizaremos la función &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;aggregate()&lt;/span&gt;&lt;/span&gt;, donde el segundo argumento debe ser una lista.&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;&gt; aggregate(mtcars[c("mpg","hp","wt")], mtcars$cyl, mean)&lt;br /&gt;Error in aggregate.data.frame(mtcars[c("mpg", "hp", "wt")], mtcars$cyl,  :&lt;br /&gt; 'by' must be a list&lt;br /&gt;Calls: aggregate -&gt; aggregate.data.frame&lt;br /&gt;&lt;br /&gt;&gt; aggregate(mtcars[c("mpg","hp","wt")], mtcars["cyl"], mean)&lt;br /&gt; cyl      mpg        hp       wt&lt;br /&gt;1   4 26.66364  82.63636 2.285727&lt;br /&gt;2   6 19.74286 122.28571 3.117143&lt;br /&gt;3   8 15.10000 209.21429 3.999214&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&gt; aggregate(mtcars[c("mpg","hp","wt")], mtcars[c("cyl","am")], mean)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  cyl am      mpg        hp       wt&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;1   4  0 22.90000  84.66667  2.935000&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;2   6  0 19.12500 115.25000 3.388750&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;3   8  0 15.05000 194.16667 4.104083&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;4   4  1 28.07500  81.87500  2.042250&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;5   6  1 20.56667 131.66667 2.755000&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;6   8  1 15.40000 299.50000 3.370000&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Finalmente, cuando el problema es mas complejo y se trata de aplicar una función no escalar a más de un vector según una determinada agrupación, deberemos combinar dos procedimientos como &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;split()&lt;/span&gt;&lt;/span&gt; para agrupar y &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;sapply()&lt;/span&gt;&lt;/span&gt; o&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt; lapply()&lt;/span&gt;&lt;/span&gt; para aplicar.&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;&gt; xx &lt;- split(mtcars[c("mpg","hp","wt")], mtcars["cyl"])&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;&gt; aggregate(xx$'4', list(cyl=rep(4, dim(xx$'4')[1])), min)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt; cyl  mpg hp    wt&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;1   4 21.4 52 1.513&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;&gt; sapply(xx, cor)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;              4          6           8&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;[1,]  1.0000000  1.0000000  1.00000000&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;[2,] -0.5235034 -0.1270678 -0.28363567&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;[3,] -0.7131848 -0.6815498 -0.65035801&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;[4,] -0.5235034 -0.1270678 -0.28363567&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;[5,]  1.0000000  1.0000000  1.00000000&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;[6,]  0.1598761 -0.3062284  0.01761795&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;[7,] -0.7131848 -0.6815498 -0.65035801&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;[8,]  0.1598761 -0.3062284  0.01761795&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;[9,]  1.0000000  1.0000000  1.00000000&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Otra opción es utilizar la función &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;by()&lt;/span&gt;&lt;/span&gt; que generaliza la función &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;tapply()&lt;/span&gt;&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;&gt; by(mtcars[c("mpg","hp","wt")],mtcars["cyl"],cor)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;cyl: 4&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;           mpg         hp         wt&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;mpg  1.0000000 -0.5235034 -0.7131848&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;hp  -0.5235034  1.0000000  0.1598761&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;wt  -0.7131848  0.1598761  1.0000000&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;------------------------------------------------------------ &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;cyl: 6&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;           mpg         hp         wt&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;mpg  1.0000000 -0.1270678 -0.6815498&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;hp  -0.1270678  1.0000000 -0.3062284&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;wt  -0.6815498 -0.3062284  1.0000000&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;------------------------------------------------------------ &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;cyl: 8&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;           mpg          hp          wt&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;mpg  1.0000000 -0.28363567 -0.65035801&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;hp  -0.2836357  1.00000000  0.01761795&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;wt  -0.6503580  0.01761795  1.00000000&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4200017933558803500-3176867910561338271?l=erre-que-erre-paco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://erre-que-erre-paco.blogspot.com/feeds/3176867910561338271/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://erre-que-erre-paco.blogspot.com/2010/02/aplicar-una-funcion-segun-el-grupo.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4200017933558803500/posts/default/3176867910561338271'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4200017933558803500/posts/default/3176867910561338271'/><link rel='alternate' type='text/html' href='http://erre-que-erre-paco.blogspot.com/2010/02/aplicar-una-funcion-segun-el-grupo.html' title='Aplicar una función según el grupo'/><author><name>Paco</name><uri>http://www.blogger.com/profile/05414727581731452919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_Lsnfr2zsR8A/SwkQF-4sS9I/AAAAAAAAA0c/GGwOyuhdv68/S220/francesc.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_Lsnfr2zsR8A/S3fKOAevGJI/AAAAAAAAA2E/do-GyV5TDcM/s72-c/tres-grupos-de-personas-thumb5564900.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4200017933558803500.post-4053572374936546246</id><published>2010-01-31T14:00:00.000+01:00</published><updated>2010-06-06T11:04:03.937+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='R'/><title type='text'>Aplicar una función a una matriz o array</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_Lsnfr2zsR8A/SzkPIab3aKI/AAAAAAAAA1w/C7cu6Uso6dE/s1600-h/matrix_linux.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://4.bp.blogspot.com/_Lsnfr2zsR8A/SzkPIab3aKI/AAAAAAAAA1w/C7cu6Uso6dE/s400/matrix_linux.jpg" alt="" id="BLOGGER_PHOTO_ID_5420380263726672034" border="0" /&gt;&lt;/a&gt;&lt;span style="font-weight: bold;"&gt;La función &lt;/span&gt;&lt;span style="font-weight: bold;font-family:courier new;" &gt;apply&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Para aplicar una función a una matriz o array, R dispone de la función &lt;span style=";font-family:courier new;font-size:85%;"  &gt;apply&lt;/span&gt; que se utiliza con tres parámetros: el objeto array (una matriz es un array de dos dimensiones), la dimensión sobre la que actuaremos y la función que se aplicará. Como con la función &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;sapply&lt;/span&gt;&lt;/span&gt;, es posible añadir al final todos los argumentos que precise la función que aplicaremos. En el caso de las matrices, si el segundo argumento es un 1, significa que la función se aplicará a las filas, mientras que si es un 2, se aplicará a las columnas.&lt;br /&gt;En muchos casos se puede utilizar una instrucción &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;apply&lt;/span&gt;&lt;/span&gt; en vez de un bucle. Además, el resultado es un vector o una matriz con nombres (si los había) y dicen que a menudo es más eficiente que un bucle.&lt;br /&gt;Si queremos aplicar un procedimiento, primero definiremos la función a aplicar. Por ejemplo, si queremos saber el número de datos en cada una de las variables (columnas) que forman una base de datos (matriz), primero definiremos la función&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;n.datos &lt;- function(x)  n &lt;- sum(!is.na(x))&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;y la aplicaremos sobre la base de datos&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;apply(base.de.datos, 2, n.datos)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;La función &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;apply&lt;/span&gt;&lt;/span&gt; se puede aplicar sobre elementos que no son arrays, pero debemos saber que entonces trata de convertirlos mediante un &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;as.matrix&lt;/span&gt;&lt;/span&gt; o un &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;as.array&lt;/span&gt;&lt;/span&gt;, dependiendo de las dimensiones.&lt;br /&gt;Supongamos ahora que queremos estandarizar cada una de las variables de una base de datos, pero utilizando la mediana como estadístico de centralidad y la MAD como medida de dispersión.&lt;br /&gt;El truco consiste en utilizar la función &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;scale&lt;/span&gt;&lt;/span&gt; pero con los parámetros adecuados:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;datos.estand &lt;- scale(datos, center=apply(datos, 2, median), scale=apply(datos, 2, mad))&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Sin embargo, si lo que queremos es calcular la suma o la media, es mejor utilizar funciones como &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;rowSums&lt;/span&gt;&lt;/span&gt;, &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;colSums&lt;/span&gt;&lt;/span&gt;, &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;rowMeans&lt;/span&gt;&lt;/span&gt; o &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;colMeans&lt;/span&gt;&lt;/span&gt; que son más eficientes. Además tienen un argumento &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;na.rm=&lt;/span&gt;&lt;/span&gt; que permite prescindir de los valores faltantes.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;La función &lt;/span&gt;&lt;span style="font-weight: bold;font-family:courier new;" &gt;sweep&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Otra situación se presenta cuando queremos procesar una matriz por filas o por columnas, pero cada fila o columna de forma distinta, dependiendo de los valores de un vector dado. En estos casos utilizaremos la función &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;sweep&lt;/span&gt;&lt;/span&gt; que tiene básicamente 4 argumentos.  Como en la función &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;apply&lt;/span&gt;&lt;/span&gt;, los dos primeros son la matriz y la dimensión sobre la que aplicaremos la función. El tercero es el vector de valores para procesar cada fila o columna de forma distinta y finalmente, el cuarto argumento es la función a aplicar.&lt;br /&gt;Como funciones a aplicar podemos utilizar los operadores binarios como la suma "+", la resta "-" (por defecto), el producto "*" y el cociente "/", siempre con comillas. Por ejemplo, para dividir cada columna de unos datos por su máximo haremos&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;maximos &lt;- apply(datos, 2, max)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;sweep(datos, 2, maximos, "/")&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ahora bien, para otro tipo de funciones deberemos asegurarnos que la función trabaje correctamente con &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;sweep&lt;/span&gt;&lt;/span&gt;. No todas lo hacen.&lt;br /&gt;Si la función a aplicar calcula correctamente lo que queremos para cada vector de la matriz, pero no lo hace con &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;sweep&lt;/span&gt;&lt;/span&gt;, podemos pensar en la función &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;mapply&lt;/span&gt;&lt;/span&gt;.&lt;br /&gt;La función &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;mapply&lt;/span&gt;&lt;/span&gt; es la versión multivariante de &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;sapply&lt;/span&gt;&lt;/span&gt;.&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;mapply&lt;/span&gt;&lt;/span&gt; aplica la función (primer argumento) sobre los primeros elementos de cada argumento, los segundos elementos, los terceros y así sucesivamente. El resultado se trata de simplificar, normalmente es una lista o vector.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;mapply(rep, 1:4, 4:1)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Si la función necesita más argumentos, se los podemos pasar así:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;mapply(rep, 1:4, MoreArgs=list(x=5))&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Con un data.frame datos podemos hacer&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;mapply("/", datos, maximos)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;y obtendremos un resultado similar al de &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;sweep&lt;/span&gt;&lt;/span&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4200017933558803500-4053572374936546246?l=erre-que-erre-paco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://erre-que-erre-paco.blogspot.com/feeds/4053572374936546246/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://erre-que-erre-paco.blogspot.com/2009/12/aplicar-una-funcion-una-matriz-o-array.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4200017933558803500/posts/default/4053572374936546246'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4200017933558803500/posts/default/4053572374936546246'/><link rel='alternate' type='text/html' href='http://erre-que-erre-paco.blogspot.com/2009/12/aplicar-una-funcion-una-matriz-o-array.html' title='Aplicar una función a una matriz o array'/><author><name>Paco</name><uri>http://www.blogger.com/profile/05414727581731452919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_Lsnfr2zsR8A/SwkQF-4sS9I/AAAAAAAAA0c/GGwOyuhdv68/S220/francesc.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_Lsnfr2zsR8A/SzkPIab3aKI/AAAAAAAAA1w/C7cu6Uso6dE/s72-c/matrix_linux.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4200017933558803500.post-7679297739488179512</id><published>2009-12-21T17:44:00.010+01:00</published><updated>2010-06-06T11:04:03.937+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='R'/><title type='text'>Aplicar una función a un vector o una lista</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_Lsnfr2zsR8A/Sy-6B0ZP_4I/AAAAAAAAA1o/4Z9clbbcvpw/s1600-h/filas.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 266px;" src="http://4.bp.blogspot.com/_Lsnfr2zsR8A/Sy-6B0ZP_4I/AAAAAAAAA1o/4Z9clbbcvpw/s400/filas.jpg" alt="" id="BLOGGER_PHOTO_ID_5417753417157181314" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Ciertamente R está preparado para operar todos los elementos de un vector de forma casi "natural". La mayoría de funciones son &lt;span style="font-style: italic;"&gt;vectoriales&lt;/span&gt;. No ocurre lo mismo con una lista. Aunque muchas funciones devuelven una lista, que permite mucha flexibilidad, no se puede aplicar una función cualquiera directamente a una lista. Para ello disponemos de las funciones &lt;span style=";font-family:courier new;font-size:85%;"  &gt;lapply&lt;/span&gt; y &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;sapply&lt;/span&gt;&lt;/span&gt;.&lt;br /&gt;Las dos funciones admiten, básicamente, dos argumentos: el primero es el objeto vector o lista sobre el que se aplica la función expresada en el segundo argumento. La diferencia entre ambas es que mientras &lt;span style=";font-family:courier new;font-size:85%;"  &gt;lapply&lt;/span&gt; devuelve una (l)ista, &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;sapply&lt;/span&gt;&lt;/span&gt; siempre tratará de (s)implificar el resultado en un vector, si es posible.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;&gt; mi.lista &lt;- list(a=1:10, b=letters[1:3], cc=c(TRUE,FALSE,TRUE,FALSE))&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&gt; length(mi.lista)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;[1] 3&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&gt; lapply(mi.lista, length)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;$a&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;[1] 10&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;$b&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;[1] 3&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;$cc&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;[1] 4&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&gt; sapply(mi.lista, length)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  a b cc &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt; 10  3  4 &lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Observamos que mientras la función &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;length&lt;/span&gt;&lt;/span&gt; aplicada a la lista nos devuelve el número de elementos de la lista (3), aplicada mediante un &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;lapply&lt;/span&gt;&lt;/span&gt; o &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;sapply&lt;/span&gt;&lt;/span&gt; nos da la longitud de sus elementos.&lt;br /&gt;&lt;br /&gt;Cuando el objeto del primer argumento no es un vector o una lista, se forzará automáticamente que sea una lista mediante la función &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;as.list&lt;/span&gt;&lt;/span&gt;. De este modo podemos aplicar estas funciones a un data.frame que no es estrictamente una lista, pero su conversión es sencilla.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;&gt; mi.df &lt;- data.frame(a=1:10, b=letters[1:10], ca=runif(10), cb=rnorm(10))&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&gt; class(mi.df)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;[1] "data.frame"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&gt; sapply(mi.df,class)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;         a        b               ca              cb &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;"integer"  "factor" "numeric" "numeric"&lt;br /&gt;&lt;br /&gt;&gt; mi.df.num &lt;- &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;mi.df[ ,sapply(mi.df,class)=="numeric"]&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&gt; sapply(mi.df.num, mean)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;        ca                         cb &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;0.59009349 0.02423536 &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Cuando la función a aplicar (segundo argumento) necesita fijar sus propios argumentos, éstos se pueden incluir en las funciones &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;lapply&lt;/span&gt;&lt;/span&gt; o &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;sapply&lt;/span&gt;&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;&gt; sapply(mi.df.num, mean, trim = 0.05)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Por último, como estas funciones sirven para repetir el mismo cálculo sobre los elementos de un vector o lista, podemos pensar en utilizarlas siempre que podamos en lugar de un bucle (&lt;span style="font-style: italic;"&gt;loop&lt;/span&gt;).&lt;br /&gt;Además, tenemos una función &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;replicate&lt;/span&gt;&lt;/span&gt; que permite simulaciones como la siguiente:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family: courier new;"&gt;hist(replicate(100,mean(rexp(10))))&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4200017933558803500-7679297739488179512?l=erre-que-erre-paco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://erre-que-erre-paco.blogspot.com/feeds/7679297739488179512/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://erre-que-erre-paco.blogspot.com/2009/12/aplicar-una-funcion-un-vector-o-una.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4200017933558803500/posts/default/7679297739488179512'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4200017933558803500/posts/default/7679297739488179512'/><link rel='alternate' type='text/html' href='http://erre-que-erre-paco.blogspot.com/2009/12/aplicar-una-funcion-un-vector-o-una.html' title='Aplicar una función a un vector o una lista'/><author><name>Paco</name><uri>http://www.blogger.com/profile/05414727581731452919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_Lsnfr2zsR8A/SwkQF-4sS9I/AAAAAAAAA0c/GGwOyuhdv68/S220/francesc.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_Lsnfr2zsR8A/Sy-6B0ZP_4I/AAAAAAAAA1o/4Z9clbbcvpw/s72-c/filas.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4200017933558803500.post-3377188558179240715</id><published>2009-12-11T20:07:00.002+01:00</published><updated>2010-06-06T11:04:03.938+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='R'/><title type='text'>Fórmulas matemáticas en un gráfico</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_Lsnfr2zsR8A/SyAH95_esWI/AAAAAAAAA1c/mBtuftRgDpY/s1600-h/Rplot001.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 400px;" src="http://4.bp.blogspot.com/_Lsnfr2zsR8A/SyAH95_esWI/AAAAAAAAA1c/mBtuftRgDpY/s400/Rplot001.png" alt="" id="BLOGGER_PHOTO_ID_5413335512219824482" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Algunas de las funciones que permiten introducir texto en un gráfico son &lt;code&gt;text&lt;/code&gt;, &lt;code&gt;mtext&lt;/code&gt;, &lt;code&gt;axis&lt;/code&gt;, &lt;code&gt;title&lt;/code&gt;,...&lt;br /&gt;Si en el argumento que explicita el texto de alguna de estas funciones se escribe una &lt;span style="font-style: italic;"&gt;expresión&lt;/span&gt;, R la interpretará como una expresión matemática y le dará formato al estilo TeX. Dichas expresiones son el resultado de una función &lt;code&gt;expression()&lt;/code&gt;.&lt;br /&gt;En una expresión de R ciertos nombres se interpretan como símbolos matemáticos, por ejemplo, &lt;code&gt;alpha&lt;/code&gt; será la letra griega, &lt;code&gt;sum&lt;/code&gt; será el símbolo de sumatorio, etc.&lt;br /&gt;Para ver las diversas posibilidades, se puede consultar la ayuda &lt;code&gt;help(plotmath)&lt;/code&gt; o la demostración &lt;code&gt;demo(plotmath)&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;El gráfico inicial se consigue con el siguiente código:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;curve(dnorm(x),-3,3,axes=F)&lt;br /&gt;box()&lt;br /&gt;axis(2)&lt;br /&gt;axis(1,at=0,labels=c(expression(mu)))&lt;br /&gt;title("Densidad normal")&lt;br /&gt;text(2, 0.35, expression(paste(f(x)==frac(1, sigma*sqrt(2*pi)), " ",&lt;br /&gt;                          plain(e)^{frac(-(x-mu)^2, 2*sigma^2)})),&lt;br /&gt;   cex = 1.2)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;En ciertas situaciones, como por ejemplo para definir una función, se necesita combinar texto con valores y variables. En ese caso no es posible utilizar la función &lt;code&gt;expression()&lt;/code&gt; ya que las variables se tratarían literalmente como texto. Para solucionar este caso se utiliza la función &lt;code&gt;substitute()&lt;/code&gt;.&lt;br /&gt;Ejemplo:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;mifunc &lt;- function(media) {           &lt;br /&gt;          text(2, 3, substitute(paste("El valor de ", bar(x), " es ", media)))&lt;br /&gt;          } &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Este tipo de fórmulas matemáticas se puede reproducir en cualquiera de los dispositivos gráficos de pantalla como X11, Windows y Quartz y, gracias a la información de las fuentes Adabe Tipo 1 estándar que tiene R, también en PostScript y PDF.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4200017933558803500-3377188558179240715?l=erre-que-erre-paco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://erre-que-erre-paco.blogspot.com/feeds/3377188558179240715/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://erre-que-erre-paco.blogspot.com/2009/12/formulas-matematicas-en-un-grafico.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4200017933558803500/posts/default/3377188558179240715'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4200017933558803500/posts/default/3377188558179240715'/><link rel='alternate' type='text/html' href='http://erre-que-erre-paco.blogspot.com/2009/12/formulas-matematicas-en-un-grafico.html' title='Fórmulas matemáticas en un gráfico'/><author><name>Paco</name><uri>http://www.blogger.com/profile/05414727581731452919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_Lsnfr2zsR8A/SwkQF-4sS9I/AAAAAAAAA0c/GGwOyuhdv68/S220/francesc.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_Lsnfr2zsR8A/SyAH95_esWI/AAAAAAAAA1c/mBtuftRgDpY/s72-c/Rplot001.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4200017933558803500.post-2751842680051274232</id><published>2009-12-08T22:17:00.003+01:00</published><updated>2010-06-06T11:04:03.939+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='R'/><title type='text'>Clases S3 y S4</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_Lsnfr2zsR8A/Sw0HdGIP2EI/AAAAAAAAA08/4lJWA8Ed6qw/s1600/bulb_old_new.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 233px;" src="http://3.bp.blogspot.com/_Lsnfr2zsR8A/Sw0HdGIP2EI/AAAAAAAAA08/4lJWA8Ed6qw/s320/bulb_old_new.jpg" alt="" id="BLOGGER_PHOTO_ID_5407986923984640066" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;El sistema de clases de los objetos en R proporciona alguno de los mecanismos de la programación  &lt;span style="font-style: italic;"&gt;orientada a objetos&lt;/span&gt; como el despacho del método (&lt;span style="font-style: italic;"&gt;method dispatch&lt;/span&gt;) y la herencia.&lt;br /&gt;El método es la implementación de un algoritmo que representa una operación o función que un objeto realiza. El conjunto de los métodos de un objeto determinan el comportamiento del objeto. En R, el despacho del método consiste en examinar la clase de los argumentos de una función para decidir (despachar) la versión adecuada para los objetos de esa clase. No todas las funciones de R tienen despacho del método. Las que sí lo tienen se llaman funciones genéricas.&lt;br /&gt;La herencia permite a los programadores crear nuevas clases, similares a otras ya existentes. Únicamente deberán proporcionar métodos adecuados para las nuevas clases o mantener los heredados. Un objeto de R que hereda las propiedades de un objeto ya definido, tiene como atributo de clase un vector que contiene la clase de ese objeto (en primer lugar), junto con las clases del objeto del que hereda.&lt;br /&gt;&lt;br /&gt;El primer mecanismo de la programación orientada a objetos en R es el conjunto de clases &lt;span style="font-weight: bold;"&gt;S3&lt;/span&gt; o del &lt;span style="font-style: italic;"&gt;viejo estilo&lt;/span&gt; (&lt;span style="font-style: italic;"&gt;old-style&lt;/span&gt;), donde el despacho del método se produce a través de las funciones genéricas del siguiente modo:&lt;br /&gt;&lt;br /&gt;Supongamos que tenemos un objeto con el nombre de &lt;code&gt;cdr&lt;/code&gt; de la clase&lt;code&gt;&lt;/code&gt; &lt;code&gt;Cuadrado&lt;/code&gt;, el cual es una subclase de &lt;code&gt;Rectangulo&lt;/code&gt; que a su vez es una subclase de &lt;code&gt;Forma&lt;/code&gt;. El mecanismo de despacho del método consiste en S3 y la función &lt;code&gt;UseMethod&lt;/code&gt;. Utilizando S3 definimos un método &lt;code&gt;Area&lt;/code&gt; para la clase &lt;code&gt;Rectangulo&lt;/code&gt; como  &lt;pre class="RCode"&gt;  Area.Rectangulo &lt;- function(objeto) { attr(objeto, "ladoA") * attr(objeto, "ladoB"); } &lt;/pre&gt; dado que un objeto &lt;code&gt;Rectangulo&lt;/code&gt; tiene dos atributos &lt;code&gt;ladoA&lt;/code&gt;  y  &lt;code&gt;ladoB&lt;/code&gt;  (ahora se puede acceder directamente a los argumentos con el operador &lt;code&gt;@&lt;/code&gt;, es decir, &lt;code&gt;objeto@ladoA&lt;/code&gt;  y  &lt;code&gt;objeto@ladoB&lt;/code&gt;, respectivamente). Entonces definimos la &lt;span style="font-style: italic;"&gt;función genérica&lt;/span&gt; &lt;code&gt;Area&lt;/code&gt; así:&lt;br /&gt;&lt;pre class="RCode"&gt;  Area &lt;- function(objeto, ...) UseMethod("Area"); &lt;/pre&gt; Cuando esta función se aplica en el objeto con &lt;code&gt;Area(cdr)&lt;/code&gt;, &lt;code&gt;UseMethod&lt;/code&gt; despachará el método basado en la clase del primer argumento, es decir, &lt;code&gt;objeto&lt;/code&gt;. Como &lt;code&gt;cdr&lt;/code&gt; es de la clase &lt;code&gt;Cuadrado&lt;/code&gt;, primero buscará un método llamado &lt;code&gt;Area.Cuadrado&lt;/code&gt;. Si no existe, como en este caso, probará con &lt;code&gt;Area.Rectangulo&lt;/code&gt; y así sucesivamente. Si no existiera ningún método específico para cualquiera de las clases del &lt;code&gt;objeto&lt;/code&gt;, entonces se recurrirá al método &lt;code&gt;Area.default&lt;/code&gt; que siempre debemos tener.&lt;br /&gt;&lt;br /&gt;Observemos que las funciones genéricas S3 se pueden reconocer por la utilización de &lt;code&gt;UseMethod&lt;/code&gt; en su código. Esto es importante, ya que las páginas de ayuda para una combinación de método y objeto depende de su nombre completo del tipo &lt;code&gt;"function.class"&lt;/code&gt;. Por ejemplo, la página de ayuda de la función &lt;code&gt;summary&lt;/code&gt; no explica absolutamente nada sobre su actuación cuando le pasamos un objeto de la clase &lt;code&gt;factor&lt;/code&gt;. Será mejor buscar la ayuda de la función &lt;code&gt;summary.factor&lt;/code&gt;, aunque para que la función actúe sólo hay que escribir &lt;code&gt;summary(objeto)&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;Cuando se crea una clase, asociadas a ella, deberemos crear un conjunto de funciones para extraer datos o información sobre los objetos de esa clase. Dada la convención explicada sobre los nombres de las funciones en las clases S3, podemos utilizar la función &lt;code&gt;apropos&lt;/code&gt; para hallar los métodos disponibles para una clase:&lt;br /&gt;&lt;br /&gt;&lt;pre class="RCode"&gt;&gt; apropos('.*\\.factor$')&lt;br /&gt; [1] "all.equal.factor"     "as.character.factor"  "as.data.frame.factor"&lt;br /&gt; [4] "as.Date.factor"       "as.factor"            "as.list.factor"  &lt;br /&gt; [7] "as.POSIXlt.factor"    "as.vector.factor"     "codes.factor"    &lt;br /&gt;[10] "[&lt;-.factor"           "[.factor"             "[[.factor"             &lt;br /&gt;[13] "format.factor"        "is.factor"            "is.na&lt;-.factor"        &lt;br /&gt;[16] "length&lt;-.factor"      "levels&lt;-.factor"      "Math.factor"           &lt;br /&gt;[19] "Ops.factor"           "print.factor"         "rep.factor"            &lt;br /&gt;[22] "summary.factor"       "Summary.factor"       "xtfrm.factor"          &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Así descubriremos que existen algunas funciones específicas para la clase &lt;code&gt;factor&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;Ahora bien, como el despachado del método que proporcionan las clases S3 está limitado al primer argumento de la función, y como las convenciones sobre los nombres que hemos explicado pueden crear alguna confusión, se decidió crear un nuevo sistema de clases S4 o de nuevo estilo (&lt;span style="font-style: italic;"&gt;new-style&lt;/span&gt;). Éste es ahora el sistema preferido en el desarrollo de R.&lt;br /&gt;En las clases S4, las funciones genéricas se reconocen por la llamada a una función &lt;code&gt;standardGeneric&lt;/code&gt; en su definición.&lt;br /&gt;Las funciones necesarias para trabajar con las clases S4 se hallan en el paquete &lt;code&gt;methods&lt;/code&gt;. Por ejemplo, para saber si un objeto utiliza el nuevo estilo podemos hacer:&lt;br /&gt;&lt;br /&gt;&lt;pre class="RCode"&gt;&lt;br /&gt;&gt; temp &lt;- c(20,15,15,20,20,30,25,25,30,15,25,30,30)  &lt;br /&gt;&gt; temp &lt;- factor(temp)  &lt;br /&gt;&gt; isS4(temp)&lt;br /&gt;[1] FALSE&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Para saber los métodos asociados a una clase S4 como los objetos &lt;code&gt;mle&lt;/code&gt;, resultado de la función de estimación de máxima verosimilitud, hacemos:&lt;br /&gt;&lt;pre class="RCode"&gt;&lt;br /&gt;&gt; library(methods)&lt;br /&gt;&gt; showMethods(class='mle')&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Descubriremos que se puede calcular la matriz de varianzas-covarianzas de un objeto &lt;code&gt;mle&lt;/code&gt; con la función &lt;code&gt;vcov&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;Aunque no hay una función genérica &lt;code&gt;print&lt;/code&gt; para las clases S4, la función &lt;code&gt;show&lt;/code&gt; permite ver el contenido de un objeto.&lt;br /&gt;Por otra parte, los elementos que componen un objeto S4 se guardan en los llamados &lt;span style="font-style: italic;"&gt;slots&lt;/span&gt;. Para ver los tipos de &lt;span style="font-style: italic;"&gt;slots&lt;/span&gt; en un objeto, podemos utilizar la función &lt;code&gt;showClass&lt;/code&gt;.&lt;br /&gt;&lt;pre class="RCode"&gt;&lt;br /&gt;&gt; library(stats4)&lt;br /&gt;&gt; showClass("mle")&lt;br /&gt;Class “mle” [package "stats4"]&lt;br /&gt;&lt;br /&gt;Slots:&lt;br /&gt;                                                                        &lt;br /&gt;Name:       call      coef  fullcoef      vcov       min   details minuslogl&lt;br /&gt;Class:  language   numeric   numeric    matrix   numeric      list  function&lt;br /&gt;            &lt;br /&gt;Name:     method&lt;br /&gt;Class: character&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Para acceder directamente a un slot de un objeto, utilizaremos el operador &lt;code&gt;@&lt;/code&gt; del mismo modo que el operador &lt;code&gt;$&lt;/code&gt; para una lista. La función &lt;code&gt;slot&lt;/code&gt; también obtiene el mismo resultado.&lt;br /&gt;&lt;pre class="RCode"&gt;&lt;br /&gt;&gt; slot(objeto.lme,"vcov")&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4200017933558803500-2751842680051274232?l=erre-que-erre-paco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://erre-que-erre-paco.blogspot.com/feeds/2751842680051274232/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://erre-que-erre-paco.blogspot.com/2009/12/clases-s3-y-s4.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4200017933558803500/posts/default/2751842680051274232'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4200017933558803500/posts/default/2751842680051274232'/><link rel='alternate' type='text/html' href='http://erre-que-erre-paco.blogspot.com/2009/12/clases-s3-y-s4.html' title='Clases S3 y S4'/><author><name>Paco</name><uri>http://www.blogger.com/profile/05414727581731452919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_Lsnfr2zsR8A/SwkQF-4sS9I/AAAAAAAAA0c/GGwOyuhdv68/S220/francesc.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_Lsnfr2zsR8A/Sw0HdGIP2EI/AAAAAAAAA08/4lJWA8Ed6qw/s72-c/bulb_old_new.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4200017933558803500.post-3302378352272699747</id><published>2009-11-30T12:29:00.002+01:00</published><updated>2010-06-06T11:04:03.939+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='R'/><title type='text'>Primeras jornadas de R</title><content type='html'>Cuando me disponía a redactar un resumen de las &lt;span style="font-style: italic;"&gt;Primeras jornadas de R&lt;/span&gt; celebradas en la Universidad de Murcia los pasados días 26 y 27 de noviembre, he descubierto con agrado que se me han adelantado.&lt;br /&gt;En el blog &lt;a href="http://analisisydecision.es/noticias-del-congreso-de-usuarios-de-r/"&gt;Análisis y decisión&lt;/a&gt; podéis leer un amplio resumen de Carlos Gil Bellosta.&lt;br /&gt;En fin, un ejemplo de trabajo colaborativo, él lo escribe y yo lo cito. ¡Ejem! Ya sé que no es eso.&lt;br /&gt;Simplemente debo añadir que corroboro todas las buenas impresiones que nos llevamos las personas que asistimos del Departamento de Estadística de la Universidad de Barcelona: Miquel Calvo, Esteban Vegas y yo mismo. Además de conocernos y hablar de R y del software libre en general, también han quedado algunos compromisos de colaboraciones que poco a poco seguro que iremos concretando.&lt;br /&gt;Un abrazo a todos y todas los que estuvisteis allí.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4200017933558803500-3302378352272699747?l=erre-que-erre-paco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://erre-que-erre-paco.blogspot.com/feeds/3302378352272699747/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://erre-que-erre-paco.blogspot.com/2009/11/primeras-jornadas-de-r.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4200017933558803500/posts/default/3302378352272699747'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4200017933558803500/posts/default/3302378352272699747'/><link rel='alternate' type='text/html' href='http://erre-que-erre-paco.blogspot.com/2009/11/primeras-jornadas-de-r.html' title='Primeras jornadas de R'/><author><name>Paco</name><uri>http://www.blogger.com/profile/05414727581731452919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_Lsnfr2zsR8A/SwkQF-4sS9I/AAAAAAAAA0c/GGwOyuhdv68/S220/francesc.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4200017933558803500.post-4493836656176274616</id><published>2009-11-28T19:57:00.005+01:00</published><updated>2010-06-06T11:04:03.940+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='R'/><title type='text'>Factores numéricos</title><content type='html'>&lt;div style="text-align: center; font-family: arial;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_Lsnfr2zsR8A/SxFyyOHDZdI/AAAAAAAAA1E/fLWPwgtPqcw/s1600/africa_hiv-aids-colorscheme2_300px.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 261px; height: 299px;" src="http://3.bp.blogspot.com/_Lsnfr2zsR8A/SxFyyOHDZdI/AAAAAAAAA1E/fLWPwgtPqcw/s320/africa_hiv-aids-colorscheme2_300px.png" alt="" id="BLOGGER_PHOTO_ID_5409230834555381202" border="0" /&gt;&lt;/a&gt;&lt;span style="font-size:85%;"&gt;Población africana con SIDA&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;Frecuentemente es necesario convertir una variable numérica en factor ya que algunas funciones de R así lo esperan. Sin embargo, si disponemos únicamente de un factor no podremos calcular algunos estadísticos u otras operaciones numéricas, aunque los niveles (o sus etiquetas) sean aparentemente numéricos.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&gt; temp &lt;- c(20,15,15,20,20,30,25,25,30,15,25,30,30)&lt;br /&gt;&gt; temp &lt;- factor(temp)&lt;br /&gt;&gt; temp&lt;br /&gt; [1] 20 15 15 20 20 30 25 25 30 15 25 30 30&lt;br /&gt;Levels: 15 20 25 30&lt;br /&gt;&gt; mean(temp)&lt;br /&gt;[1] NA&lt;br /&gt;Warning message:&lt;br /&gt;In mean.default(temp) : argument is not numeric or logical: returning NA&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Si no disponemos de los datos numéricos originales y deseamos convertir el factor a datos numéricos podemos probar así:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&gt; temp.n &lt;- as.numeric(temp)&lt;br /&gt;&gt; temp.n&lt;br /&gt; [1] 2 1 1 2 2 4 3 3 4 1 3 4 4&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Pero el resultado son los valores enteros en los que se codifica internamente el factor.&lt;br /&gt;Mejor si primero convertimos el factor a caracteres con las etiquetas de los niveles y luego esos mismos a valores numéricos:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&gt; temp.n &lt;- as.numeric(as.character(temp))&lt;br /&gt;&gt; temp.n&lt;br /&gt; [1] 20 15 15 20 20 30 25 25 30 15 25 30 30&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Por otra parte, para crear un factor a partir de una variable continua se utiliza la función &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;cut&lt;/span&gt;&lt;/span&gt;.&lt;br /&gt;Los siguientes datos corresponden a la tasa de mortalidad del SIDA por cada mil habitantes en los países africanos en el año 2007:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&gt; tasa &lt;-  c(7.21,1.15,10.49,2.86,2.37,3.79,2.49,4.88,0.81,4.70,2.10,1.97,0.49,0.65,&lt;br /&gt;            0.89,8.96,1.30,5.84,2.53,1.29,0.65,8.76,0.62,1.38,0.80,1.70,0.47,2.46) &lt;br /&gt;&lt;br /&gt;&gt; tasa.f &lt;- cut(tasa,breaks=seq(0,12,2))   &lt;br /&gt;&lt;br /&gt;&gt; table(tasa.f)&lt;br /&gt;tasa.f&lt;br /&gt;(0,2]   (2,4]   (4,6]   (6,8]  (8,10] (10,12]&lt;br /&gt;   14       7       3       1       2       1&lt;br /&gt;&lt;br /&gt;&gt; class(tasa.f)&lt;br /&gt;[1] "factor"&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4200017933558803500-4493836656176274616?l=erre-que-erre-paco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://erre-que-erre-paco.blogspot.com/feeds/4493836656176274616/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://erre-que-erre-paco.blogspot.com/2009/11/factores-numericos.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4200017933558803500/posts/default/4493836656176274616'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4200017933558803500/posts/default/4493836656176274616'/><link rel='alternate' type='text/html' href='http://erre-que-erre-paco.blogspot.com/2009/11/factores-numericos.html' title='Factores numéricos'/><author><name>Paco</name><uri>http://www.blogger.com/profile/05414727581731452919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_Lsnfr2zsR8A/SwkQF-4sS9I/AAAAAAAAA0c/GGwOyuhdv68/S220/francesc.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_Lsnfr2zsR8A/SxFyyOHDZdI/AAAAAAAAA1E/fLWPwgtPqcw/s72-c/africa_hiv-aids-colorscheme2_300px.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4200017933558803500.post-1945408254976689388</id><published>2009-11-22T12:20:00.001+01:00</published><updated>2010-06-06T11:04:03.940+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='R'/><title type='text'>Valores perdidos</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_Lsnfr2zsR8A/SvxSjd9Y6-I/AAAAAAAAA0Q/Y4phOKOK_fg/s1600-h/casper.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 324px;" src="http://4.bp.blogspot.com/_Lsnfr2zsR8A/SvxSjd9Y6-I/AAAAAAAAA0Q/Y4phOKOK_fg/s400/casper.jpg" alt="" id="BLOGGER_PHOTO_ID_5403284422228765666" border="0" /&gt;&lt;/a&gt;En R, para representar un valor perdido (&lt;span style="font-style: italic;"&gt;missing value&lt;/span&gt;) o que falta se utiliza el valor &lt;span style="font-family:courier new;"&gt;NA&lt;/span&gt; (&lt;em&gt;not available&lt;/em&gt;) sin comillas. Se puede asignar este valor a una variable de la forma&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;&gt; x &lt;- c(3,2,NA,6)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;pero no se puede consultar así&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;&gt; x[3] == NA&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;[1] NA&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;para ello tenemos la función&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt; is.na()&lt;/span&gt;&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;&gt; is.na(x[3])&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;[1] TRUE&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Por otra parte, al realizar un determinado cálculo, como dividir por cero o la raíz de un negativo, el resultado puede ser &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;Inf&lt;/span&gt;&lt;/span&gt; o &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;NaN&lt;/span&gt;&lt;/span&gt; (&lt;span style="font-style: italic;"&gt;not a number&lt;/span&gt;). La función &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;is.nan()&lt;/span&gt;&lt;/span&gt; permite dirimir si se trata de uno de estos valores.&lt;br /&gt;&lt;br /&gt;Cuando se importan datos de algún tipo de archivo, los valores perdidos pueden ser un problema si no se tratan de forma adecuada. Una posibilidad es utilizar el argumento &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;na.strings=&lt;/span&gt;&lt;/span&gt;  de la función &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;read.table&lt;/span&gt;&lt;/span&gt;, al que le podemos pasar un vector con todos los valores del tipo carácter que R debe considerar perdidos y dar valor &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;NA&lt;/span&gt;&lt;/span&gt;. En todo caso vale la pena revisar el resultado de la importación. Si los datos provienen de una hoja de cálculo, siempre podemos substituir los valores perdidos por &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;NA&lt;/span&gt;&lt;/span&gt;, antes de la exportación del archivo al formato CSV.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Trabajar con valores perdidos&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Algunas funciones de R disponen de argumentos para trabajar con datos que contienen valores perdidos. Por ejemplo, la mayoría de funciones estadísticas del tipo &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;mean&lt;/span&gt;&lt;/span&gt;, &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;var&lt;/span&gt;&lt;/span&gt;, &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;sum&lt;/span&gt;&lt;/span&gt;, &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;min&lt;/span&gt;&lt;/span&gt;, &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;max&lt;/span&gt;&lt;/span&gt;, etc.&lt;br /&gt;tienen un argumento &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;na.rm=&lt;/span&gt;&lt;/span&gt;  que se puede pasar a &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;TRUE&lt;/span&gt;&lt;/span&gt; para que suprima los valores perdidos del cálculo. Para otras funciones que no tengan este parámetro podemos eliminar dichos valores creando un nuevo vector:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;&gt; x[!is.na(x)]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;[1] 3 2 6&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;También algunas funciones de modelización estadística, como &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;lm&lt;/span&gt;&lt;/span&gt;, &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;glm&lt;/span&gt;&lt;/span&gt;, etc., disponen de un argumento &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;na.action=&lt;/span&gt;&lt;/span&gt;  al que le podemos pasar la acción a realizar para los valores perdidos. La más común es &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;na.action=na.omit&lt;/span&gt;&lt;/span&gt;  con lo que prescindirá de dichos valores en su procedimiento.&lt;br /&gt;Otra opción es seleccionar del vector, matriz o data.frame(s) los individuos o filas que no tienen valores perdidos mediante la función &lt;span style="font-size:85%;"&gt;&lt;span style="font-family: courier new;"&gt;complete.cases&lt;/span&gt;&lt;/span&gt; que devuelve un vector lógico:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;&gt; complete.cases(x)&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;[1]  TRUE  TRUE FALSE  TRUE&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Finalmente, señalar que en la conversión de un vector a factor, los valores perdidos no se consideran.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;&gt; y &lt;- factor(x)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&gt; y&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;[1] 3    2    &lt;na&gt; 6&lt;/na&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Levels: 2 3 6&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Si deseamos formar un nivel con los valores perdidos haremos&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;&gt; y &lt;- factor(x, exclude=NULL)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&gt; y&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;[1] 3    2    NA 6&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Levels: 2 3 6 NA&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4200017933558803500-1945408254976689388?l=erre-que-erre-paco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://erre-que-erre-paco.blogspot.com/feeds/1945408254976689388/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://erre-que-erre-paco.blogspot.com/2009/11/valores-perdidos.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4200017933558803500/posts/default/1945408254976689388'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4200017933558803500/posts/default/1945408254976689388'/><link rel='alternate' type='text/html' href='http://erre-que-erre-paco.blogspot.com/2009/11/valores-perdidos.html' title='Valores perdidos'/><author><name>Paco</name><uri>http://www.blogger.com/profile/05414727581731452919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_Lsnfr2zsR8A/SwkQF-4sS9I/AAAAAAAAA0c/GGwOyuhdv68/S220/francesc.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_Lsnfr2zsR8A/SvxSjd9Y6-I/AAAAAAAAA0Q/Y4phOKOK_fg/s72-c/casper.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4200017933558803500.post-1145228279185366843</id><published>2009-11-08T19:23:00.002+01:00</published><updated>2010-06-06T11:04:03.941+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='R'/><title type='text'>De R a ODF: el paquete odfWeave</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_Lsnfr2zsR8A/SvcFnbwS8MI/AAAAAAAAA0I/K4Hsw6l1za8/s1600-h/odfWeave.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 208px;" src="http://1.bp.blogspot.com/_Lsnfr2zsR8A/SvcFnbwS8MI/AAAAAAAAA0I/K4Hsw6l1za8/s320/odfWeave.png" alt="" id="BLOGGER_PHOTO_ID_5401792453077561538" border="0" /&gt;&lt;/a&gt;En el artículo &lt;a href="http://erre-que-erre-paco.blogspot.com/2009/08/latex-y-r.html"&gt;LaTeX y R&lt;/a&gt; ya comenté las ventajas de combinar texto y fórmulas junto con instrucciones de R para obtener un informe dinámico que contendrá el texto, las fórmulas y los resultados numéricos y gráficos generados por R. Lamentablemente esto supone saber LaTeX (y R), y utilizar LaTeX no es sencillo. Sin embargo, la potencia de la función &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;Sweave&lt;/span&gt;&lt;/span&gt; en R se ha extendido a otros formatos más &lt;span style="font-style: italic;"&gt;amigables&lt;/span&gt;. Primero fué el paquete &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;R2HTML&lt;/span&gt;&lt;/span&gt; para el formato html y ahora el paquete&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt; odfWeave&lt;/span&gt;&lt;/span&gt; para el formato ODF u &lt;a href="http://es.wikipedia.org/wiki/OpenDocument"&gt;OpenDocument&lt;/a&gt;.&lt;br /&gt;El paquete &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;odfWeave&lt;/span&gt;&lt;/span&gt; proporciona las funciones y el entorno para escribir informes automáticos en un formato libre y gratuito (como R), que se puede modificar a posteriori de forma muy sencilla y que permite su exportación a otros formatos como html o PDF.&lt;br /&gt;La idea consiste en escribir un archivo ODF con un programa editor como OpenOffice con comentarios o explicaciones y código R para generar resultados y gráficos. La función &lt;span style=";font-family:courier new;font-size:85%;"  &gt;odfWeave&lt;/span&gt; procesa ese archivo y nos entrega el documento ODF con el mismo texto y los resultados numéricos o gráficos insertados. Ese documento se puede modificar añadiendo otros elementos: vínculos, fotografías, encabezados y piés de página, etc. y finalmente imprimir o exportar.&lt;br /&gt;Por ahora sólo funciona con documentos de texto, pero más adelante se puede ampliar a presentaciones y hojas de cálculo.&lt;br /&gt;&lt;br /&gt;Veamos un ejemplo.&lt;br /&gt;&lt;br /&gt;El documento de nombre &lt;span style="font-family:arial;"&gt;ejemplo.odt&lt;/span&gt; contiene el siguiente texto:&lt;br /&gt;&lt;br /&gt;&lt;hr align="center" size="1"&gt;   	&lt;meta equiv="CONTENT-TYPE" content="text/html; charset=utf-8"&gt; 	&lt;title&gt;&lt;/title&gt; 	&lt;meta name="GENERATOR" content="OpenOffice.org 3.1  (Linux)"&gt; 	&lt;style type="text/css"&gt; 	&lt;!-- 		@page { margin: 2cm } 		P { margin-bottom: 0.21cm } 	--&gt; 	&lt;/style&gt;  &lt;p style="margin-bottom: 0cm;" align="center"&gt;&lt;span style="color: rgb(0, 0, 0);font-size:85%;" &gt;&lt;span style="font-family:DejaVu Sans,sans-serif;"&gt;&lt;span style="font-size:20;"&gt;&lt;b&gt;Ejemplo&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="color: rgb(0, 0, 0);font-size:85%;" &gt;&lt;span style="font-family:DejaVu Serif,serif;"&gt;En este documento vamos a probar el paquete odfWeave.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="color: rgb(0, 0, 0);font-size:85%;" &gt;&lt;span style="font-family:DejaVu Serif,serif;"&gt;Primero cargamos los datos de forma oculta para el documento final.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;&lt;span style="font-family:DejaVu Serif,serif;"&gt;&lt;&lt;&lt;loaddata, results=" hide," echo=" FALSE"&gt;&gt;&gt;=&lt;/loaddata,&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;&lt;span style="font-family:DejaVu Serif,serif;"&gt;# Los datos son &lt;/span&gt;&lt;/span&gt; &lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;&lt;span style="font-family:DejaVu Serif,serif;"&gt;coches &lt;- mtcars[ ,1:6]&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;&lt;span style="font-family:DejaVu Serif,serif;"&gt;@&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="color: rgb(0, 0, 0);font-size:85%;" &gt;&lt;span style="font-family:DejaVu Serif,serif;"&gt;Los datos a estudiar contienen &lt;span style="color: rgb(0, 0, 255);"&gt;\Sexpr{dim(coches)[2]}&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; variables medidas sobre &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;\Sexpr{dim(coches)[1]}&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; coches&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="color: rgb(0, 0, 0);font-size:85%;" &gt;&lt;span style="font-family:DejaVu Serif,serif;"&gt;Podemos insertar una tabla resumen de los datos:&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;&lt;span style="font-family:DejaVu Serif,serif;"&gt;&lt;&lt;&lt;meantable, echo=" FALSE," results=" xml"&gt;&gt;&gt;=&lt;/meantable,&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;&lt;span style="font-family:DejaVu Serif,serif;"&gt;medias &lt;- apply(coches,2,mean)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;&lt;span style="font-family:DejaVu Serif,serif;"&gt;odfTable(medias, horizontal = TRUE)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;&lt;span style="font-family:DejaVu Serif,serif;"&gt;@&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="color: rgb(0, 0, 0);font-size:85%;" &gt;&lt;span style="font-family:DejaVu Serif,serif;"&gt;También podemos añadir algún bonito gráfico:&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;&lt;span style="font-family:DejaVu Serif,serif;"&gt;&lt;&lt;&lt;pairsplot, echo=" FALSE," fig=" TRUE"&gt;&gt;&gt;=&lt;/pairsplot,&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;&lt;span style="font-family:DejaVu Serif,serif;"&gt;&lt;pairsplot, echo=" FALSE," fig=" TRUE"&gt;&lt;/pairsplot,&gt;pairs(coches)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;&lt;span style="font-family:DejaVu Serif,serif;"&gt;@&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="color: rgb(0, 0, 0);font-size:85%;" &gt;&lt;span style="font-family:DejaVu Serif,serif;"&gt;Y así seguiría nuestro trabajo.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;hr style="font-size: 78%;" align="center"&gt;   	&lt;br /&gt;&lt;br /&gt;Si aplicamos el código:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;library(odfWeave)&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;&lt;br /&gt;odfWeave(ejemplo.odt,resultado.odt)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;obtenemos el documento &lt;span style="font-family:arial;"&gt;resultado.odt&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;hr align="center" size="1"&gt;   	&lt;meta equiv="CONTENT-TYPE" content="text/html; charset=utf-8"&gt; 	&lt;title&gt;&lt;/title&gt; 	&lt;meta name="GENERATOR" content="OpenOffice.org 3.1  (Linux)"&gt; 	&lt;style type="text/css"&gt; 	&lt;!-- 		@page { margin: 2cm } 		P { margin-bottom: 0.21cm } 	--&gt; 	&lt;/style&gt;  &lt;p style="margin-bottom: 0cm;" align="center"&gt;&lt;span style="color: rgb(0, 0, 0);font-size:85%;" &gt;&lt;span style="font-family:DejaVu Sans,sans-serif;"&gt;&lt;span style="font-size:20;"&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;   	&lt;meta equiv="CONTENT-TYPE" content="text/html; charset=utf-8"&gt; 	&lt;title&gt;&lt;/title&gt; 	&lt;meta name="GENERATOR" content="OpenOffice.org 3.1  (Linux)"&gt; 	&lt;style type="text/css"&gt; 	&lt;!-- 		@page { margin: 2cm } 		P { margin-bottom: 0.21cm } 	--&gt; 	&lt;/style&gt;  &lt;p style="margin-bottom: 0cm;" align="center"&gt;&lt;span style="color: rgb(0, 0, 0);font-size:85%;" &gt;&lt;span style="font-family:DejaVu Sans,sans-serif;"&gt;&lt;span style="font-size:20;"&gt;&lt;b&gt;Ejemplo&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="color: rgb(0, 0, 0);font-size:85%;" &gt;&lt;span style="font-family:DejaVu Serif,serif;"&gt;En este documento vamos a probar el paquete odfWeave.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="color: rgb(0, 0, 0);font-size:85%;" &gt;&lt;span style="font-family:DejaVu Serif,serif;"&gt;Primero cargamos los datos de forma oculta para el documento final.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="color: rgb(0, 0, 0);font-size:85%;" &gt;&lt;span style="font-family:DejaVu Serif,serif;"&gt;Los datos a estudiar contienen &lt;span style="color: rgb(0, 0, 255);"&gt;6&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; variables medidas sobre &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;32&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; coches&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="color: rgb(0, 0, 0);font-size:85%;" &gt;&lt;span style="font-family:DejaVu Serif,serif;"&gt;Podemos insertar una tabla resumen de los datos:&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;table style="color: rgb(0, 0, 0);" border="1" cellpadding="4" cellspacing="0" rules="rows" width="100%" frame="void"&gt; 	&lt;col width="43"&gt; 	&lt;col width="43"&gt; 	&lt;col width="43"&gt; 	&lt;col width="43"&gt; 	&lt;col width="43"&gt; 	&lt;col width="43"&gt; 	&lt;thead&gt; 		&lt;tr valign="top"&gt; 			&lt;td bg="" style="color: rgb(255, 255, 255);" width="17%"&gt; 				&lt;p align="center"&gt;&lt;span style="color: rgb(0, 0, 0);font-size:85%;" &gt;&lt;span style="font-family:Arial,sans-serif;"&gt;&lt;b&gt;mpg&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; 			&lt;/td&gt; 			&lt;td bg="" style="color: rgb(255, 255, 255);" width="17%"&gt; 				&lt;p align="center"&gt;&lt;span style="color: rgb(0, 0, 0);font-size:85%;" &gt;&lt;span style="font-family:Arial,sans-serif;"&gt;&lt;b&gt;cyl&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; 			&lt;/td&gt; 			&lt;td bg="" style="color: rgb(255, 255, 255);" width="17%"&gt; 				&lt;p align="center"&gt;&lt;span style="color: rgb(0, 0, 0);font-size:85%;" &gt;&lt;span style="font-family:Arial,sans-serif;"&gt;&lt;b&gt;disp&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; 			&lt;/td&gt; 			&lt;td bg="" style="color: rgb(255, 255, 255);" width="17%"&gt; 				&lt;p align="center"&gt;&lt;span style="color: rgb(0, 0, 0);font-size:85%;" &gt;&lt;span style="font-family:Arial,sans-serif;"&gt;&lt;b&gt;hp&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; 			&lt;/td&gt; 			&lt;td bg="" style="color: rgb(255, 255, 255);" width="17%"&gt; 				&lt;p align="center"&gt;&lt;span style="color: rgb(0, 0, 0);font-size:85%;" &gt;&lt;span style="font-family:Arial,sans-serif;"&gt;&lt;b&gt;drat&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; 			&lt;/td&gt; 			&lt;td bg="" style="color: rgb(255, 255, 255);" width="17%"&gt; 				&lt;p align="center"&gt;&lt;span style="color: rgb(0, 0, 0);font-size:85%;" &gt;&lt;span style="font-family:Arial,sans-serif;"&gt;&lt;b&gt;wt&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; 			&lt;/td&gt; 		&lt;/tr&gt; 	&lt;/thead&gt; 	&lt;tbody&gt; 		&lt;tr valign="top"&gt; 			&lt;td width="17%"&gt; 				&lt;p align="center"&gt;&lt;span style="color: rgb(0, 0, 0);font-size:85%;" &gt;&lt;span style="font-family:Arial,sans-serif;"&gt;20.091&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; 			&lt;/td&gt; 			&lt;td width="17%"&gt; 				&lt;p align="center"&gt;&lt;span style="color: rgb(0, 0, 0);font-size:85%;" &gt;&lt;span style="font-family:Arial,sans-serif;"&gt;6.188&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; 			&lt;/td&gt; 			&lt;td width="17%"&gt; 				&lt;p align="center"&gt;&lt;span style="color: rgb(0, 0, 0);font-size:85%;" &gt;&lt;span style="font-family:Arial,sans-serif;"&gt;230.722&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; 			&lt;/td&gt; 			&lt;td width="17%"&gt; 				&lt;p align="center"&gt;&lt;span style="color: rgb(0, 0, 0);font-size:85%;" &gt;&lt;span style="font-family:Arial,sans-serif;"&gt;146.688&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; 			&lt;/td&gt; 			&lt;td width="17%"&gt; 				&lt;p align="center"&gt;&lt;span style="color: rgb(0, 0, 0);font-size:85%;" &gt;&lt;span style="font-family:Arial,sans-serif;"&gt;3.597&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; 			&lt;/td&gt; 			&lt;td width="17%"&gt; 				&lt;p align="center"&gt;&lt;span style="color: rgb(0, 0, 0);font-size:85%;" &gt;&lt;span style="font-family:Arial,sans-serif;"&gt;3.217&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; 			&lt;/td&gt; 		&lt;/tr&gt; 	&lt;/tbody&gt; &lt;/table&gt;  &lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="color: rgb(0, 0, 0);font-size:85%;" &gt;&lt;span style="font-family:DejaVu Serif,serif;"&gt;También podemos añadir algún bonito gráfico:&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;  &lt;/p&gt;&lt;span style="font-size:85%;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_Lsnfr2zsR8A/SvYsyd7fvCI/AAAAAAAAA0A/G2ZSUUIJX0I/s1600-h/pairs.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 320px;" src="http://1.bp.blogspot.com/_Lsnfr2zsR8A/SvYsyd7fvCI/AAAAAAAAA0A/G2ZSUUIJX0I/s320/pairs.png" alt="" id="BLOGGER_PHOTO_ID_5401554048616741922" border="0" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;p style="margin-bottom: 0cm;" align="left"&gt;&lt;span style="color: rgb(0, 0, 0);font-size:85%;" &gt;&lt;span style="font-family:DejaVu Serif,serif;"&gt;Y así seguiría nuestro trabajo.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;hr style="height: 2px;font-size:78%;" align="center" &gt;&lt;br /&gt;El formato de las imágenes y su tamaño se controlan con las funciones &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;getImageDefs&lt;/span&gt;&lt;/span&gt; y &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;setImageDefs&lt;/span&gt;&lt;/span&gt;.&lt;br /&gt;Del mismo modo, el formato del texto o de las tablas se controla con las funciones de definición de estilo &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;getStyleDefs&lt;/span&gt;&lt;/span&gt; y &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;setStyleDefs&lt;/span&gt;&lt;/span&gt;, y las de asignación &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;getStyle&lt;/span&gt;&lt;/span&gt; y &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;setStyle&lt;/span&gt;&lt;/span&gt; para determinar algún elemento.&lt;br /&gt;&lt;br /&gt;La clase &lt;span style=";font-family:courier new;font-size:85%;"  &gt;odfTable&lt;/span&gt; se utiliza para convertir vectores, matrices y data frames a tablas ODF. La función &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;odfCat&lt;/span&gt;&lt;/span&gt; sirve para escribir texto directamente en el formato ODF. También hay funciones para crear listas y para insertar imágenes externas.&lt;br /&gt;&lt;br /&gt;Una vez tenemos el documento resultado, podemos utilizar OpenOffice para convertir manualmente este documento a otros formatos. Para ello se usa el menú &lt;span style="font-family:arial;"&gt;Guardar como...&lt;/span&gt; o&lt;span style="font-family:arial;"&gt; Exportar...&lt;/span&gt; del menú &lt;span style="font-family:arial;"&gt;Archivo&lt;/span&gt;. En algunos sistemas operativos también disponemos de programas conversores desde la consola.&lt;br /&gt;&lt;br /&gt;Para utilizar el paquete &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;odfWeave&lt;/span&gt;&lt;/span&gt; es necesario que nuestro ordenador disponga de un compresor/descompresor de archivos ZIP. También deberemos tener en cuenta que los gráficos se graban en formato PNG, por si nuestro sistema no tiene el dispositivo adecuado.&lt;br /&gt;&lt;br /&gt;&lt;meta equiv="CONTENT-TYPE" content="text/html; charset=utf-8"&gt; 	&lt;title&gt;&lt;/title&gt; 	&lt;meta name="GENERATOR" content="OpenOffice.org 3.1  (Linux)"&gt; 	&lt;style type="text/css"&gt; 	&lt;!-- 		@page { margin: 2cm } 		P { margin-bottom: 0.21cm } 	--&gt; 	&lt;/style&gt;     	&lt;meta equiv="CONTENT-TYPE" content="text/html; charset=utf-8"&gt; 	&lt;title&gt;&lt;/title&gt; 	&lt;meta name="GENERATOR" content="OpenOffice.org 3.1  (Linux)"&gt; 	&lt;style type="text/css"&gt; 	&lt;!-- 		@page { margin: 2cm } 		P { margin-bottom: 0.21cm } 	--&gt; 	&lt;/style&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4200017933558803500-1145228279185366843?l=erre-que-erre-paco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://erre-que-erre-paco.blogspot.com/feeds/1145228279185366843/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://erre-que-erre-paco.blogspot.com/2009/11/de-r-odf-el-paquete-odfweave.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4200017933558803500/posts/default/1145228279185366843'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4200017933558803500/posts/default/1145228279185366843'/><link rel='alternate' type='text/html' href='http://erre-que-erre-paco.blogspot.com/2009/11/de-r-odf-el-paquete-odfweave.html' title='De R a ODF: el paquete odfWeave'/><author><name>Paco</name><uri>http://www.blogger.com/profile/05414727581731452919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_Lsnfr2zsR8A/SwkQF-4sS9I/AAAAAAAAA0c/GGwOyuhdv68/S220/francesc.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_Lsnfr2zsR8A/SvcFnbwS8MI/AAAAAAAAA0I/K4Hsw6l1za8/s72-c/odfWeave.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4200017933558803500.post-7090051399155543460</id><published>2009-11-07T12:01:00.002+01:00</published><updated>2010-06-06T11:04:03.942+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='R'/><title type='text'>Test de Levene para la igualdad de varianzas</title><content type='html'>El test de Levene (1960) se usa para contrastar si &lt;i&gt;k&lt;/i&gt; muestras tienen la misma varianza, es decir, la homogeneidad de varianzas.       Otros contrastes, como por ejemplo el análisis de la varianza,       suponen que las varianzas son iguales para todos los grupos. De ahí la importancia de verificar con el test de Levene esa hipótesis.&lt;br /&gt;&lt;br /&gt;Este test es una alternativa al &lt;a href="http://en.wikipedia.org/wiki/Bartlett%27s_test"&gt;test de Bartlett&lt;/a&gt;.  El test de Levene es menos sensible a la falta de normalidad que el de Bartlett.  Sin embargo, si estamos seguros de que los datos provienen de una distribución normal, entonces el test de Bartlett es el mejor.&lt;br /&gt;&lt;br /&gt;El test de Levene se resuelve con un ANOVA de los valores absolutos de las desviaciones de los valores muestrales respecto a un estadístico de centralidad (media, mediana o media truncada) para cada grupo. La elección del estadístico de centralidad de los grupos detemina la robustez y la potencia del test.             Por robustez se entiende la habilidad del test para no detectar erróneamente varianzas distintas, cuando la distribución no es normal y las varianzas son realmente iguales.  La potencia significa la habilidad del test para señalar varianzas distintas, cuando efectivamente lo son.        &lt;br /&gt;&lt;br /&gt;El artículo original de Levene proponía la media como estadístico de centralidad. Brown y Forsythe (1974) extendieron este test al utilizar la mediana e incluso la media truncada al 10%.             Sus estudios de Monte Carlo mostraron que la utilización de la media truncada mejoraba el test cuando los datos seguían una distribución de Cauchy (colas grandes)             y la mediana conseguía mejorarlo cuando los datos seguían una &lt;img src="http://www.itl.nist.gov/div898/handbook/eda/section3/eqns/chisq4.gif" alt="Chi-Square(4)" align="absmiddle" /&gt; (distribución asimétrica). Con la media se consigue el mejor test para distribuciones simétricas y con colas moderadas.             &lt;p&gt;             Así pues, aunque la elección óptima depende de la distribución de los datos, la definición del test basada en la mediana es la recomendación general ya que proporciona una buena robustez para la mayoría de distribuciones no normales y, al mismo tiempo, una aceptable potencia.  Si conocemos la distribución de los datos, podemos optar por alguna otra de las opciones.          &lt;/p&gt;El paquete &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;car&lt;/span&gt;&lt;/span&gt; &lt;span style="font-style: italic;"&gt;Companion to Applied Regression&lt;/span&gt; de J. Fox trae una función &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;levene.test&lt;/span&gt;&lt;/span&gt; con la mediana como medida de centralidad de los grupos. El mismo test está incorporado al paquete &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;Rcmdr&lt;/span&gt;&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Aplicar el test de Levene a unos datos con la opción de la media truncada como medida de centralidad es un ejercicio sencillo:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family: courier new;"&gt;datos &lt;- c(rcauchy(50,0,10),rcauchy(50,0,20),rcauchy(50,0,30))&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: courier new;"&gt;grupo &lt;- gl(3,50)&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: courier new;"&gt;boxplot(datos~grupo)&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: courier new;"&gt;func &lt;- function(x) mean(x,trim=0.1)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;medias_trunc &lt;- tapply(datos,grupo,func)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;desv &lt;- abs(datos-medias_trunc[grupo])&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;summary(aov(desv~grupo))&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Referencias&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Brown, M. B. and Forsythe, A. B. (1974),  &lt;i&gt;Journal of the American Statistical Association&lt;/i&gt;, 69, 364-367.&lt;br /&gt;&lt;br /&gt;Fox, J. (2002), An R and S-PLUS Companion to Applied Regression, Sage.&lt;br /&gt;&lt;br /&gt;Levene, H. (1960). In &lt;i&gt;Contributions to Probability and Statistics: Essays in Honor of Harold Hotelling&lt;/i&gt;, I. Olkin  et al. eds., Stanford University Press, pp. 278-292.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4200017933558803500-7090051399155543460?l=erre-que-erre-paco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://erre-que-erre-paco.blogspot.com/feeds/7090051399155543460/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://erre-que-erre-paco.blogspot.com/2009/11/test-de-levene-para-la-igualdad-de.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4200017933558803500/posts/default/7090051399155543460'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4200017933558803500/posts/default/7090051399155543460'/><link rel='alternate' type='text/html' href='http://erre-que-erre-paco.blogspot.com/2009/11/test-de-levene-para-la-igualdad-de.html' title='Test de Levene para la igualdad de varianzas'/><author><name>Paco</name><uri>http://www.blogger.com/profile/05414727581731452919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_Lsnfr2zsR8A/SwkQF-4sS9I/AAAAAAAAA0c/GGwOyuhdv68/S220/francesc.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4200017933558803500.post-4780661767278187212</id><published>2009-10-31T17:21:00.007+01:00</published><updated>2010-06-06T11:04:03.942+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='R'/><title type='text'>Contrastes de normalidad</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_Lsnfr2zsR8A/SuxkOfublSI/AAAAAAAAAzo/4mYiEqZd4XU/s1600-h/Rplot.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 400px;" src="http://3.bp.blogspot.com/_Lsnfr2zsR8A/SuxkOfublSI/AAAAAAAAAzo/4mYiEqZd4XU/s400/Rplot.png" alt="" id="BLOGGER_PHOTO_ID_5398800253507573026" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Cuando se dispone de muy pocos datos no es posible utilizar el omnipresente &lt;a href="http://en.wikipedia.org/wiki/Pearson%27s_chi-square_test"&gt;test ji-cuadrado&lt;/a&gt; para contrastar la normalidad de la muestra. Por ello quedan descartados la función &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;chisq.test&lt;/span&gt;&lt;/span&gt; y el histograma como gráfico más apropiado.&lt;br /&gt;&lt;br /&gt;Algunos test no paramétricos sobre la distribución de la población se basan en la función de distribución empírica EDF de la muestra. La idea es comparar sus valores (en azul en el gráfico anterior) con la función de distribución teórica (en rojo).&lt;br /&gt;En el caso de la distribución normal como distribución teórica disponemos de todo un paquete llamado &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;nortest&lt;/span&gt;&lt;/span&gt; con varios test.&lt;br /&gt;&lt;br /&gt;El más famoso es el test de &lt;a href="http://en.wikipedia.org/wiki/Lilliefors_test"&gt;Lilliefors&lt;/a&gt; que es una variante del test de &lt;a href="http://en.wikipedia.org/wiki/Kolmogorov%E2%80%93Smirnov_test"&gt;Kolmogorov-Smirnov&lt;/a&gt;. Aunque el estadístico que se obtiene con &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;lillie.test(x)&lt;/span&gt;&lt;/span&gt; es el mismo que el que se obtiene con &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;ks.test(x, "pnorm", mean(x), sd(x))&lt;/span&gt;&lt;/span&gt;, no es correcto utilizar el &lt;span style="font-style: italic;"&gt;p&lt;/span&gt;-valor de éste último con la hipótesis de normalidad (media y varianza desconocidas), ya que la distribución del estadístico es diferente cuando estimamos los parámetros. Dicho estadístico es el valor absoluto de la máxima diferencia entre los valores de la distribución empírica y la teórica.&lt;br /&gt;Sin embargo, el test de Lilliefors ha quedado superado por el test de Anderson-Darling o el de Cramer-von Mises.&lt;br /&gt;El test de &lt;a href="http://en.wikipedia.org/wiki/Anderson%E2%80%93Darling_test"&gt;Anderson-Darling&lt;/a&gt; &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;ad.test&lt;/span&gt;&lt;/span&gt; es el test EDF recomendado por Stephens (1986). Comparado con el test de  &lt;a href="http://en.wikipedia.org/wiki/Cram%C3%A9r%E2%80%93von-Mises_criterion"&gt;Cramer-von Mises&lt;/a&gt; &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;cvm.test&lt;/span&gt;&lt;/span&gt; (como segunda elección) da mayor peso a las colas de la distribución.&lt;br /&gt;&lt;br /&gt;Por otra parte, el test de &lt;a href="http://en.wikipedia.org/wiki/Shapiro%E2%80%93Wilk_test"&gt;Shapiro-Wilk&lt;/a&gt; se puede calcular con la función &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;shapiro.test&lt;/span&gt;&lt;/span&gt;. Este test se basa en el estadístico &lt;span style="font-style: italic;"&gt;W&lt;/span&gt; proporcional al cuadrado de una combinación lineal de los estadísticos de orden.&lt;br /&gt;&lt;br /&gt;El estadístico del test de Shapiro-Francia &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;sf.test&lt;/span&gt;&lt;/span&gt; es simplemente la correlación al cuadrado entre los valores muestrales ordenados y los cuantiles (aproximados) esperados para la distribución normal estandar. El &lt;span style="font-style: italic;"&gt;p&lt;/span&gt;-valor se calcula con la fórmula dada por Royston (1993).&lt;br /&gt;&lt;br /&gt;A pesar de lo dicho al principio, el paquete &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;nortest&lt;/span&gt;&lt;/span&gt; dispone de la función &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;pearson.test&lt;/span&gt;&lt;/span&gt; para resolver el test ji-cuadrado. En todo caso no se recomienda por su inferior potencia comparado con los test anteriores.&lt;br /&gt;&lt;br /&gt;Recientemente, RKward ha añadido al menú &lt;span style=";font-family:verdana;font-size:85%;"  &gt;Distributions&lt;/span&gt; el test de normalidad de &lt;a href="http://en.wikipedia.org/wiki/Jarque%E2%80%93Bera_test"&gt;Jarque y Bera&lt;/a&gt; que se obtiene con el paquete &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;tseries&lt;/span&gt;&lt;/span&gt; y la función &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;jarque.bera.test&lt;/span&gt;&lt;/span&gt;. El estadístico de este test se basa en los valores muestrales de asimetría y curtosis. Judge et al. (1988) y Gujarati (2003) recomiendan este test.&lt;br /&gt;&lt;br /&gt;Finalmente, como se puede observar en el gráfico inicial de este artículo, resulta muy difícil para el ojo humano apreciar si la distribución empírica se ajusta a la teórica, al menos con ese tipo de gráfico.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family: courier new;"&gt;y &lt;- c(-0.1, -1.8, -0.1, -0.8, -1.0,  0.5,         1.4, -0.8, -0.2, -0.3, -0.4,  0.5)&lt;br /&gt;Fn12 &lt;- ecdf(y)&lt;br /&gt;plot(Fn12, col.p="blue", col.h="blue", lwd=2,      main="Empirical Cumulative Distribution Function")&lt;br /&gt;abline(v=knots(Fn12),lty=2,col='gray70')&lt;br /&gt;curve(pnorm(x), col="red", add=T)&lt;/span&gt;&lt;/span&gt; &lt;br /&gt;&lt;br /&gt;Por ello es mejor utilizar el gráfico &lt;span style="font-size:85%;"&gt;&lt;span style="font-family: courier new;"&gt;qqnorm(y)&lt;/span&gt;&lt;/span&gt; que dibuja los valores muestrales en el eje Y y los cuantiles teóricos en el eje X. Observemos que en este caso los cuantiles teóricos son &lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family: courier new;"&gt;sort(qqnorm(y)$x)==qnorm((1:12-0.5)/12)  &lt;/span&gt;&lt;/span&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_Lsnfr2zsR8A/SuxzbGTUsuI/AAAAAAAAAzw/2EST1V64dfw/s1600-h/Rplot2.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 400px;" src="http://3.bp.blogspot.com/_Lsnfr2zsR8A/SuxzbGTUsuI/AAAAAAAAAzw/2EST1V64dfw/s400/Rplot2.png" alt="" id="BLOGGER_PHOTO_ID_5398816962695705314" border="0" /&gt;&lt;/a&gt;La recta dibujada une los puntos del primer y tercer cuartil.&lt;br /&gt;&lt;h3&gt;Referencias&lt;/h3&gt;  Stephens, M.A. (1986): Tests based on EDF statistics. In: D'Agostino, R.B. and Stephens, M.A., eds.: Goodness-of-Fit Techniques. Marcel Dekker, New York.&lt;br /&gt;&lt;br /&gt;Royston, P. (1993): A pocket-calculator algorithm for the Shapiro-Francia test for non-normality: an application to medicine. Statistics in Medicine, 12, 181–184.&lt;br /&gt;&lt;br /&gt;Thode Jr., H.C. (2002): Testing for  Normality. Marcel Dekker, New York.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4200017933558803500-4780661767278187212?l=erre-que-erre-paco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://erre-que-erre-paco.blogspot.com/feeds/4780661767278187212/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://erre-que-erre-paco.blogspot.com/2009/10/contrastes-de-normalidad.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4200017933558803500/posts/default/4780661767278187212'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4200017933558803500/posts/default/4780661767278187212'/><link rel='alternate' type='text/html' href='http://erre-que-erre-paco.blogspot.com/2009/10/contrastes-de-normalidad.html' title='Contrastes de normalidad'/><author><name>Paco</name><uri>http://www.blogger.com/profile/05414727581731452919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_Lsnfr2zsR8A/SwkQF-4sS9I/AAAAAAAAA0c/GGwOyuhdv68/S220/francesc.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_Lsnfr2zsR8A/SuxkOfublSI/AAAAAAAAAzo/4mYiEqZd4XU/s72-c/Rplot.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4200017933558803500.post-282241632489441218</id><published>2009-10-29T08:26:00.003+01:00</published><updated>2010-06-06T11:04:03.943+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='R'/><title type='text'>R 2.10.0</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://cran.es.r-project.org/Rlogo.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 100px; height: 76px;" src="http://cran.es.r-project.org/Rlogo.jpg" alt="" border="0" /&gt;&lt;/a&gt;Ya está disponible la versión 2.10.0 para las principales distribuciones de &lt;a href="http://cran.es.r-project.org/bin/linux/"&gt;Linux&lt;/a&gt;, para &lt;a href="http://cran.es.r-project.org/bin/windows/base/"&gt;Windows&lt;/a&gt; y para &lt;a href="http://cran.es.r-project.org/bin/macosx/"&gt;Mac&lt;/a&gt;.&lt;br /&gt;Los (K)ubunteros sólo debemos esperar que nuestro actualizador nos avise del cambio.&lt;br /&gt;Esta nueva versión trae importantes cambios, especialmente en el sistema de ayuda, y mejoras en multitud de funciones, además de las correcciones de algunos fallos.&lt;br /&gt;Más detalles en &lt;a href="http://cran.es.r-project.org/src/base/NEWS"&gt;what's new&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4200017933558803500-282241632489441218?l=erre-que-erre-paco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://erre-que-erre-paco.blogspot.com/feeds/282241632489441218/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://erre-que-erre-paco.blogspot.com/2009/10/r-2100.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4200017933558803500/posts/default/282241632489441218'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4200017933558803500/posts/default/282241632489441218'/><link rel='alternate' type='text/html' href='http://erre-que-erre-paco.blogspot.com/2009/10/r-2100.html' title='R 2.10.0'/><author><name>Paco</name><uri>http://www.blogger.com/profile/05414727581731452919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_Lsnfr2zsR8A/SwkQF-4sS9I/AAAAAAAAA0c/GGwOyuhdv68/S220/francesc.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4200017933558803500.post-4292392855998256136</id><published>2009-10-25T19:58:00.004+01:00</published><updated>2010-06-06T11:04:03.943+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='R'/><title type='text'>Interpolación de colores</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_Lsnfr2zsR8A/SuSgEi5ExyI/AAAAAAAAAzg/uBN4I43T6YI/s1600-h/Rplot.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 400px;" src="http://1.bp.blogspot.com/_Lsnfr2zsR8A/SuSgEi5ExyI/AAAAAAAAAzg/uBN4I43T6YI/s400/Rplot.png" alt="" id="BLOGGER_PHOTO_ID_5396614253442811682" border="0" /&gt;&lt;/a&gt;En algunos gráficos es preciso disponer de una rampa de colores, es decir, ir de un color a otro(s) de forma gradual. Para ello, R dispone de las funciones &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;colorRamp()&lt;/span&gt;&lt;/span&gt; y &lt;span style=";font-family:courier new;font-size:85%;"  &gt;colorRampPalette() &lt;/span&gt;que podemos utilizar con dos, tres o más colores.&lt;br /&gt;Estas funciones devuelven funciones que interpolan un conjunto de colores para crear una rampa de nuevos colores o una paleta. La función resultado de &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;colorRamp()&lt;/span&gt;&lt;/span&gt; va del intervalo [0,1] a la rampa de colores. En cambio &lt;span style=";font-family:courier new;font-size:85%;"  &gt;colorRampPalette()&lt;span style="font-family:times new roman;"&gt;&lt;/span&gt;&lt;/span&gt; proporciona una función que toma como argumento un número entero y devuelve exactamente ese número de colores interpolados.&lt;br /&gt;&lt;br /&gt;Por ejemplo,&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;&gt; colorRampPalette(c("red", "orange", "blue"), space = "rgb")(10)&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;[1] "#FF0000" "#FF2400" "#FF4900" "#FF6E00" "#FF9200" "#E2921C" "#AA6E54"&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;[8] "#71498D" "#3824C6" "#0000FF"&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;nos da una paleta de 10 colores interpolados del rojo al azul, pasando por el naranja.&lt;br /&gt;&lt;br /&gt;El gráfico de este artículo se consigue con la paleta de colores &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;jet.colors&lt;/span&gt;&lt;/span&gt; al estilo de Matlab:&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&gt; jet.colors &lt;-&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt; colorRampPalette(c("#00007F", "blue", "#007FFF", "cyan",&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;                     "#7FFF7F", "yellow", "#FF7F00", "red", "#7F0000"))&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;&gt; filled.contour(volcano, color = jet.colors, asp = 1)&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4200017933558803500-4292392855998256136?l=erre-que-erre-paco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://erre-que-erre-paco.blogspot.com/feeds/4292392855998256136/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://erre-que-erre-paco.blogspot.com/2009/10/interpolacion-de-colores.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4200017933558803500/posts/default/4292392855998256136'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4200017933558803500/posts/default/4292392855998256136'/><link rel='alternate' type='text/html' href='http://erre-que-erre-paco.blogspot.com/2009/10/interpolacion-de-colores.html' title='Interpolación de colores'/><author><name>Paco</name><uri>http://www.blogger.com/profile/05414727581731452919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_Lsnfr2zsR8A/SwkQF-4sS9I/AAAAAAAAA0c/GGwOyuhdv68/S220/francesc.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_Lsnfr2zsR8A/SuSgEi5ExyI/AAAAAAAAAzg/uBN4I43T6YI/s72-c/Rplot.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4200017933558803500.post-2387919238581469632</id><published>2009-10-25T08:29:00.008+01:00</published><updated>2010-06-06T11:04:03.944+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='R'/><title type='text'>Georg Cantor</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://upload.wikimedia.org/wikipedia/commons/1/17/Georg_Cantor.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 222px; height: 326px;" src="http://upload.wikimedia.org/wikipedia/commons/1/17/Georg_Cantor.jpg" alt="" border="0" /&gt;&lt;/a&gt;He leído en &lt;a href="http://arieder.wordpress.com/2009/10/20/introducing-cantor/"&gt;arieder's Blog&lt;/a&gt; que KDE Edu está preparando una nueva aplicación para la versión 4.4: &lt;span style="font-weight: bold;"&gt;Cantor&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Se trata de utilizar algunas de las mejores aplicaciones matemáticas libres totalmente integradas en el escritorio KDE de linux (aunque también está en Windows).&lt;br /&gt;Entre estas aplicaciones de cálculo numérico, simbólico y estadístico están, por ahora, &lt;a title="Sage" href="http://sagemath.org/" target="_blank"&gt;Sage&lt;/a&gt;, &lt;a title="Maxima" href="http://maxima.sf.net/" target="_blank"&gt;Maxima&lt;/a&gt; y &lt;a title="R" href="http://www.r-project.org/" target="_blank"&gt;R&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;El nombre de este interfaz se ha tomado del matemático padre de la Teoría de Conjuntos: &lt;a href="http://en.wikipedia.org/wiki/Georg_Cantor"&gt;Georg Cantor&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Aquí tenéis una imagen de la nueva aplicación:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_Lsnfr2zsR8A/SuQCvjPk3UI/AAAAAAAAAzY/gKpMFbzHVqM/s1600-h/cantor_maxima_demo_big.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 298px;" src="http://1.bp.blogspot.com/_Lsnfr2zsR8A/SuQCvjPk3UI/AAAAAAAAAzY/gKpMFbzHVqM/s400/cantor_maxima_demo_big.png" alt="" id="BLOGGER_PHOTO_ID_5396441269434375490" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4200017933558803500-2387919238581469632?l=erre-que-erre-paco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://erre-que-erre-paco.blogspot.com/feeds/2387919238581469632/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://erre-que-erre-paco.blogspot.com/2009/10/georg-cantor.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4200017933558803500/posts/default/2387919238581469632'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4200017933558803500/posts/default/2387919238581469632'/><link rel='alternate' type='text/html' href='http://erre-que-erre-paco.blogspot.com/2009/10/georg-cantor.html' title='Georg Cantor'/><author><name>Paco</name><uri>http://www.blogger.com/profile/05414727581731452919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_Lsnfr2zsR8A/SwkQF-4sS9I/AAAAAAAAA0c/GGwOyuhdv68/S220/francesc.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_Lsnfr2zsR8A/SuQCvjPk3UI/AAAAAAAAAzY/gKpMFbzHVqM/s72-c/cantor_maxima_demo_big.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4200017933558803500.post-7980369019514609822</id><published>2009-10-24T18:28:00.009+02:00</published><updated>2010-06-06T11:04:03.944+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='R'/><title type='text'>Colores</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_Lsnfr2zsR8A/SuMrVjZRdLI/AAAAAAAAAyo/oE-kB5uNbbg/s1600-h/Rplot.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 400px;" src="http://1.bp.blogspot.com/_Lsnfr2zsR8A/SuMrVjZRdLI/AAAAAAAAAyo/oE-kB5uNbbg/s400/Rplot.png" alt="" id="BLOGGER_PHOTO_ID_5396204427798475954" border="0" /&gt;&lt;/a&gt;En R hay varias formas de especificar un color. La más sencilla es llamar al color por su nombre, eso sí, en inglés. Por ejemplo, el color azul con su intensidad máxima se consigue con &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;"blue"&lt;/span&gt;&lt;/span&gt;.&lt;br /&gt;El listado completo de nombres que R reconoce se puede obtener con la función &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;colors()&lt;/span&gt;&lt;/span&gt; o &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;colours()&lt;/span&gt;&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;&gt; colors()[1:10]&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;&lt;br /&gt;[1] "white"         "aliceblue"     "antiquewhite"  "antiquewhite1"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt; [5] "antiquewhite2" "antiquewhite3" "antiquewhite4" "aquamarine"   &lt;/span&gt; &lt;span style="font-family:courier new;"&gt;&lt;br /&gt;[9] "aquamarine1"   "aquamarine2"  &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;También se puede especificar un color con el código de intensidades RGB. Para ello disponemos de la función &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;rgb()&lt;/span&gt;&lt;/span&gt; en la que debemos introducir la intensidad de los tres colores básicos: R rojo, G verde y B azul.&lt;br /&gt;La intensidad se mide por defecto de 0 a 1, pero también se puede fijar entre 0 y 255.&lt;br /&gt;Por ejemplo, el azul corporativo de la Universidad de Barcelona es un Azul Pantone 285, que según la equivalencia del artículo &lt;a href="http://www.zeald.com/Resources/Effective+Website+Design+-+Tips++Tricks/Convert+Pantone+Colours+to+RGB.html"&gt;Convert Pantone Colours to RGB&lt;/a&gt; se puede utilizar como&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;rgb(58, 117, 196, max=255)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.ub.es/imatgeub/imatges/ide_bas.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 220px; height: 75px;" src="http://www.ub.es/imatgeub/imatges/ide_bas.jpg" alt="" border="0" /&gt;&lt;/a&gt;Una alternativa consiste en especificar las intensidades en forma hexadecimal. El azul UB es&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;"#3A75C4"&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Los dos dígitos hexadecimales para cada intensidad se mueven entre el cero &lt;span style="font-family:courier new;"&gt;00&lt;/span&gt; y el máximo &lt;span style="font-family:courier new;"&gt;FF&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;También disponemos de una función &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;hsv()&lt;/span&gt;&lt;/span&gt; para especificar los colores con la tripleta HSV Hue-Saturation-Value. Sin demasiada precisión se puede decir que el matiz (hue) indica la posición del color en el arco iris, desde el rojo (&lt;span style="font-family:courier new;"&gt;0&lt;/span&gt;) , a través del naranja, amarillo, verde, azul, índigo, hasta el violeta (&lt;span style="font-family:courier new;"&gt;1&lt;/span&gt;).&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_Lsnfr2zsR8A/SuM-PXEragI/AAAAAAAAAzI/pTT9GqtCPlE/s1600-h/grafico2-P8.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 269px; height: 244px;" src="http://2.bp.blogspot.com/_Lsnfr2zsR8A/SuM-PXEragI/AAAAAAAAAzI/pTT9GqtCPlE/s320/grafico2-P8.png" alt="" id="BLOGGER_PHOTO_ID_5396225212132583938" border="0" /&gt;&lt;/a&gt;La saturación fija la intensidad del color entre la palidez y la viveza.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_Lsnfr2zsR8A/SuM-C9T7ZkI/AAAAAAAAAzA/QM79m9cdf5k/s1600-h/grafico2-P9.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 305px;" src="http://4.bp.blogspot.com/_Lsnfr2zsR8A/SuM-C9T7ZkI/AAAAAAAAAzA/QM79m9cdf5k/s320/grafico2-P9.png" alt="" id="BLOGGER_PHOTO_ID_5396224999058794050" border="0" /&gt;&lt;/a&gt;Por último, el valor o brillo se usa para describir que tan claro u oscuro parece un color, y se refiere a la cantidad de luz percibida.&lt;br /&gt;&lt;br /&gt;La función &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;rgb2hsv()&lt;/span&gt;&lt;/span&gt; nos puede ayudar a convertir un color de RGB a HSV. El azul UB es&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;&gt; rgb2hsv(58,117,196)&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;      [,1]&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;h 0.5954106&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;s 0.7040816&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;v 0.7686275&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Otro sistema para especificar un color es fijar un conjunto de colores o paleta y seleccionar uno de ellos con un número entero, es decir, su posición en la paleta. Por defecto tenemos ya definida una paleta de colores que podemos ver con la función &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;palette()&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;&gt; palette()&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;[1] "black"   "red"     "green3"  "blue"    "cyan"    "magenta" "yellow"&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;[8] "gray"&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;En esta paleta el color azul es el número 4.&lt;br /&gt;Así pues podemos definir nuestra propia paleta y utilizarla con los números de posición de los colores.&lt;br /&gt;&lt;br /&gt;Por último decir que R proporciona algunas funciones que definen grupos de colores que tienen algún sentido de conjunto. Ejemplos: &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;rainbow()&lt;/span&gt;&lt;/span&gt;, &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;heat.colors()&lt;/span&gt;&lt;/span&gt;, &lt;span style=";font-family:courier new;font-size:85%;"  &gt;terrain.colors()&lt;/span&gt;,&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt; topo.colors()&lt;/span&gt;&lt;/span&gt;, &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;cm.colors()&lt;/span&gt;&lt;/span&gt; y &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;grey()&lt;/span&gt;&lt;/span&gt;o&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt; gray()&lt;/span&gt;&lt;/span&gt;. En el gráfico que encabeza este artículo podemos ver los colores de estos grupos.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4200017933558803500-7980369019514609822?l=erre-que-erre-paco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://erre-que-erre-paco.blogspot.com/feeds/7980369019514609822/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://erre-que-erre-paco.blogspot.com/2009/10/colores.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4200017933558803500/posts/default/7980369019514609822'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4200017933558803500/posts/default/7980369019514609822'/><link rel='alternate' type='text/html' href='http://erre-que-erre-paco.blogspot.com/2009/10/colores.html' title='Colores'/><author><name>Paco</name><uri>http://www.blogger.com/profile/05414727581731452919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_Lsnfr2zsR8A/SwkQF-4sS9I/AAAAAAAAA0c/GGwOyuhdv68/S220/francesc.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_Lsnfr2zsR8A/SuMrVjZRdLI/AAAAAAAAAyo/oE-kB5uNbbg/s72-c/Rplot.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4200017933558803500.post-2978589228705995934</id><published>2009-10-12T21:30:00.006+02:00</published><updated>2010-06-06T11:04:03.945+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='R'/><title type='text'>Símbolos para los datos</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_Lsnfr2zsR8A/StOEB5FxAdI/AAAAAAAAAyg/_yXN9dhAsTs/s1600-h/Rplot.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 400px;" src="http://2.bp.blogspot.com/_Lsnfr2zsR8A/StOEB5FxAdI/AAAAAAAAAyg/_yXN9dhAsTs/s400/Rplot.png" alt="" id="BLOGGER_PHOTO_ID_5391798346932355538" border="0" /&gt;&lt;/a&gt;R proporciona un conjunto de 26 símbolos que podemos seleccionar con el parámetro &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;pch&lt;/span&gt;&lt;/span&gt;  para un gráfico. Este parámetro puede tomar como valor un número entero entre 0 y 25 o un único carácter de texto (ver figura). Algunos de los símbolos predefinidos (entre el 21 y el 25) se pueden rellenar con un color diferente al del borde. El color se concreta con el parámetro &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;bg&lt;/span&gt;&lt;/span&gt;.&lt;br /&gt;Si &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;pch&lt;/span&gt;&lt;/span&gt; es un carácter entonces la letra se usa como símbolo. El carácter "." es un caso especial para el que el dispositivo trata de dibujar un punto lo más pequeño posible.&lt;br /&gt;El tamaño de los símbolos está relacionado con el tamaño del texto y el parámetro &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;cex&lt;/span&gt;&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;El gráfico de arriba está en el libro &lt;a href="http://www.stat.auckland.ac.nz/%7Epaul/RGraphics/rgraphics.html"&gt;&lt;span style="font-style: italic;"&gt;R Graphics&lt;/span&gt;&lt;/a&gt; de Paul Murrell y se consigue con el siguiente código:&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;library(RGraphics)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;br /&gt;ncol &lt;- 6&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;br /&gt;nrow &lt;- 5&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;br /&gt;grid.rect(gp=gpar(col="grey"))&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;br /&gt;for (i in 1:nrow) {&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;br /&gt; for (j in 1:ncol) {&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;br /&gt;   x &lt;- unit(j/(ncol+1), "npc")&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;br /&gt;   y &lt;- unit(i/(nrow + 1), "npc")&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;br /&gt;   pch &lt;- (i - 1)*ncol + j - 1&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;br /&gt;   if (pch &gt; 25) &lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;br /&gt;     pch &lt;- c("A", "b", ".", "#")[pch - 25]&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;br /&gt;   grid.points(x + unit(3, "mm"), y, &lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;br /&gt;     pch=pch, gp=gpar(fill="grey"))&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;br /&gt;   grid.text(pch, x - unit(3, "mm"), y, gp=gpar(col="grey"))&lt;/span&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;br /&gt;   }&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4200017933558803500-2978589228705995934?l=erre-que-erre-paco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://erre-que-erre-paco.blogspot.com/feeds/2978589228705995934/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://erre-que-erre-paco.blogspot.com/2009/10/simbolos-para-los-datos.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4200017933558803500/posts/default/2978589228705995934'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4200017933558803500/posts/default/2978589228705995934'/><link rel='alternate' type='text/html' href='http://erre-que-erre-paco.blogspot.com/2009/10/simbolos-para-los-datos.html' title='Símbolos para los datos'/><author><name>Paco</name><uri>http://www.blogger.com/profile/05414727581731452919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_Lsnfr2zsR8A/SwkQF-4sS9I/AAAAAAAAA0c/GGwOyuhdv68/S220/francesc.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_Lsnfr2zsR8A/StOEB5FxAdI/AAAAAAAAAyg/_yXN9dhAsTs/s72-c/Rplot.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4200017933558803500.post-801971826342085679</id><published>2009-10-12T11:51:00.004+02:00</published><updated>2010-06-06T11:04:03.946+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='R'/><title type='text'>Gráfico de densidad condicional</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_Lsnfr2zsR8A/StMT00YfI2I/AAAAAAAAAyY/YOno1S0gt2I/s1600-h/Rplot.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 400px;" src="http://4.bp.blogspot.com/_Lsnfr2zsR8A/StMT00YfI2I/AAAAAAAAAyY/YOno1S0gt2I/s400/Rplot.png" alt="" id="BLOGGER_PHOTO_ID_5391674977028088674" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Si se pretende estudiar la regresión cuando la variable respuesta es dicotómica, un primer paso para comprender el posible modelo es examinar algún tipo de gráfico como el de la densidad condicional.&lt;br /&gt;&lt;br /&gt;Con los datos de &lt;span style="font-family:courier new;"&gt;plasma&lt;/span&gt; del paquete &lt;span style="font-weight: bold;"&gt;HSAUR&lt;/span&gt;, el gráfico de arriba se consigue con las instrucciones&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;&gt; library(HSAUR)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&gt; data(plasma, package=HSAUR)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&gt; cdplot(ESR ~ fibrinogen, data = plasma)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;En el gráfico se observa que los niveles altos de la proteína se asocian con valores de ESR por encima de 20 mm/hr.&lt;br /&gt;&lt;br /&gt;A continuación podemos ajustar un modelo de regresión logística con la función &lt;span style="font-family:courier new;"&gt;glm&lt;/span&gt;. Si tomamos como distribución de la variable respuesta la binomial, el código puede ser&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;&gt; plasma.glm &lt;- glm(ESR ~ fibrinogen, data = plasma, family = binomial())&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;&gt; coef(plasma.glm)&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Por defecto, la función de enlace (&lt;span style="font-style: italic;"&gt;link function&lt;/span&gt;)  para la familia binomial es la función logística.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4200017933558803500-801971826342085679?l=erre-que-erre-paco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://erre-que-erre-paco.blogspot.com/feeds/801971826342085679/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://erre-que-erre-paco.blogspot.com/2009/10/grafico-de-densidad-condicional.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4200017933558803500/posts/default/801971826342085679'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4200017933558803500/posts/default/801971826342085679'/><link rel='alternate' type='text/html' href='http://erre-que-erre-paco.blogspot.com/2009/10/grafico-de-densidad-condicional.html' title='Gráfico de densidad condicional'/><author><name>Paco</name><uri>http://www.blogger.com/profile/05414727581731452919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_Lsnfr2zsR8A/SwkQF-4sS9I/AAAAAAAAA0c/GGwOyuhdv68/S220/francesc.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_Lsnfr2zsR8A/StMT00YfI2I/AAAAAAAAAyY/YOno1S0gt2I/s72-c/Rplot.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4200017933558803500.post-6803487900461271147</id><published>2009-10-10T20:03:00.005+02:00</published><updated>2010-06-06T11:04:03.946+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='R'/><title type='text'>De R a HTML: el paquete hwriter</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;span style=";font-family:arial;font-size:130%;"  &gt;&lt;span style="font-weight: bold;"&gt;Three iris flowers&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_Lsnfr2zsR8A/StDMlBVtKzI/AAAAAAAAAxg/FA6-GTGDrOI/s1600-h/grafico2-P7.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 150px;" src="http://4.bp.blogspot.com/_Lsnfr2zsR8A/StDMlBVtKzI/AAAAAAAAAxg/FA6-GTGDrOI/s400/grafico2-P7.png" alt="" id="BLOGGER_PHOTO_ID_5391033690349185842" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Para completar un informe como resultado de un análisis estadístico o bioinformático es muy importante la combinación de datos e hipervínculos en un documento HTML. Existen ya varias herramientas para exportar datos de R a documentos HTML. Por ejemplo, el paquete &lt;span style="font-weight: bold;"&gt;R2HTML&lt;/span&gt; es capaz de traducir una buena colección de objetos de R a HTML, pero con él no resulta nada fácil combinarlos en una presentación estructurada. Por otra parte, el paquete &lt;span style="font-weight: bold;"&gt;xtable&lt;/span&gt; puede traducir matrices de R de forma sencilla, pero tampoco puede combinar varios elementos de HTML y tiene un conjunto muy limitado de instrucciones de formato.&lt;br /&gt;Sin embargo, el paquete &lt;span style="font-weight: bold;"&gt;hwriter&lt;/span&gt; de Gregoire Pau y Wolfgang Huber permite traducir diversos objetos de R a HTML y combinarlos en un documento con un cierto diseño y formato.&lt;br /&gt;&lt;br /&gt;Este paquete utiliza la función &lt;span style="font-family:courier new;"&gt;hwriter&lt;/span&gt; que permite escribir un objeto en un documento HTML, al mismo tiempo que le añadimos algún formato o un hipervínculo. Pero la clave es que si existe una conexión abierta hacia un documento HTML ya creado, entonces las instrucciones HTML se añaden a dicho documento.&lt;br /&gt;&lt;br /&gt;El siguiente código escribe una sencilla página con un título y una tabla:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;div style="text-align: left;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;&gt; library(hwriter)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;&gt; &lt;/span&gt;&lt;span style="font-family:courier new;"&gt;hwriter("Three iris flowers", "iris.html", heading=1)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;&gt; p &lt;- openPage("iris.html")&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;&gt; himg &lt;-  hwriteImage(c("iris1.jpg","iris2.jpg","iris3.jpg"),&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;+ link=c("http://en.wikipedia.org/wiki/Iris_virginica",&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;+ "http://en.wikipedia.org/wiki/Iris_versicolor",&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;+ "http://en.wikipedia.org/wiki/Iris_virginica"), table=FALSE)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;&gt; mat &lt;- rbind(himg, c("Setosa","Versicolor","Virginica"))&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;&gt; rownames(mat) &lt;- c("Image", "Species")&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;&gt; hwrite(mat, p, br=TRUE, center=TRUE,&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;+ row.bgcolor=list(Species=c("#ffaacc", "#ff88aa", "#ff6688")),&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;+ col.bgcolor="#ffffaa", row.style=list(Species="text-align:center"))&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;&gt; closePage("iris.html")&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Observemos que la función es capaz de escribir una mezcla de imágenes y datos en una tabla, junto con hipervínculos, en la conexión abierta &lt;span style="font-style: italic;"&gt;p&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Podemos saber más de este paquete en el artículo de &lt;a href="http://journal.r-project.org/2009-1/RJournal_2009-1_Pau+Huber.pdf"&gt;RJournal_2009-1&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;También podemos ver en acción todas las funciones y sus parámetros en una página de ejemplo que se muestra con la instrucción&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;&gt; example(hwriter)&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4200017933558803500-6803487900461271147?l=erre-que-erre-paco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://erre-que-erre-paco.blogspot.com/feeds/6803487900461271147/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://erre-que-erre-paco.blogspot.com/2009/10/de-r-html-el-paquete-hwriter.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4200017933558803500/posts/default/6803487900461271147'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4200017933558803500/posts/default/6803487900461271147'/><link rel='alternate' type='text/html' href='http://erre-que-erre-paco.blogspot.com/2009/10/de-r-html-el-paquete-hwriter.html' title='De R a HTML: el paquete hwriter'/><author><name>Paco</name><uri>http://www.blogger.com/profile/05414727581731452919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_Lsnfr2zsR8A/SwkQF-4sS9I/AAAAAAAAA0c/GGwOyuhdv68/S220/francesc.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_Lsnfr2zsR8A/StDMlBVtKzI/AAAAAAAAAxg/FA6-GTGDrOI/s72-c/grafico2-P7.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4200017933558803500.post-778961642237001640</id><published>2009-10-10T13:30:00.008+02:00</published><updated>2010-06-06T11:04:03.947+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='R'/><title type='text'>I Conferencia Hispana R-Project</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_Lsnfr2zsR8A/StENviNAUsI/AAAAAAAAAxw/s8zSSA3npfs/s1600-h/umu.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 300px; height: 296px;" src="http://2.bp.blogspot.com/_Lsnfr2zsR8A/StENviNAUsI/AAAAAAAAAxw/s8zSSA3npfs/s400/umu.png" alt="" id="BLOGGER_PHOTO_ID_5391105339225559746" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Con el subtítulo de &lt;span style="font-style: italic;"&gt;I Jornadas de usuarios de R en castellano&lt;/span&gt;, se celebrará los días 26 y 27 de noviembre en Murcia una reunión para impulsar el desarrollo y la documentación de R en castellano.&lt;br /&gt;&lt;br /&gt;El objetivo principal es conectar a los usuarios de habla hispana y organizar algún tipo de comunidad que optimize los esfuerzos y canalize la colaboración.&lt;br /&gt;&lt;br /&gt;Estas jornadas se plantean como una reunión de distintos profesionales que tienen en común:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;El uso de R como instrumento científico o docente&lt;/li&gt;&lt;li&gt;La necesidad de conectarse con redes de trabajo en R&lt;/li&gt;&lt;li&gt;Interés por el desarrollo de materiales (textos o librerías)&lt;/li&gt;&lt;li&gt;Deseo de colaborar en proyectos ya iniciados&lt;/li&gt;&lt;li&gt;Participar en la traducción de materiales desarrollados&lt;/li&gt;&lt;li&gt;Crear grupos de trabajo de distintas disciplinas&lt;/li&gt;&lt;/ul&gt; Se pretende la constitución de grupos de trabajo y la puesta en común de materiales desarrollados en la lengua de Cervantes y dispersos en la red.&lt;br /&gt;Podéis hallar toda la información y los detalles para la inscripción en la página web: &lt;a href="http://www.ereros.org/"&gt;http://www.ereros.org&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;¡Allí nos veremos!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4200017933558803500-778961642237001640?l=erre-que-erre-paco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://erre-que-erre-paco.blogspot.com/feeds/778961642237001640/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://erre-que-erre-paco.blogspot.com/2009/10/i-conferencia-hispana-r-project.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4200017933558803500/posts/default/778961642237001640'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4200017933558803500/posts/default/778961642237001640'/><link rel='alternate' type='text/html' href='http://erre-que-erre-paco.blogspot.com/2009/10/i-conferencia-hispana-r-project.html' title='I Conferencia Hispana R-Project'/><author><name>Paco</name><uri>http://www.blogger.com/profile/05414727581731452919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_Lsnfr2zsR8A/SwkQF-4sS9I/AAAAAAAAA0c/GGwOyuhdv68/S220/francesc.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_Lsnfr2zsR8A/StENviNAUsI/AAAAAAAAAxw/s8zSSA3npfs/s72-c/umu.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4200017933558803500.post-8531971358999283993</id><published>2009-10-01T10:08:00.005+02:00</published><updated>2010-06-06T11:04:03.947+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='R'/><title type='text'>Integración de datos</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_Lsnfr2zsR8A/SsRlNTcDx1I/AAAAAAAAAxQ/gLxdqZOFesc/s1600-h/MFA_grafic.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 254px; height: 320px;" src="http://3.bp.blogspot.com/_Lsnfr2zsR8A/SsRlNTcDx1I/AAAAAAAAAxQ/gLxdqZOFesc/s320/MFA_grafic.png" alt="" id="BLOGGER_PHOTO_ID_5387542333472622418" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Ferran Reverter.&lt;/span&gt;&lt;br /&gt;Cada vez hay más demanda de integración de datos provenientes de diferentes fuentes. Especialmente en estudios médicos donde la información de la genómica (datos de microarrys) se complementa con datos clínicos. En R disponemos, entre otros, de tres &lt;span lang="es-ES"&gt;&lt;i&gt;packages&lt;/i&gt;&lt;/span&gt;&lt;span lang="es-ES"&gt; que implementan técnicas de análisis multivariante muy adecuados para la integración. El package FactoMineR desarrolla el Análisis Factorial Múltiple (&lt;/span&gt;Escofier-Pagès, 1998&lt;span lang="es-ES"&gt;), el CCA implementa el Análsis de Correlaciones Canónicas Regularizado (Vinod, 1976) y el VEGAN desarrolla el Análisis de Correspondencias Canónico (Ter Braak, 1986).&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://factominer.free.fr/index.html"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 74px;" src="http://1.bp.blogspot.com/_Lsnfr2zsR8A/SsRlgWJpWHI/AAAAAAAAAxY/A9RsyfuYlHc/s400/FactoMineR.png" alt="" id="BLOGGER_PHOTO_ID_5387542660618213490" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;p style="margin-bottom: 0cm;" align="justify"&gt; &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4200017933558803500-8531971358999283993?l=erre-que-erre-paco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://erre-que-erre-paco.blogspot.com/feeds/8531971358999283993/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://erre-que-erre-paco.blogspot.com/2009/10/integracion-de-datos.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4200017933558803500/posts/default/8531971358999283993'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4200017933558803500/posts/default/8531971358999283993'/><link rel='alternate' type='text/html' href='http://erre-que-erre-paco.blogspot.com/2009/10/integracion-de-datos.html' title='Integración de datos'/><author><name>Paco</name><uri>http://www.blogger.com/profile/05414727581731452919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_Lsnfr2zsR8A/SwkQF-4sS9I/AAAAAAAAA0c/GGwOyuhdv68/S220/francesc.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_Lsnfr2zsR8A/SsRlNTcDx1I/AAAAAAAAAxQ/gLxdqZOFesc/s72-c/MFA_grafic.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4200017933558803500.post-4869856620796972851</id><published>2009-09-27T21:03:00.008+02:00</published><updated>2010-06-06T11:04:03.948+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='R'/><title type='text'>Cádiz y R-Commander</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm2.static.flickr.com/1414/534285204_cdc40292d0.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 500px; height: 334px;" src="http://farm2.static.flickr.com/1414/534285204_cdc40292d0.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://l.yimg.com/g/images/spaceball.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 1px; height: 1px;" src="http://l.yimg.com/g/images/spaceball.gif" alt="" border="0" /&gt;&lt;/a&gt;Entre los días 23 y 25 de septiembre se ha celebrado en Cádiz la XII Conferencia Española de Biometría a la que hemos asistido un buen grupo de investigadores e investigadoras, tanto españoles como portugueses, incluso alguno/a venido/a de iberoamérica. Entre las comunicaciones se ha notado una gran presencia de cálculos y gráficos realizados con R o alguno de sus paquetes. Pero lo que yo quiero destacar aquí es la realización de un curso de R con R-Commander paralelo a las sesiones que ofrecieron los organizadores de forma gratuita a todos los asistentes. Además nos regalaron un manual de &lt;a href="http://knuth.uca.es/ebrcmdr"&gt;Estadística Básica con R y R-Commander&lt;/a&gt; en español.&lt;br /&gt;La Universidad de Cádiz ha hecho una apuesta decidida por el &lt;a href="http://www.uca.es/softwarelibre"&gt;software libre&lt;/a&gt; que es realmente envidiable. Y como no, la utilización de R en todos los ámbitos de la estadística. A destacar la puesta en marcha, en el curso 2006/2007, del &lt;a href="http://knuth.uca.es/R/doku.php"&gt;&lt;span class="link-external"&gt;proyecto R-UCA&lt;/span&gt;&lt;/a&gt;.&lt;br /&gt;R-Commander o su paquete Rcmdr es es una interfaz gráfica para R desarrollada por John Fox. La página web de R-Commander es &lt;a href="http://socserv.socsci.mcmaster.ca/jfox/Misc/Rcmdr/"&gt;http://socserv.socsci.mcmaster.ca/jfox/Misc/Rcmdr/&lt;/a&gt;. Su objetivo es cubrir toda la estadística de un curso elemental. Lo consigue de sobras.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_Lsnfr2zsR8A/StEOyYieyhI/AAAAAAAAAyA/z1wOE8OUlZQ/s1600-h/Rcmdr.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 285px;" src="http://3.bp.blogspot.com/_Lsnfr2zsR8A/StEOyYieyhI/AAAAAAAAAyA/z1wOE8OUlZQ/s400/Rcmdr.png" alt="" id="BLOGGER_PHOTO_ID_5391106487682517522" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Por cierto, os recomiendo el restaurante "Los naranjos" en Zahara de la Sierra. Fantástico.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4200017933558803500-4869856620796972851?l=erre-que-erre-paco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://erre-que-erre-paco.blogspot.com/feeds/4869856620796972851/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://erre-que-erre-paco.blogspot.com/2009/09/cadiz-y-rcmdr.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4200017933558803500/posts/default/4869856620796972851'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4200017933558803500/posts/default/4869856620796972851'/><link rel='alternate' type='text/html' href='http://erre-que-erre-paco.blogspot.com/2009/09/cadiz-y-rcmdr.html' title='Cádiz y R-Commander'/><author><name>Paco</name><uri>http://www.blogger.com/profile/05414727581731452919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_Lsnfr2zsR8A/SwkQF-4sS9I/AAAAAAAAA0c/GGwOyuhdv68/S220/francesc.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm2.static.flickr.com/1414/534285204_cdc40292d0_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4200017933558803500.post-2306153235538820650</id><published>2009-09-13T20:29:00.002+02:00</published><updated>2010-06-06T11:04:03.948+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='R'/><title type='text'>RKWard 0.5.1</title><content type='html'>Disponible desde el 4 de agosto.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://sourceforge.net/apps/mediawiki/rkward/nfs/project/r/rk/rkward/thumb/e/ec/RKWardApplicationCombined.png/600px-RKWardApplicationCombined.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 600px; height: 384px;" src="http://sourceforge.net/apps/mediawiki/rkward/nfs/project/r/rk/rkward/thumb/e/ec/RKWardApplicationCombined.png/600px-RKWardApplicationCombined.png" alt="" border="0" /&gt;&lt;/a&gt;RKWard es una interfaz transparente &lt;span style="font-style: italic;"&gt;easy to use&lt;/span&gt; para el lenguaje R en un escritorio KDE para linux o windows.&lt;br /&gt;Aunque todavía está en desarrollo, RKWard es un potente entorno de trabajo para el lenguaje R que facilita la utilización de las instrucciones, las funciones estadísticas, la creación de gráficos y su integración en ofimática. La intención es que RKWard sea un substituto libre para algunos paquetes comerciales de estadística.&lt;br /&gt;&lt;br /&gt;Además de la facilidad de uso, hay tres aspectos que son especialmente importantes:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Es una interfaz transparente para el lenguaje R. Es decir, no esconde la sintaxis del lenguaje, sino que la proporciona de una forma más conveniente. Expertos y novatos pueden realizar la mayoría de los trabajos habituales. Una interfaz únicamente gráfica no podría servir a todo el poder del lenguaje R. En algunos casos, los usuarios querrán ajustar algunas funciones a sus necesidades particulares, por ejemplo para automatizar algunos trabajos. RKWard muestra la sintaxis, es visible para el usuario, y lo hace posible.&lt;/li&gt;&lt;li&gt;Para la salida, RKWard se esfuerza en separar el contenido y el diseño. No trata de diseñar sus propias tablas o gráficos, que han de convertirse "a mano" al estilo utilizado en una determinada publicación. Actualmente RKWard utiliza HTML para su producción. Sin embargo, utilizando las definiciones de estilo, es posible modificar el formato de salida para que coincida con la demanda de una publicación. En futuras versiones RKWard incluso buscará una mayor integración con alguna de las suites de ofimática existentes.&lt;/li&gt;&lt;li&gt;Se basa en un lenguaje, que no sólo es muy potente, sino que también es extensible y para el que ya existen cientos de extensiones.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;Las novedades de la última versión son diversas y van desde la mejora de algunas funcionalidades, a la corrección de errores, pasando por el ajuste de algunos iconos.&lt;br /&gt;Ya está disponible una compilación para &lt;a href="http://sourceforge.net/projects/rkward/files/Current_Stable_Releases/rkward_0.5.1-1_i386.deb/download"&gt;Debian Sid i386&lt;/a&gt; y para otras distribuciones podéis ir a la página de &lt;a href="http://sourceforge.net/apps/mediawiki/rkward/index.php?title=Binaries_and_Build_Scripts"&gt;Binaries and Build Scripts&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4200017933558803500-2306153235538820650?l=erre-que-erre-paco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://erre-que-erre-paco.blogspot.com/feeds/2306153235538820650/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://erre-que-erre-paco.blogspot.com/2009/09/rkward-051.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4200017933558803500/posts/default/2306153235538820650'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4200017933558803500/posts/default/2306153235538820650'/><link rel='alternate' type='text/html' href='http://erre-que-erre-paco.blogspot.com/2009/09/rkward-051.html' title='RKWard 0.5.1'/><author><name>Paco</name><uri>http://www.blogger.com/profile/05414727581731452919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_Lsnfr2zsR8A/SwkQF-4sS9I/AAAAAAAAA0c/GGwOyuhdv68/S220/francesc.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4200017933558803500.post-2828981509106002426</id><published>2009-09-06T13:34:00.007+02:00</published><updated>2009-09-13T18:33:17.999+02:00</updated><title type='text'>Estimación de una función de densidad bivariante</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_Lsnfr2zsR8A/SqPMq-ZvvmI/AAAAAAAAAw4/CjNewi1jMgI/s1600-h/Rplot.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 399px; height: 400px;" src="http://4.bp.blogspot.com/_Lsnfr2zsR8A/SqPMq-ZvvmI/AAAAAAAAAw4/CjNewi1jMgI/s400/Rplot.png" alt="" id="BLOGGER_PHOTO_ID_5378367418688061026" border="0" /&gt;&lt;/a&gt;Del mismo modo que la función &lt;span style="font-family:courier new;"&gt;density&lt;/span&gt;  se usa para calcular un conjunto de estimadores de densidad kernel, podemos estimar una densidad bivariante con la función &lt;span style="font-family:courier new;"&gt;bkde2D&lt;/span&gt; del paquete &lt;span style="font-family:courier new;"&gt;KernSmooth&lt;/span&gt; (Wand and Ripley, 2005).&lt;br /&gt;&lt;br /&gt;El gráfico de este artículo se ha obtenido con los datos de energía y temperatura de unas estrellas (en logaritmos) del paquete &lt;span style="font-family:courier new;"&gt;HSAUR&lt;/span&gt; y el siguiente código:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;&gt; install.packages(c("HSAUR","KernSmooth"))&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&gt; library(HSAUR)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&gt; library(KernSmooth)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&gt; data(CYGOB1, package="HSAUR")&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&gt; CYGOB1d &lt;- bkde2D(CYGOB1, bandwidth = sapply(CYGOB1, dpik))&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&gt; persp(x = CYGOB1d$x1, y = CYGOB1d$x2, z = CYGOB1d$fhat,&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;+ xlab = "log surface temperature",&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;+ ylab = "log light intensity",&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;+ zlab = "estimated density",&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;+ theta = -35, axes = TRUE, box = TRUE)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;También podemos hacer un gráfico de contornos con la función &lt;span style="font-family:courier new;"&gt;contour&lt;/span&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_Lsnfr2zsR8A/SqPfPm2EeKI/AAAAAAAAAxA/YmdRROgxEhk/s1600-h/Rplot.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 373px;" src="http://4.bp.blogspot.com/_Lsnfr2zsR8A/SqPfPm2EeKI/AAAAAAAAAxA/YmdRROgxEhk/s400/Rplot.png" alt="" id="BLOGGER_PHOTO_ID_5378387839228868770" border="0" /&gt;&lt;/a&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;&gt; contour(x = CYGOB1d$x1, y = CYGOB1d$x2, z = CYGOB1d$fhat,&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;+ xlab = "log surface temperature",&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;+ ylab = "log light intensity")&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(204, 0, 0);"&gt;Font:&lt;/span&gt; B.S. Everitt &amp;amp; T. Hothorn, &lt;span style="font-style: italic;"&gt;A Handbook of Statistical Analysis Using R&lt;/span&gt;, Chapman &amp;amp; Hall/CRC, 2006.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4200017933558803500-2828981509106002426?l=erre-que-erre-paco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://erre-que-erre-paco.blogspot.com/feeds/2828981509106002426/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://erre-que-erre-paco.blogspot.com/2009/09/estimacion-de-una-funcion-de-densidad.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4200017933558803500/posts/default/2828981509106002426'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4200017933558803500/posts/default/2828981509106002426'/><link rel='alternate' type='text/html' href='http://erre-que-erre-paco.blogspot.com/2009/09/estimacion-de-una-funcion-de-densidad.html' title='Estimación de una función de densidad bivariante'/><author><name>Paco</name><uri>http://www.blogger.com/profile/05414727581731452919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_Lsnfr2zsR8A/SwkQF-4sS9I/AAAAAAAAA0c/GGwOyuhdv68/S220/francesc.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_Lsnfr2zsR8A/SqPMq-ZvvmI/AAAAAAAAAw4/CjNewi1jMgI/s72-c/Rplot.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4200017933558803500.post-5193734159051516782</id><published>2009-09-05T10:48:00.003+02:00</published><updated>2009-09-05T11:42:30.011+02:00</updated><title type='text'>SPSS + R = PASW Statistics Developer</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.spss.com/es/software/statistics/developer/images/Rgraph.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 592px; height: 549px;" src="http://www.spss.com/es/software/statistics/developer/images/Rgraph.gif" alt="" border="0" /&gt;&lt;/a&gt;Según SPSS Inc., su nuevo producto &lt;a href="http://www.spss.com/es/software/statistics/developer/"&gt;PASW Statistics Developer&lt;/a&gt; permite que los programadores de R y Python integren procedimientos en la sintaxis de PASW® Statistics para que los usuarios puedan acceder a ellos, dicen que de forma más "amigable".&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.spss.com/es/media/collateral/statistics/developer.pdf"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 60px; height: 77px;" src="http://www.spss.com/images/pasw/statistics/icon-developer.png" alt="" border="0" /&gt;&lt;/a&gt;Tres son los retos que pretenden resolver con su producto: la implementación de funciones y paquetes de R, su integración en un entorno de menús y procedimientos tipo SPSS y el manejo de bases de datos de gran tamaño. Eso sí, afirman que no es una implementación comercial del lenguaje R, sino un programa, de "precio modesto", para integrar funciones de R y paquetes en un formato que permite su ejecución "fácil y eficaz".&lt;br /&gt;&lt;br /&gt;Yo creo, confieso que sin haberlo probado, que se trata de aprovechar los nuevos procedimientos desarrollados en R y utilizarlos en el nuevo producto. Los directivos de SPSS Inc. reconocen implícita y explícitamente que en el campo de la investigación en estadística, pero también en su aplicación a las ciencias básicas y experimentales, R es el lenguaje de mayor éxito.&lt;br /&gt;Si no puedes vencer a tu competidor, ...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4200017933558803500-5193734159051516782?l=erre-que-erre-paco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://erre-que-erre-paco.blogspot.com/feeds/5193734159051516782/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://erre-que-erre-paco.blogspot.com/2009/09/spss-r-pasw-statistics-developer.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4200017933558803500/posts/default/5193734159051516782'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4200017933558803500/posts/default/5193734159051516782'/><link rel='alternate' type='text/html' href='http://erre-que-erre-paco.blogspot.com/2009/09/spss-r-pasw-statistics-developer.html' title='SPSS + R = PASW Statistics Developer'/><author><name>Paco</name><uri>http://www.blogger.com/profile/05414727581731452919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_Lsnfr2zsR8A/SwkQF-4sS9I/AAAAAAAAA0c/GGwOyuhdv68/S220/francesc.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4200017933558803500.post-1513136686099092062</id><published>2009-09-01T15:37:00.002+02:00</published><updated>2009-09-01T16:37:45.438+02:00</updated><title type='text'>SystemRescueCD</title><content type='html'>Crea una copia de seguridad de una partición del disco duro.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://static.flickr.com/3424/3747359667_a8a24f82d2.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 500px; height: 340px;" src="http://static.flickr.com/3424/3747359667_a8a24f82d2.jpg" alt="" border="0" /&gt;&lt;/a&gt;No os ha pasado, que en ciertas situaciones como actualizaciones o fallos técnicos, habéis pensado: ¿Porqué no tengo una copia de seguridad?&lt;br /&gt;En el caso de los archivos asociados al sistema operativo, la cosa es especialmente delicada. No es suficiente con tener alguna copia de los archivos en sí. Debemos tener una copia de todo el sistema, es decir, de la partición donde se encuentra el sistema. Normalmente, en sistemas como Linux se dispone de una partición específica "/" para los archivos del sistema y otra para los documentos "/home". En Windows también es conveniente esta separación pero no todo el mundo la hace.&lt;br /&gt;&lt;br /&gt;SystemRescueCD es un LiveCD de Linux (también en lápiz USB) con algunos programas imprescindibles para administrar y reparar particiones del disco duro como Gparted o Partimage. No requiere ninguna instalación, simplemente arrancar el ordenador desde el CD-ROM y puede utilizarse para administrar tanto servidores, como PC's domésticos (con Linux, Windows, etc). El kernel soporta la mayoría de sistemas de archivos como ext2/ext3/ext4, reiserfs, reiser4, btrfs, xfs, jfs, vfat, ntfs (windows xp), iso9660 e incluso sistemas de red (samba y nfs).&lt;br /&gt;&lt;br /&gt;En el blog de &lt;span style="font-weight: bold;"&gt;forat.info&lt;/span&gt; tenéis un tutorial con imágenes muy bueno para hacer una copia de seguridad de, por ejemplo, la partición del sistema "/"  (o /dev/sda1 en el ejemplo):&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.forat.info/2009/07/23/como-crear-y-restaurar-copias-de-seguridad-con-systemrescuecd-y-partimage/"&gt;Como crear y restaurar copias de seguridad con SystemRescueCD y partimage&lt;/a&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;El único detalle que puedo mejorar de ese tutorial es que creo que es necesario montar la partición donde grabaremos el archivo antes de lanzar el programa Partimage:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family: courier new;"&gt;mount /dev/sda5 /mnt/backup&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;y luego escribir todo el path del archivo donde creamos o rescatamos la copia&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-weight: bold; font-family: courier new;"&gt;* Image file to create/use&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;/mnt/backup/luiscarimage&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Aquí tenéis la &lt;a href="http://www.sysresccd.org/" target="blank" onclick="javascript:urchinTracker ('/outbound/article/www.sysresccd.org');"&gt;web oficial&lt;/a&gt; de donde podéis descargaros la &lt;a href="http://www.sysresccd.org/Download" target="blank" onclick="javascript:urchinTracker ('/outbound/article/www.sysresccd.org');"&gt;ISO&lt;/a&gt; del CD. Grabarla y hacer una copia de seguridad. La tranquilidad posterior es infinita.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4200017933558803500-1513136686099092062?l=erre-que-erre-paco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://erre-que-erre-paco.blogspot.com/feeds/1513136686099092062/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://erre-que-erre-paco.blogspot.com/2009/09/systemrescuecd.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4200017933558803500/posts/default/1513136686099092062'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4200017933558803500/posts/default/1513136686099092062'/><link rel='alternate' type='text/html' href='http://erre-que-erre-paco.blogspot.com/2009/09/systemrescuecd.html' title='SystemRescueCD'/><author><name>Paco</name><uri>http://www.blogger.com/profile/05414727581731452919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_Lsnfr2zsR8A/SwkQF-4sS9I/AAAAAAAAA0c/GGwOyuhdv68/S220/francesc.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4200017933558803500.post-2677433539076852391</id><published>2009-08-31T17:39:00.003+02:00</published><updated>2009-08-31T18:31:10.359+02:00</updated><title type='text'>Emacs-snapshot</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_Lsnfr2zsR8A/Spvuu4ZYcJI/AAAAAAAAAww/ZuMpbAsQfmA/s1600-h/grafico2-P6.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 353px; height: 400px;" src="http://1.bp.blogspot.com/_Lsnfr2zsR8A/Spvuu4ZYcJI/AAAAAAAAAww/ZuMpbAsQfmA/s400/grafico2-P6.png" alt="" id="BLOGGER_PHOTO_ID_5376153069377056914" border="0" /&gt;&lt;/a&gt;He estado a punto de titular este artículo &lt;a href="http://peadrop.com/blog/2007/01/06/pretty-emacs/"&gt;Pretty emacs&lt;/a&gt;, como el artículo de Alexandre Vassalotti. Creo que es muy acertado, pero he preferido no copiarlo.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://emacs.orebokech.com/"&gt;Emacs-snapshot&lt;/a&gt; es un conjunto de paquetes de la versión CVS de GNU Emacs, el conocido editor (y otras cosas), especialmente concebidos para la distribución de linux Debian y, por extensión, para Ubuntu. Han preparado dos versiones. Una para el sistema gráfico GTK y la otra para la consola. Yo utilizo la primera.&lt;br /&gt;A poco que se navegue un poco por la red, todo el mundo coincide que Emacs es un potentísimo editor (dicen que incluso &lt;span style="font-style: italic;"&gt;una forma de vida&lt;/span&gt;), pero también hay coincidencia en la dificultad de su aprendizaje. Así, muy pocos serán los que se atreban a probarlo. En Kubuntu hay una alternativa que es RKWard, mucho más sencillo i intuitivo, pero también ligeramente inestable. De modo que yo me animé a probar Emacs-snapshot.&lt;br /&gt;&lt;br /&gt;Para trabajar con R, la instalación de Emacs-snapshot es muy sencilla:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;sudo apt-get install emacs-snapshot ess&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;El segundo paquete es &lt;a href="http://ess.r-project.org/"&gt;Emacs speaks statistics&lt;/a&gt;, imprescindible para que Emacs y R se entiendan (se supone que R está instalado).&lt;br /&gt;Con esta instrucción se instalaran las versiones de los repositorios oficiales de Ubuntu. Si alguien desea lo último de lo último, hay que instalar los repositorios &lt;a href="https://launchpad.net/%7Eubuntu-elisp/+archive/ppa"&gt;PPA for Ubuntu Emacs Lisp&lt;/a&gt;.&lt;br /&gt;Una vez instalados, cuando abrimos un archivo con extensión .R, Emacs-snapshot lo reconoce como tal y la primera vez que utilicemos los botones de ejecución, abrirá una ventana para solicitar la carpeta de trabajo. La fijamos y aparecerá un buffer (ventana en el lenguaje de Emacs) con R en la parte inferior (ver la figura de arriba). En esta situación ya podemos ir ejecutando las instrucciones del archivo y viendo los resultados en el buffer inferior. El sistema es sencillo y muy práctico. Y a partir de aquí, buscar un manual de Emacs o seguir su tutorial. El esfuerzo vale la pena.&lt;br /&gt;&lt;br /&gt;Por cierto, ¿a qué viene lo de &lt;span style="font-style: italic;"&gt;pretty emacs&lt;/span&gt;?&lt;br /&gt;&lt;br /&gt;Pues, resulta que es muy fácil cambiar la fuente y poner la que más nos guste. La que viene por defecto suele ser horrorosa. Ver el post de &lt;a href="http://peadrop.com/blog/2007/01/06/pretty-emacs/"&gt;Alexandre Vassalotti&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;¿Y los que trabajamos con Windows? Pues a la izquierda tenéis un enlace a la, a mi parecer, más sencilla instalación para Windows.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4200017933558803500-2677433539076852391?l=erre-que-erre-paco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://erre-que-erre-paco.blogspot.com/feeds/2677433539076852391/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://erre-que-erre-paco.blogspot.com/2009/08/emacs-snapshot.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4200017933558803500/posts/default/2677433539076852391'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4200017933558803500/posts/default/2677433539076852391'/><link rel='alternate' type='text/html' href='http://erre-que-erre-paco.blogspot.com/2009/08/emacs-snapshot.html' title='Emacs-snapshot'/><author><name>Paco</name><uri>http://www.blogger.com/profile/05414727581731452919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_Lsnfr2zsR8A/SwkQF-4sS9I/AAAAAAAAA0c/GGwOyuhdv68/S220/francesc.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_Lsnfr2zsR8A/Spvuu4ZYcJI/AAAAAAAAAww/ZuMpbAsQfmA/s72-c/grafico2-P6.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4200017933558803500.post-1377575486040500132</id><published>2009-08-29T11:11:00.015+02:00</published><updated>2009-08-29T13:26:54.143+02:00</updated><title type='text'>Disposición de los gráficos (2)</title><content type='html'>Animado por los comentarios al anterior artículo sobre la &lt;a href="http://erre-que-erre-paco.blogspot.com/2009/08/disposicion-de-los-graficos.html"&gt;disposición de los gráficos&lt;/a&gt; con ayuda de la función &lt;span style="font-weight: bold;font-family:courier new;" &gt;layout&lt;/span&gt;, vamos a seguir explicando otras características de esta función.&lt;br /&gt;&lt;br /&gt;Ya indiqué que es posible dejar una casilla en blanco, basta poner un cero en la matriz, pero también es posible controlar las alturas o anchuras en centímetros. Para ello se utiliza la función &lt;span style="font-family:courier new;"&gt;lcm()&lt;/span&gt;. Veamos un ejemplo.&lt;br /&gt;&lt;br /&gt;Con este código&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;&gt; layout(matrix(c(1,0,2), ncol=1), heights=c(2, lcm(0.5), 1))&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;se consigue esta figura&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_Lsnfr2zsR8A/SpjzWkuuruI/AAAAAAAAAwQ/L6HMRr5yPZA/s1600-h/Rplot1"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 298px;" src="http://3.bp.blogspot.com/_Lsnfr2zsR8A/SpjzWkuuruI/AAAAAAAAAwQ/L6HMRr5yPZA/s320/Rplot1" alt="" id="BLOGGER_PHOTO_ID_5375313724409032418" border="0" /&gt;&lt;/a&gt;en el que tenemos 0.5 cm entre los dos gráficos.&lt;br /&gt;&lt;br /&gt;Otro aspecto a tener en cuenta es la relación de la altura con la anchura. Si queremos que ésta sea de 1:1, lo podemos indicar con el parámetro &lt;span style="font-family:courier new;"&gt;respect=T&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;&gt; layout(matrix(c(1,0,2), ncol=1), heights=c(2, lcm(0.5), 1), respect = T)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;El resultado es&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_Lsnfr2zsR8A/Spj1baHyu_I/AAAAAAAAAwY/nhszUIIIf1s/s1600-h/Rplot2"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 298px;" src="http://2.bp.blogspot.com/_Lsnfr2zsR8A/Spj1baHyu_I/AAAAAAAAAwY/nhszUIIIf1s/s320/Rplot2" alt="" id="BLOGGER_PHOTO_ID_5375316006483966962" border="0" /&gt;&lt;/a&gt;Si en la matriz se repite algún número, entonces el gráfico ocupará esas casillas (consecutivas).&lt;br /&gt;Ejemplo:&lt;br /&gt;&lt;pre  style="color: rgb(0, 0, 0);font-family:courier new;"&gt;&lt;span style="font-size:100%;"&gt;&gt; layout(rbind(c(1,2),&lt;br /&gt;              c(0,0),&lt;br /&gt;              c(3,3)),&lt;br /&gt;        heights=c(2,lcm(0.5),1),&lt;br /&gt;        respect=T)&lt;/span&gt;&lt;/pre&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_Lsnfr2zsR8A/Spj3qwWtSLI/AAAAAAAAAwg/Mb5qmg58S7I/s1600-h/Rplot3"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 298px;" src="http://3.bp.blogspot.com/_Lsnfr2zsR8A/Spj3qwWtSLI/AAAAAAAAAwg/Mb5qmg58S7I/s320/Rplot3" alt="" id="BLOGGER_PHOTO_ID_5375318469173397682" border="0" /&gt;&lt;/a&gt;Observemos que en esta figura la relación de aspecto se fija en 1 para la altura de la tercera fila (gráfico 3), de modo que el parámetro &lt;span style="font-family:courier new;"&gt;respect=T&lt;/span&gt; hace que la anchura de &lt;span style="font-style: italic;"&gt;una&lt;/span&gt; celda de la tercera fila también sea 1 (de las dos que hay).&lt;br /&gt;&lt;br /&gt;Finalmente podemos decir que el parámetro &lt;span style="font-family:courier new;"&gt;respect&lt;/span&gt; también admite como valor una matriz del mismo tamaño que la que indica la &lt;span style="font-style: italic;"&gt;layout&lt;/span&gt;, pero con ceros y un uno. El uno marca la posición de la celda para la que hay que respetar la relación de aspecto.&lt;br /&gt;&lt;br /&gt;Más ejemplos e información en el libro de Paul Murrell &lt;span style="font-style: italic;"&gt;R Graphics&lt;/span&gt; Ed. Chapman &amp;amp; Hall/CRC.&lt;br /&gt;&lt;br /&gt;Por cierto, los gráficos que muestran la &lt;span style="font-style: italic;"&gt;layout&lt;/span&gt; actual se consiguen con la instrucción&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;&gt; layout.show(&lt;span style="font-style: italic;"&gt;n&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;donde &lt;span style="font-style: italic;font-family:courier new;" &gt;n&lt;/span&gt; es el número máximo de gráficos.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4200017933558803500-1377575486040500132?l=erre-que-erre-paco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://erre-que-erre-paco.blogspot.com/feeds/1377575486040500132/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://erre-que-erre-paco.blogspot.com/2009/08/disposicion-de-los-graficos-2.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4200017933558803500/posts/default/1377575486040500132'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4200017933558803500/posts/default/1377575486040500132'/><link rel='alternate' type='text/html' href='http://erre-que-erre-paco.blogspot.com/2009/08/disposicion-de-los-graficos-2.html' title='Disposición de los gráficos (2)'/><author><name>Paco</name><uri>http://www.blogger.com/profile/05414727581731452919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_Lsnfr2zsR8A/SwkQF-4sS9I/AAAAAAAAA0c/GGwOyuhdv68/S220/francesc.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_Lsnfr2zsR8A/SpjzWkuuruI/AAAAAAAAAwQ/L6HMRr5yPZA/s72-c/Rplot1' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4200017933558803500.post-7767980656393017191</id><published>2009-08-26T23:20:00.013+02:00</published><updated>2009-08-29T17:26:29.477+02:00</updated><title type='text'>Iconos para carpetas de R</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_Lsnfr2zsR8A/SpWnQtHVSII/AAAAAAAAAv4/MwPw_fTvc7Q/s1600-h/folder_R.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 128px; height: 128px;" src="http://3.bp.blogspot.com/_Lsnfr2zsR8A/SpWnQtHVSII/AAAAAAAAAv4/MwPw_fTvc7Q/s400/folder_R.png" alt="" id="BLOGGER_PHOTO_ID_5374385635766651010" border="0" /&gt;&lt;/a&gt;Estos días de vacaciones he aprovechado  para estudiar un curso on-line de Gimp (programa GNU para crear gráficos). Es un curso básico pero muy bien hecho que podéis encontrar en el siguiente enlace:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://tecnologiaedu.uma.es/materiales/gimp/"&gt;Curso de El Gimp&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Como ejercicio, para probar mis conocimientos de capas y manipulación de las mismas, he preparado un icono en formato PNG para el tema Oxigen de KDE 4. Creo que ha quedado bastante digno. Lo podéis utilizar en vuestro sistema operativo Linux con KDE 4 (yo utilizo Kubuntu).&lt;br /&gt;&lt;br /&gt;Para aquellos que resisten con Windows XP también he preparado un conjunto de iconos de diferentes tamaños (32x32, 64x64 y 128x128) que podéis descargar del siguiente enlace&lt;br /&gt;&lt;br /&gt;&lt;a href="http://161.116.82.42/downloads/folder-R.zip"&gt;folder-R.zip&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_Lsnfr2zsR8A/SplIQIJt_jI/AAAAAAAAAwo/adBnr2wNCpM/s1600-h/folder-R-doc-128.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 128px; height: 128px;" src="http://1.bp.blogspot.com/_Lsnfr2zsR8A/SplIQIJt_jI/AAAAAAAAAwo/adBnr2wNCpM/s400/folder-R-doc-128.png" alt="" id="BLOGGER_PHOTO_ID_5375407072146751026" border="0" /&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_Lsnfr2zsR8A/SpWr7aAdQxI/AAAAAAAAAwA/JMAyJtISWhQ/s1600-h/folder-R-128.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 128px; height: 128px;" src="http://2.bp.blogspot.com/_Lsnfr2zsR8A/SpWr7aAdQxI/AAAAAAAAAwA/JMAyJtISWhQ/s400/folder-R-128.png" alt="" id="BLOGGER_PHOTO_ID_5374390767418426130" border="0" /&gt;&lt;/a&gt;Los iconos de Windows Vista y 7 son más sofisticados. ¿Alguien se anima?&lt;br /&gt;&lt;br /&gt;Por cierto, faltaba una versión para la gente que utiliza Gnome en Ubuntu:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_Lsnfr2zsR8A/SpZSiYLdMKI/AAAAAAAAAwI/PAJfRipVfr0/s1600-h/folder-R-human.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 128px; height: 128px;" src="http://3.bp.blogspot.com/_Lsnfr2zsR8A/SpZSiYLdMKI/AAAAAAAAAwI/PAJfRipVfr0/s400/folder-R-human.png" alt="" id="BLOGGER_PHOTO_ID_5374573955872796834" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4200017933558803500-7767980656393017191?l=erre-que-erre-paco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://erre-que-erre-paco.blogspot.com/feeds/7767980656393017191/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://erre-que-erre-paco.blogspot.com/2009/08/iconos-para-carpetas-de-r.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4200017933558803500/posts/default/7767980656393017191'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4200017933558803500/posts/default/7767980656393017191'/><link rel='alternate' type='text/html' href='http://erre-que-erre-paco.blogspot.com/2009/08/iconos-para-carpetas-de-r.html' title='Iconos para carpetas de R'/><author><name>Paco</name><uri>http://www.blogger.com/profile/05414727581731452919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_Lsnfr2zsR8A/SwkQF-4sS9I/AAAAAAAAA0c/GGwOyuhdv68/S220/francesc.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_Lsnfr2zsR8A/SpWnQtHVSII/AAAAAAAAAv4/MwPw_fTvc7Q/s72-c/folder_R.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4200017933558803500.post-8400812285047022396</id><published>2009-08-26T10:29:00.018+02:00</published><updated>2009-08-27T08:34:50.169+02:00</updated><title type='text'>Disposición de los gráficos</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_Lsnfr2zsR8A/SpTyk9EV94I/AAAAAAAAAvg/u4qIP_u-4zk/s1600-h/Figura.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 398px;" src="http://3.bp.blogspot.com/_Lsnfr2zsR8A/SpTyk9EV94I/AAAAAAAAAvg/u4qIP_u-4zk/s400/Figura.png" alt="" id="BLOGGER_PHOTO_ID_5374186972041836418" border="0" /&gt;&lt;/a&gt;En el paquete &lt;span style="font-weight: bold;"&gt;UsingR&lt;/span&gt; tenemos la función gráfica &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;simple.hist.and.boxplot&lt;/span&gt;&lt;/span&gt; que produce la figura que mostramos con el siguiente código:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;&gt; simple.hist.and.boxplot&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;function (x, ...) &lt;/span&gt; &lt;span style="font-family:courier new;"&gt;&lt;br /&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    op &lt;- par(no.readonly = TRUE)&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;&lt;br /&gt;on.exit(par(op))&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    layout(matrix(c(1, 2), 2, 1), heights = c(3, 1))&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    par(mai = c(1, 1, 1, 1)/2)&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;&lt;br /&gt;hist(x, xlab = FALSE, col = gray(0.95), yaxt = "n", ...)&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;&lt;br /&gt;rug(x)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    boxplot(x, horizontal = TRUE)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Observemos especialmente que se trata de combinar dos gráficos, el histograma y el boxplot. Pero el detalle que queremos destacar en este artículo es la disposición de los gráficos.&lt;br /&gt;&lt;br /&gt;Hay dos parámetros que sirven para disponer varios gráficos en una misma figura. Por ejemplo, en la figura del artículo &lt;a href="http://erre-que-erre-paco.blogspot.com/2009/08/chiplot.html"&gt;Chiplot&lt;/a&gt; se han dibujado dos gráficos de dispersión en horizontal. Esto se consigue con la instrucción&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;oldpar &lt;- par(mfrow = c(1,2))&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;El vector &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;c(nr,nc)&lt;/span&gt;&lt;/span&gt; especifica el número de filas y de columnas y el parámetro &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;mfrow&lt;/span&gt;&lt;/span&gt;  su escritura (por filas). También hay un parámetro &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;mfcol&lt;/span&gt;&lt;/span&gt; para escribir por columnas.&lt;br /&gt;&lt;br /&gt;Recordar que la modificación de un parámetro es para toda la sesión, de manera que si queremos revertir el cambio debemos ejecutar&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;par(oldpar)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Sin embargo, estos parámetros sólo dibujan gráficos del mismo tamaño. ¿Cómo se consique una disposición como la del gráfico que encabeza este artículo?&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_Lsnfr2zsR8A/SpT5H-8jvjI/AAAAAAAAAvw/64qsDA0a6-Y/s1600-h/Rplot.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 318px;" src="http://1.bp.blogspot.com/_Lsnfr2zsR8A/SpT5H-8jvjI/AAAAAAAAAvw/64qsDA0a6-Y/s320/Rplot.png" alt="" id="BLOGGER_PHOTO_ID_5374194170911243826" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;La respuesta es la instrucción &lt;span style="font-weight: bold;font-family:courier new;" &gt;layout&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Básicamente, en la instrucción &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;layout&lt;/span&gt;&lt;/span&gt; debemos especificar una matriz de números correlativos 1,2,... (puede incluir ceros) que indicarán el orden de escritura. Un cero dejará la posición en blanco. La ventaja es que podemos definir las alturas de las filas y las anchuras de las columnas.&lt;br /&gt;&lt;br /&gt;Para lograr la disposición de la figura anterior hacemos&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;&gt; mm &lt;- matrix(c(1,2), nrow = 2)&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;&gt; layout(mm, heights = c(3,1))&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Observemos que la definición de las alturas es proporcional, es decir, el primer gráfico ocupará 3/(3+1) del total, mientras que el segundo 1/(3+1).&lt;br /&gt;&lt;br /&gt;Otros detalles de la función &lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;layout&lt;/span&gt;&lt;/span&gt; los dejaremos para otro artículo.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4200017933558803500-8400812285047022396?l=erre-que-erre-paco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://erre-que-erre-paco.blogspot.com/feeds/8400812285047022396/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://erre-que-erre-paco.blogspot.com/2009/08/disposicion-de-los-graficos.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4200017933558803500/posts/default/8400812285047022396'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4200017933558803500/posts/default/8400812285047022396'/><link rel='alternate' type='text/html' href='http://erre-que-erre-paco.blogspot.com/2009/08/disposicion-de-los-graficos.html' title='Disposición de los gráficos'/><author><name>Paco</name><uri>http://www.blogger.com/profile/05414727581731452919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_Lsnfr2zsR8A/SwkQF-4sS9I/AAAAAAAAA0c/GGwOyuhdv68/S220/francesc.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_Lsnfr2zsR8A/SpTyk9EV94I/AAAAAAAAAvg/u4qIP_u-4zk/s72-c/Figura.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4200017933558803500.post-2890299171768164729</id><published>2009-08-23T17:32:00.004+02:00</published><updated>2009-08-23T18:33:10.706+02:00</updated><title type='text'>Colores transparentes</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_Lsnfr2zsR8A/SpFqC2CZdAI/AAAAAAAAAvY/3rXLggZE76A/s1600-h/MiFigura"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 373px;" src="http://4.bp.blogspot.com/_Lsnfr2zsR8A/SpFqC2CZdAI/AAAAAAAAAvY/3rXLggZE76A/s400/MiFigura" alt="" id="BLOGGER_PHOTO_ID_5373192427527566338" border="0" /&gt;&lt;/a&gt;En algunas ocasiones puede ser de gran utilidad disponer de colores transparentes. En un gráfico como el de arriba, la acumulación de puntos se hace más visible utilizando un color transparente para los puntos.&lt;br /&gt;&lt;br /&gt;La función &lt;span style="font-family:courier new;"&gt;rgb&lt;/span&gt; de definición de un color dispone de un parámetro &lt;span style="font-family:courier new;"&gt;alpha&lt;/span&gt; (entre 0 y 1, por defecto 1) que controla el nivel de transparencia. Por ejemplo, podemos definir un rojo transparente así&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;&gt; rojo20 &lt;- rgb(1,0,0,0.2)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;El gráfico de la figura de arriba es&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;&gt; plot(rnorm(2000), rnorm(2000), pch=16, col=rojo20, xlab="", ylab="")&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;También se puede definir un color mediante un código de 8 dígitos hexadecimales que empieza por # y cuyos dos últimos corresponden al valor de alpha. Por ejemplo&lt;br /&gt;&lt;br /&gt;&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&gt; rojo21 &lt;- "#FF000050"&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4200017933558803500-2890299171768164729?l=erre-que-erre-paco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://erre-que-erre-paco.blogspot.com/feeds/2890299171768164729/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://erre-que-erre-paco.blogspot.com/2009/08/colores-transparentes.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4200017933558803500/posts/default/2890299171768164729'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4200017933558803500/posts/default/2890299171768164729'/><link rel='alternate' type='text/html' href='http://erre-que-erre-paco.blogspot.com/2009/08/colores-transparentes.html' title='Colores transparentes'/><author><name>Paco</name><uri>http://www.blogger.com/profile/05414727581731452919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_Lsnfr2zsR8A/SwkQF-4sS9I/AAAAAAAAA0c/GGwOyuhdv68/S220/francesc.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_Lsnfr2zsR8A/SpFqC2CZdAI/AAAAAAAAAvY/3rXLggZE76A/s72-c/MiFigura' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4200017933558803500.post-3920094036945268758</id><published>2009-08-22T21:12:00.005+02:00</published><updated>2009-08-22T22:15:56.156+02:00</updated><title type='text'>Chiplot</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_Lsnfr2zsR8A/SpBI00kVoqI/AAAAAAAAAvQ/tPHo3xsK-sc/s1600-h/Rplot001.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 400px;" src="http://3.bp.blogspot.com/_Lsnfr2zsR8A/SpBI00kVoqI/AAAAAAAAAvQ/tPHo3xsK-sc/s400/Rplot001.png" alt="" id="BLOGGER_PHOTO_ID_5372874427754455714" border="0" /&gt;&lt;/a&gt;Aunque un gráfico de dispersión (scatterplot) es la primera opción para observar un conjunto bivariante de datos, a veces resulta complicado decidir a primera vista si las variables son independientes o no. Como es lógico nos debemos apoyar en algún contraste estadístico, como el test Ji-cuadrado (discretizando los datos) o el test &lt;span style="font-style: italic;"&gt;rho&lt;/span&gt; de Spearman, pero también sería de gran ayuda disponer de un gráfico adicional. Éste es el chi-plot de Fisher y Switzer (1985, 2001).&lt;br /&gt;&lt;br /&gt;El chi-plot es un gráfico que representa dos variables (lambda y chi) calculadas a partir de los datos muestrales. Tiene la propiedad de que en el caso de que las variables originales sean independientes, los puntos se agrupan en una región central. En caso contrario, si las variables estan relacionadas, los puntos aparecerán fuera de esa región central.&lt;br /&gt;&lt;br /&gt;En el gráfico de arriba observamos un conjunto de datos sobre polución que relacionan la cantidad de SO2 con la mortalidad. En el chi-plot apreciamos su dependencia con claridad (rho=0.4915, p-value&lt;0.01).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;Fuente:&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt; &lt;/span&gt;Los datos y la función &lt;span style="font-family:courier new;"&gt;chiplot&lt;/span&gt; se pueden hallar en el libro de B.S. Everitt &lt;span style="font-style: italic;"&gt;An R and S-PLUS Companion to Multivariate Analysis&lt;/span&gt; y en &lt;a href="http://biostatistics.iop.kcl.ac.uk/publications/everitt/"&gt;su web&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;Código: &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&gt; attach(airpoll)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&gt; chiplot(SO2,Mortality,vlabs=c("SO2","Mortality"))&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&gt; cor.test(SO2,Mortality,method="spearman")&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4200017933558803500-3920094036945268758?l=erre-que-erre-paco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://erre-que-erre-paco.blogspot.com/feeds/3920094036945268758/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://erre-que-erre-paco.blogspot.com/2009/08/chiplot.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4200017933558803500/posts/default/3920094036945268758'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4200017933558803500/posts/default/3920094036945268758'/><link rel='alternate' type='text/html' href='http://erre-que-erre-paco.blogspot.com/2009/08/chiplot.html' title='Chiplot'/><author><name>Paco</name><uri>http://www.blogger.com/profile/05414727581731452919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_Lsnfr2zsR8A/SwkQF-4sS9I/AAAAAAAAA0c/GGwOyuhdv68/S220/francesc.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_Lsnfr2zsR8A/SpBI00kVoqI/AAAAAAAAAvQ/tPHo3xsK-sc/s72-c/Rplot001.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4200017933558803500.post-7582742348544579737</id><published>2009-08-21T10:06:00.004+02:00</published><updated>2009-08-21T11:24:47.328+02:00</updated><title type='text'>Importar datos de una hoja de cálculo</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://blog.worldvillage.com/computers/OOo_calc.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 225px; height: 162px;" src="http://blog.worldvillage.com/computers/OOo_calc.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Una de las primeras preguntas de todas las personas que empiezan a trabajar con R es ¿cómo puedo importar mis datos de Excel? La misma pregunta se hacen los que utilizan otras hojas de cálculo como Calc de OpenOffice.org, Gnumeric de Gnome, KSpread de KOffice, etc.&lt;br /&gt;&lt;br /&gt;La solución más sencilla consiste en utilizar la función &lt;span style="font-family:courier new;"&gt;read.table&lt;/span&gt; (o sus variantes &lt;span style="font-family:courier new;"&gt;read.delim&lt;/span&gt; y &lt;span style="font-family:courier new;"&gt;read.csv&lt;/span&gt;) para importar una tabla de datos tipo texto. Es decir, previamente debemos guardar la tabla de datos de la hoja de cálculo como un archivo de texto delimitado con tabulaciones o con comas.&lt;br /&gt;Los pasos son los siguientes:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Abrir la hoja de cálculo con nuestro programa (Excel, Calc,...) y guardar la hoja activa que contenga la tabla como un archivo de texto delimitado. Podremos elegir el tipo de delimitador (tabulación, coma, punto y coma,...) y el nombre y la extensión del archivo. Por ejemplo, podemos guardar un archivo de texto con el separador "," y el nombre "MiTabla.txt" o "MiTabla.csv" (mejor cuando el separador es "," o ";").&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt; Recuperar la tabla desde la consola de R con la instrucción&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&gt; mitabla.df &lt;- read.table("MiTabla.csv", header=T, sep=",")&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;o también con la instrucción equivalente&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&gt; mitabla.df &lt;- read.csv("MiTabla.csv")&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;Cuando el separador es una tabulación, podemos utilizar la instrucción &lt;span style="font-family:courier new;"&gt;read.delim&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Para todas las personas que tienen la coma "," como separador decimal en sus programas de hojas de cálculo,  al guardar el archivo de texto se debe utilizar como separador el punto y coma ";" o la tabulación. Entonces la importación se realiza con las instrucciones:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    &gt; mitabla.df &lt;- read.table("MiTabla.csv", header=T, dec=",", sep=";")&lt;/span&gt;&lt;br /&gt;o&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    &gt; mitabla.df &lt;- read.csv2("MiTabla.csv")&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Para las tabulaciones es&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    &gt; mitabla.df &lt;- read.table("MiTabla.txt", header=T, dec=",", sep="\t")&lt;/span&gt;&lt;br /&gt;o&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    &gt; mitabla.df &lt;- read.delim2("MiTabla.txt")&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 102, 0);"&gt;Truco:&lt;/span&gt;&lt;span style="color: rgb(255, 102, 0);"&gt; &lt;/span&gt;También es posible recuperar una tabla desde el portapapeles de nuestro sistema operativo con el parámetro &lt;span style="font-family:courier new;"&gt;file="clipboard"&lt;/span&gt; en lugar del nombre del archivo. ¡Pruebalo!&lt;br /&gt;&lt;br /&gt;En resumen, hay que guardar la tabla como archivo de texto con separadores y tener en cuenta qué tipo de punto decimal tenemos y qué separador utilizamos.&lt;br /&gt;&lt;br /&gt;Para los usuarios de Windows y Excel, también es posible abrir una conexión con el archivo de las hojas de cálculo y seleccionar columnas o tablas de alguna de las hojas que contiene. Para ello debemos utilizar &lt;code&gt;odbcConnectExcel&lt;/code&gt; del paquete &lt;strong&gt;RODBC&lt;/strong&gt;.&lt;br /&gt;&lt;br /&gt;Más información en &lt;a href="http://cran.r-project.org/doc/manuals/R-data.html#Reading-Excel-spreadsheets"&gt;R Data Import/Export&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4200017933558803500-7582742348544579737?l=erre-que-erre-paco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://erre-que-erre-paco.blogspot.com/feeds/7582742348544579737/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://erre-que-erre-paco.blogspot.com/2009/08/importar-datos-de-una-hoja-de-calculo.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4200017933558803500/posts/default/7582742348544579737'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4200017933558803500/posts/default/7582742348544579737'/><link rel='alternate' type='text/html' href='http://erre-que-erre-paco.blogspot.com/2009/08/importar-datos-de-una-hoja-de-calculo.html' title='Importar datos de una hoja de cálculo'/><author><name>Paco</name><uri>http://www.blogger.com/profile/05414727581731452919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_Lsnfr2zsR8A/SwkQF-4sS9I/AAAAAAAAA0c/GGwOyuhdv68/S220/francesc.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4200017933558803500.post-7701641700166215932</id><published>2009-08-07T18:40:00.002+02:00</published><updated>2009-08-07T19:01:41.010+02:00</updated><title type='text'>Múltiples archivos de gráficos</title><content type='html'>El otro día comentaba los múltiples formatos para guardar un gráfico generado por R (ver &lt;a href="http://erre-que-erre-paco.blogspot.com/2009/08/devices.html"&gt;Devices&lt;/a&gt;).&lt;br /&gt;Por ejemplo, en el caso de &lt;span style="font-family: courier new;"&gt;pdf()&lt;/span&gt;, una vez abierto, todos los gráficos producidos se guardan en el mismo archivo, hasta que lo cerremos. Pero ¿como podemos guardar cada gráfico en un archivo diferente? Pues con&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;pdf(onefile=F)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Esto llevará a escribir diferentes archivos del tipo &lt;span style="font-family: courier new;"&gt;Rplot001.pdf&lt;/span&gt;, &lt;span style="font-family: courier new;"&gt;Rplot002.pdf&lt;/span&gt;,...&lt;br /&gt;&lt;br /&gt;Otros parámetros controlan el nombre del archivo y los dígitos. Para ver todas las opciones leer atentamente el &lt;span style="font-family: courier new;"&gt;help(pdf)&lt;/span&gt;. No olvidemos cerrar el dispositivo con &lt;span style="font-family: courier new;"&gt;dev.off()&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Por otra parte, en Windows, una vez que tenemos un gráfico en su ventana, lo podemos guardar a través del menú de la ventana en cualquier formato o incluso en el portapapeles. Sin embargo, en Linux es posible que no tengamos ese menú (en RKWard sí). La función &lt;span style="font-family: courier new;"&gt;savePlot()&lt;/span&gt; soluciona este inconveniente:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;savePlot("MiFigura", type="png")&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Otros formatos y posibilidades se pueden consultar en la ayuda de esta función.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4200017933558803500-7701641700166215932?l=erre-que-erre-paco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://erre-que-erre-paco.blogspot.com/feeds/7701641700166215932/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://erre-que-erre-paco.blogspot.com/2009/08/multiples-archivos-de-graficos.html#comment-form' title='4 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4200017933558803500/posts/default/7701641700166215932'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4200017933558803500/posts/default/7701641700166215932'/><link rel='alternate' type='text/html' href='http://erre-que-erre-paco.blogspot.com/2009/08/multiples-archivos-de-graficos.html' title='Múltiples archivos de gráficos'/><author><name>Paco</name><uri>http://www.blogger.com/profile/05414727581731452919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_Lsnfr2zsR8A/SwkQF-4sS9I/AAAAAAAAA0c/GGwOyuhdv68/S220/francesc.png'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4200017933558803500.post-2822008402957371743</id><published>2009-08-06T17:33:00.005+02:00</published><updated>2009-08-06T17:49:48.051+02:00</updated><title type='text'>polygon()</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_Lsnfr2zsR8A/Snr4iwMAbrI/AAAAAAAAAvA/nEhMs4-Kw6U/s1600-h/exp.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 400px;" src="http://4.bp.blogspot.com/_Lsnfr2zsR8A/Snr4iwMAbrI/AAAAAAAAAvA/nEhMs4-Kw6U/s400/exp.png" alt="" id="BLOGGER_PHOTO_ID_5366875181899869874" border="0" /&gt;&lt;/a&gt;Un truco para rellenar regiones a destacar en un gráfico es utilizar la función &lt;span style="font-family: courier new;"&gt;polygon()&lt;/span&gt;.&lt;br /&gt;El gráfico anterior se consigue con el siguiente código:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;curve(exp,0.5,3.5,lwd=2)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;t&lt;-seq(1,3,by=0.01)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;x &lt;- c(1,t,3)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;y &lt;- c(0,exp(t),0)&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;&lt;br /&gt;polygon(x,y,density=20)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;title("Exponencial entre 1 y 3")&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Observemos la utilización de los vértices adecuados para reseguir la curva exponencial.&lt;br /&gt;El parámetro &lt;span style="font-family:courier new;"&gt;density=20&lt;/span&gt; controla la densidad de las linias (por pulgada). Tambíen es posible rellenar el polígono con un color sólido como en el siguiente ejemplo con la densidad normal:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_Lsnfr2zsR8A/Snr6Q6nLxcI/AAAAAAAAAvI/U32jF49nuX0/s1600-h/normal.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 400px;" src="http://3.bp.blogspot.com/_Lsnfr2zsR8A/Snr6Q6nLxcI/AAAAAAAAAvI/U32jF49nuX0/s400/normal.png" alt="" id="BLOGGER_PHOTO_ID_5366877074483824066" border="0" /&gt;&lt;/a&gt;El código para dibujarlo es:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;curve(dnorm,-3,3,axes=F) # dibujamos la curva pero no los ejes&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;axis(1)                  # ahora los ejes&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;axis(2)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;t &lt;- seq(0,1,by=0.01)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;x &lt;- c(0,t,1)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;y &lt;- c(0,dnorm(t),0)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;polygon(x,y,col="grey") # la región en gris&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;curve(dnorm,-3,3,lwd=2,add=T) # la curva encima&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;abline(h=0)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;title("Probabilidad entre 0 y 1")&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4200017933558803500-2822008402957371743?l=erre-que-erre-paco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://erre-que-erre-paco.blogspot.com/feeds/2822008402957371743/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://erre-que-erre-paco.blogspot.com/2009/08/polygon.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4200017933558803500/posts/default/2822008402957371743'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4200017933558803500/posts/default/2822008402957371743'/><link rel='alternate' type='text/html' href='http://erre-que-erre-paco.blogspot.com/2009/08/polygon.html' title='polygon()'/><author><name>Paco</name><uri>http://www.blogger.com/profile/05414727581731452919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_Lsnfr2zsR8A/SwkQF-4sS9I/AAAAAAAAA0c/GGwOyuhdv68/S220/francesc.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_Lsnfr2zsR8A/Snr4iwMAbrI/AAAAAAAAAvA/nEhMs4-Kw6U/s72-c/exp.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4200017933558803500.post-4705931792878612067</id><published>2009-08-05T18:34:00.005+02:00</published><updated>2009-08-05T19:20:09.695+02:00</updated><title type='text'>Devices</title><content type='html'>Normalmente en R, un gráfico nuevo sustituye al anterior en la misma ventana, si está abierta. Pero a veces nos puede interesar dibujar el gráfico en una ventana nueva, por ejemplo para comparar los dos gráficos. Para abrir una nueva ventana gráfica podemos invocar la instrucción&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;x11()        # en Linux&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;windows() # en Windows&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;quartz()   # en Mac OS&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Aunque creo que &lt;span style="font-family:courier new;"&gt;x11()&lt;/span&gt; funciona en los tres sistemas.&lt;br /&gt;&lt;br /&gt;Una ventana no es más que uno de los posibles dispositivos (devices) de salida para los gráficos.&lt;br /&gt;Para ver los dispositivos adicionales de salida gráfica de que disponemos en un momento dado, podemos hacer&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;dev.list()&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;y para elegir uno entre ellos (activamos el tercero, si existe):&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;dev.set(3) &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Sabremos cual es la ventana activa ya que aparecerá la palabra ACTIVE en la barra de títulos.&lt;br /&gt;&lt;br /&gt;Además, también es posible redirigir la salida gráfica a un archivo PDF. La siguiente instrucción abre un archivo PDF en la carpeta actual de trabajo con el nombre especificado:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;pdf("figura1.pdf")&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Mientras esté activo, todos los gráficos que generemos se enviarán sistemáticamente a dicho archivo. Para cerrar el dispositivo activo (&lt;span style="font-family:courier new;"&gt;dev.cur()&lt;/span&gt;) hacemos&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;dev.off()&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Las funciones &lt;span style="font-family:courier new;"&gt;postscript()&lt;/span&gt;, &lt;span style="font-family:courier new;"&gt;png()&lt;/span&gt;, &lt;span style="font-family:courier new;"&gt;jpeg()&lt;/span&gt; y &lt;span style="font-family:courier new;"&gt;bmp()&lt;/span&gt; son similares a &lt;span style="font-family: courier new;"&gt;pdf()&lt;/span&gt;, pero crean gráficos en los formatos EPS, PNG, JPEG y BMP respectivamente. Para insertar un gráfico en LaTeX se recomienda el formato EPS, mientras que en un procesador de textos como Write de OpenOffice o Word de Microsoft es mejor PNG. Recordar que hay que cerrar estos dispositivos para poder acceder al archivo correspondiente.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4200017933558803500-4705931792878612067?l=erre-que-erre-paco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://erre-que-erre-paco.blogspot.com/feeds/4705931792878612067/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://erre-que-erre-paco.blogspot.com/2009/08/devices.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4200017933558803500/posts/default/4705931792878612067'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4200017933558803500/posts/default/4705931792878612067'/><link rel='alternate' type='text/html' href='http://erre-que-erre-paco.blogspot.com/2009/08/devices.html' title='Devices'/><author><name>Paco</name><uri>http://www.blogger.com/profile/05414727581731452919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_Lsnfr2zsR8A/SwkQF-4sS9I/AAAAAAAAA0c/GGwOyuhdv68/S220/francesc.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4200017933558803500.post-5270650060870778977</id><published>2009-08-04T19:13:00.007+02:00</published><updated>2009-08-04T19:58:37.436+02:00</updated><title type='text'>Box plots</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_Lsnfr2zsR8A/SnhsRsKYB7I/AAAAAAAAAu4/yD_Djyh7b7k/s1600-h/Rplot001.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 400px;" src="http://1.bp.blogspot.com/_Lsnfr2zsR8A/SnhsRsKYB7I/AAAAAAAAAu4/yD_Djyh7b7k/s400/Rplot001.png" alt="" id="BLOGGER_PHOTO_ID_5366158007180199858" border="0" /&gt;&lt;/a&gt;Un &lt;a href="http://en.wikipedia.org/wiki/Box_plot"&gt;boxplot&lt;/a&gt; es un gráfico robusto que permite describir la distribución de una muestra de valores numéricos y compararla con otras (en las mismas unidades).&lt;br /&gt;La robustez se debe a la utilización de estadísticos de orden. En este sentido y como medida de centralidad se utiliza la mediana, en lugar de la media.&lt;br /&gt;&lt;br /&gt;En cuanto a la caja, conviene aclarar que no son los cuartiles los que la definen sino &lt;span style="font-weight: bold;"&gt;las bisagras&lt;/span&gt; (hinges), inferior y superior. La bisagra inferior es la mediana de los valores situados por debajo de la mediana de la muestra. La bisagra superior es la mediana de los valores situados por encima de la mediana de la muestra. Para muestras grandes, la bisagra inferior prácticamente coincidirá con el primer cuartil y la bisagra superior con el tercer cuartil, pero no son iguales.&lt;br /&gt;En el boxplot se utilizan las bisagras por definición. Los cuartiles (y otros percentiles) se calculan de forma muy diversa y no son adecuados para fijar una definición única.&lt;br /&gt;Como es natural la función boxplot() de R tiene en cuenta estos detalles y es absolutamente rigurosa con la definición de Tukey.&lt;br /&gt;&lt;br /&gt;Otro detalle es la longitud de &lt;span style="font-weight: bold;"&gt;los bigotes&lt;/span&gt; (whiskers). Éstos se extienden fuera de la caja hasta el valor muestral más lejano que no supere una proporción del rango intercuartílico (calculado con las bisagras). Esa proporción se controla con el parámetro &lt;span style="font-family: courier new;"&gt;range&lt;/span&gt;. Su valor por defecto es 1.5, fijado así para que el número de outliers en una población normal sea relativamente pequeño. En otros programas de software estadístico como SPSS, incomprensiblemente, este valor es 2.&lt;br /&gt;&lt;br /&gt;Por último, decir que hay otro parámetro &lt;span style="font-family: courier new;"&gt;varwidth&lt;/span&gt; que permite controlar el ancho de las cajas. Si lo pasamos a TRUE, el ancho de las cajas en un boxplot múltiple será proporcional a la raíz cuadrada de los tamaños muestrales de cada población. Interesante.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4200017933558803500-5270650060870778977?l=erre-que-erre-paco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://erre-que-erre-paco.blogspot.com/feeds/5270650060870778977/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://erre-que-erre-paco.blogspot.com/2009/08/box-plots.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4200017933558803500/posts/default/5270650060870778977'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4200017933558803500/posts/default/5270650060870778977'/><link rel='alternate' type='text/html' href='http://erre-que-erre-paco.blogspot.com/2009/08/box-plots.html' title='Box plots'/><author><name>Paco</name><uri>http://www.blogger.com/profile/05414727581731452919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_Lsnfr2zsR8A/SwkQF-4sS9I/AAAAAAAAA0c/GGwOyuhdv68/S220/francesc.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_Lsnfr2zsR8A/SnhsRsKYB7I/AAAAAAAAAu4/yD_Djyh7b7k/s72-c/Rplot001.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4200017933558803500.post-6993498949446567893</id><published>2009-08-04T18:30:00.003+02:00</published><updated>2009-08-04T18:38:23.296+02:00</updated><title type='text'>R Graph Gallery</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_Lsnfr2zsR8A/SnhiXq97atI/AAAAAAAAAuw/aB5LijRd0bw/s1600-h/Rplot001.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 400px;" src="http://4.bp.blogspot.com/_Lsnfr2zsR8A/SnhiXq97atI/AAAAAAAAAuw/aB5LijRd0bw/s400/Rplot001.png" alt="" id="BLOGGER_PHOTO_ID_5366147114822494930" border="0" /&gt;&lt;/a&gt;En la &lt;a href="http://addictedtor.free.fr/graphiques/"&gt;R Graph Gallery&lt;/a&gt; encontraréis un buen conjunto de gráficos, todos ellos con su correspondiente código y listos para ser utilizados.&lt;br /&gt;En la imagen podéis ver el resultado de la función stars() aplicado a un conjunto de variables numéricas sobre la base de datos mtcars.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4200017933558803500-6993498949446567893?l=erre-que-erre-paco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://erre-que-erre-paco.blogspot.com/feeds/6993498949446567893/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://erre-que-erre-paco.blogspot.com/2009/08/r-graph-gallery.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4200017933558803500/posts/default/6993498949446567893'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4200017933558803500/posts/default/6993498949446567893'/><link rel='alternate' type='text/html' href='http://erre-que-erre-paco.blogspot.com/2009/08/r-graph-gallery.html' title='R Graph Gallery'/><author><name>Paco</name><uri>http://www.blogger.com/profile/05414727581731452919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_Lsnfr2zsR8A/SwkQF-4sS9I/AAAAAAAAA0c/GGwOyuhdv68/S220/francesc.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_Lsnfr2zsR8A/SnhiXq97atI/AAAAAAAAAuw/aB5LijRd0bw/s72-c/Rplot001.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4200017933558803500.post-3264135871858449303</id><published>2009-08-03T16:53:00.005+02:00</published><updated>2009-08-03T18:33:25.203+02:00</updated><title type='text'>LaTeX y R</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_Lsnfr2zsR8A/SncARq6FfeI/AAAAAAAAAuA/lIj69x1FlJM/s1600-h/lion.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 198px; height: 165px;" src="http://1.bp.blogspot.com/_Lsnfr2zsR8A/SncARq6FfeI/AAAAAAAAAuA/lIj69x1FlJM/s400/lion.png" alt="" id="BLOGGER_PHOTO_ID_5365757784610930146" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Si queremos elaborar un documento dinámico o programable que combine texto y resultados estadísticos, tanto numèricos como gráficos, la mejor opción es utilizar LaTeX y R.&lt;br /&gt;&lt;br /&gt;Para quien no conozca LaTeX diré que es un sofisticado procesador de textos que se utiliza especialmente con documentos científicos. Aunque su aprendizaje no es sencillo, vale la pena dedicarle un tiempo. Cuando se domina, los otros procesadores sólo se utilizan con textos elementales.&lt;br /&gt;Para aprender LaTeX se puede empezar por la web de &lt;a href="http://goliat.mecanica.upm.es/cervantex/"&gt;CervanTeX&lt;/a&gt; y leer el manual &lt;a class="ext" href="http://www.ctan.org/tex-archive/info/lshort/spanish/" target="_blank"&gt;La introducción no-tan-corta a LaTeX2e&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Pero si ya sabes un poco de LaTeX, combinarlo con R es muy fácil. La idea es escribir un archivo con extensión .Rnw con código LaTeX normal y texto y añadirle trozos de código R (chunks).&lt;br /&gt;&lt;br /&gt;El texto normal empieza con el signo "@", mientras que el código R empieza con "&lt;&lt;&gt;&gt;="&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;font-size:85%;" &gt;&lt;&lt;&lt;i&gt;Argumento1=ValorDelArgumento1, Argumento2=ValorDelArgumento2, ...&lt;/i&gt;&gt;&gt;=&lt;br /&gt;&lt;i&gt;Código R&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;@&lt;br /&gt;Texto normal y código LaTeX&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Una vez redactado el documento combinado, se utiliza la función Sweave() de R para procesarlo y obtener un documento LaTeX, con extensión .tex, que contiene el texto original y los resultados, cálculos y gráficos demandados por el código R insertado. Posteriormente, el archivo .tex se procesará como es habitual en LaTeX para obtener el documento definitivo: .ps, .pdf,...&lt;br /&gt;&lt;br /&gt;La función Stangle() permite extraer todo el código R del documento combinado (los chunks) en un archivo con extensión .R.&lt;br /&gt;&lt;br /&gt;Un sencillo &lt;a href="http://www.ub.edu/stat/docencia/EADB/Manual_Sweave.pdf"&gt;manual de Sweave&lt;/a&gt;.&lt;br /&gt;Leer más en &lt;a href="http://www.traba.org/wikitraba/index.php/Sweave"&gt;http://www.traba.org/wikitraba/index.php/Sweave&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4200017933558803500-3264135871858449303?l=erre-que-erre-paco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://erre-que-erre-paco.blogspot.com/feeds/3264135871858449303/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://erre-que-erre-paco.blogspot.com/2009/08/latex-y-r.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4200017933558803500/posts/default/3264135871858449303'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4200017933558803500/posts/default/3264135871858449303'/><link rel='alternate' type='text/html' href='http://erre-que-erre-paco.blogspot.com/2009/08/latex-y-r.html' title='LaTeX y R'/><author><name>Paco</name><uri>http://www.blogger.com/profile/05414727581731452919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_Lsnfr2zsR8A/SwkQF-4sS9I/AAAAAAAAA0c/GGwOyuhdv68/S220/francesc.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_Lsnfr2zsR8A/SncARq6FfeI/AAAAAAAAAuA/lIj69x1FlJM/s72-c/lion.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4200017933558803500.post-931705077752030468</id><published>2009-08-02T18:02:00.006+02:00</published><updated>2009-08-03T16:53:47.635+02:00</updated><title type='text'>¿En qué SO estamos?</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_Lsnfr2zsR8A/SnW6jcwjIjI/AAAAAAAAAtw/3uKBuV4UuTc/s1600-h/wall-linux-3.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 240px;" src="http://4.bp.blogspot.com/_Lsnfr2zsR8A/SnW6jcwjIjI/AAAAAAAAAtw/3uKBuV4UuTc/s320/wall-linux-3.jpg" alt="" id="BLOGGER_PHOTO_ID_5365399649259823666" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;¡Vaya tontería! Todo el mundo sabe con qué sistema operativo trabaja.&lt;br /&gt;Pero resulta que si queremos escribir un programa en R que se pueda utilizar en varios sistemas operativos, entonces la pregunta es pertinente. Esto no significa que las instrucciones de R dependan del SO en el que trabajemos. Pero hay situaciones en las que es conveniente cambiar alguna cosa en función del SO, por ejemplo, para fijar la carpeta de trabajo.&lt;br /&gt;&lt;br /&gt;El objeto &lt;span style="font-weight: bold;"&gt;version&lt;/span&gt; nos proporciona una lista con los datos de nuestra versión de R. En particular, el SO con el que trabajamos.&lt;br /&gt;&lt;br /&gt;El siguiente código, fija la carpeta de trabajo en función del sistema operativo:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;linuxPath &lt;- "/home/paco/estudios/"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;windowsPath &lt;- "c:/users/paco/documents/estudios/"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;estudio &lt;- "Blog"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;SO &lt;- version[["os"]]&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;if (SO=="linux-gnu"){&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    workingDir &lt;- file.path(linuxPath, estudio)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;}else{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    workingDir &lt;- file.path(windowsPath, estudio) &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;setwd(workingDir)&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4200017933558803500-931705077752030468?l=erre-que-erre-paco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://erre-que-erre-paco.blogspot.com/feeds/931705077752030468/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://erre-que-erre-paco.blogspot.com/2009/08/en-que-so-estamos.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4200017933558803500/posts/default/931705077752030468'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4200017933558803500/posts/default/931705077752030468'/><link rel='alternate' type='text/html' href='http://erre-que-erre-paco.blogspot.com/2009/08/en-que-so-estamos.html' title='¿En qué SO estamos?'/><author><name>Paco</name><uri>http://www.blogger.com/profile/05414727581731452919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_Lsnfr2zsR8A/SwkQF-4sS9I/AAAAAAAAA0c/GGwOyuhdv68/S220/francesc.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_Lsnfr2zsR8A/SnW6jcwjIjI/AAAAAAAAAtw/3uKBuV4UuTc/s72-c/wall-linux-3.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4200017933558803500.post-961245530628230185</id><published>2009-08-02T17:04:00.004+02:00</published><updated>2009-08-03T18:34:53.594+02:00</updated><title type='text'>Cálculo matricial</title><content type='html'>Trabajar con matrices en R es muy sencillo.&lt;br /&gt;En primer lugar, para crear una matriz podemos transformar un vector:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&gt; x &lt;- 1:9&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&gt; X &lt;- matrix(x, ncol=3)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Por defecto el relleno de la matriz se hace por columnas. Si queremos que sea por filas, hay que indicarlo:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&gt; Y &lt;- matrix(x, ncol=3, byrow=T)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;En cuanto a las operaciones con matrices, la suma de dos matrices se consigue con el operador "+"&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;&gt; X + Y&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;El producto ordinario se puede hacer con el operador "*", pero éste sirve para calcular el producto término a término. No es el producto matricial.&lt;br /&gt;El producto matricial se obtiene con el operador "%*%":&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&gt; X %*% Y&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Recordar que es necesario que el número de columnas de la primera matriz coincida con el número de filas de la segunda.&lt;br /&gt;&lt;br /&gt;La función t() calcula la matriz traspuesta:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&gt; A &lt;- t(X) %*% X&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;La función diag() se puede utilizar en dos sentidos, para construir una matriz diagonal o para extraer la diagonal de una matriz cuadrada:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&gt; diag(1:3)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&gt; d &lt;- diag(X)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;El determinante de una matriz cuadrada se consigue con la función det(). En cuanto a la inversa de una matriz, si tiene, se calcula con la función solve():&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_Lsnfr2zsR8A/SnXIpHvcGfI/AAAAAAAAAt4/2o7h2_NSd9o/s1600-h/65.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 146px;" src="http://4.bp.blogspot.com/_Lsnfr2zsR8A/SnXIpHvcGfI/AAAAAAAAAt4/2o7h2_NSd9o/s320/65.gif" alt="" id="BLOGGER_PHOTO_ID_5365415139860027890" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&gt; b &lt;- c(1,0,2,-1,1,0,0,0,1)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&gt; B &lt;- matrix(b, ncol=3)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&gt; det(B)   # no es cero, luego es inversible&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&gt; solve(B)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Si lo que queremos son los valores y los vectores propios de una matriz, debemos utilizar la función eigen() que nos da una lista:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&gt; r.list &lt;- eigen(X)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&gt; valor.propio1 &lt;- r.list$values[1]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&gt; vector.propio1 &lt;- r.list$vectors[ ,1]&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Finalmente, si lo que queremos es la g-inversa de una matriz, podemos utilizar la función ginv() del paquete MASS que calcula la g-inversa de Moore-Penrose:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&gt; library(MASS)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&gt; ginv(X)&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4200017933558803500-961245530628230185?l=erre-que-erre-paco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://erre-que-erre-paco.blogspot.com/feeds/961245530628230185/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://erre-que-erre-paco.blogspot.com/2009/08/calculo-matricial.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4200017933558803500/posts/default/961245530628230185'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4200017933558803500/posts/default/961245530628230185'/><link rel='alternate' type='text/html' href='http://erre-que-erre-paco.blogspot.com/2009/08/calculo-matricial.html' title='Cálculo matricial'/><author><name>Paco</name><uri>http://www.blogger.com/profile/05414727581731452919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_Lsnfr2zsR8A/SwkQF-4sS9I/AAAAAAAAA0c/GGwOyuhdv68/S220/francesc.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_Lsnfr2zsR8A/SnXIpHvcGfI/AAAAAAAAAt4/2o7h2_NSd9o/s72-c/65.gif' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4200017933558803500.post-8606273994000482024</id><published>2009-08-01T12:26:00.010+02:00</published><updated>2009-08-02T12:49:12.076+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='instalación'/><title type='text'>Instalación del programa R</title><content type='html'>Vamos a empezar por el principio.&lt;br /&gt;Se trata de descargar e instalar el programa R en nuestro ordenador. Para ello nos debemos dirigir al servidor más cercano del CRAN. El CRAN o &lt;span style="font-weight: bold;"&gt;The Comprehensive R Archive Network&lt;/span&gt; es un sistema mundial de servidores que permiten acceder al mismo contenido (mirrors)  en todos ellos. En el caso de España es lógico acceder a &lt;a href="http://cran.es.r-project.org/"&gt;http://cran.es.r-project.org&lt;/a&gt;, pero podemos descargar el programa R de cualquier otro.&lt;br /&gt;El siguiente paso depende del sistema operativo de nuestro ordenador.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_Lsnfr2zsR8A/SnVt3PjoteI/AAAAAAAAAto/f3n4rNBZTvM/s1600-h/Imagen3.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 242px;" src="http://4.bp.blogspot.com/_Lsnfr2zsR8A/SnVt3PjoteI/AAAAAAAAAto/f3n4rNBZTvM/s320/Imagen3.png" alt="" id="BLOGGER_PHOTO_ID_5365315326918047202" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;R para Windows&lt;/span&gt;&lt;span style="color: rgb(255, 102, 102);"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br /&gt;&lt;br /&gt;Si nuestro SO es Windows (XP, Vista) de 32 bits debemos descargarnos el archivo &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 102, 102);"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;de nombre &lt;span style="font-family:courier new;"&gt;R-X.X.X-win32.exe &lt;/span&gt;(donde &lt;span style="font-family:courier new;"&gt;X.X.X&lt;/span&gt; es el número de versión, 2.9.1 por ejemplo) que encontraremos en el subdirectorio &lt;span style="font-weight: bold;"&gt;base&lt;/span&gt;  y que podemos guardar en alguna carpeta de nuestro disco o directamente ejecutar, para una instalación inmediata.&lt;br /&gt;Durante la instalación, en general, debemos aceptar todas las opciones por defecto, pero hay una pregunta clave que debemos tener en cuenta. Cuando ofrece utilizar las &lt;span style="font-weight: bold;"&gt;opciones de configuración&lt;/span&gt; y por defecto nos dice que no, es mejor cambiar a si. Entonces podemos elegir la opción SDI (ventanas separadas) que está por defecto. Esto es absolutamente necesario si vamos a utilizar un interfaz gráfico como Tinn-R. En otro caso, dejaremos la opción a MDI (una ventana). El resto de las preguntas las podemos pasar con sus valores por defecto.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;R para Linux&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;En el caso que tengamos una distribución de Linux, deberemos considerar si queremos descargarnos el código fuente y compilarlo o, mucho más fácil, descargar e instalar los paquetes ya compilados de nuestra distribución de Linux. La primera opción no es difícil, pero se considera para "expertos". La explicaremos en otro escrito más adelante. Ahora nos concentraremos en la segunda opción para una distribución &lt;span style="font-weight: bold;"&gt;Ubuntu&lt;/span&gt; que es una de las distribuciones de Linux más populares. Otras distribuciones para las que se dispone de paquetes específicos son Debian, Redhat i Suse.&lt;br /&gt;&lt;br /&gt;En el caso de tener una distribución Ubuntu (en mi caso Kubuntu) debemos dirigirnos a la página correspondiente&lt;br /&gt;&lt;a href="http://cran.es.r-project.org/bin/linux/ubuntu/"&gt;http://cran.es.r-project.org/bin/linux/ubuntu/&lt;/a&gt;&lt;br /&gt;donde encontraremos todos los detalles. Pero en realidad nos bastará con seguir las siguientes instrucciones:&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;ol&gt;&lt;li&gt;Añadir a la lista de repositorios la entrada:&lt;br /&gt;deb  http://cran.es.r-project.org/bin/linux/ubuntu   jaunty/&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Ejecutar en una consola las instrucciones:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;sudo apt-get update&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;sudo apt-get install r-base&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_Lsnfr2zsR8A/SnVeDeDLAtI/AAAAAAAAAtg/rzjsiatocsw/s1600-h/instant%C3%A0nia1.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 224px;" src="http://4.bp.blogspot.com/_Lsnfr2zsR8A/SnVeDeDLAtI/AAAAAAAAAtg/rzjsiatocsw/s320/instant%C3%A0nia1.png" alt="" id="BLOGGER_PHOTO_ID_5365297944780800722" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Está claro que debemos apuntar al repositorio más cercano y que hay que poner la versión de Ubuntu que tengamos en nuestro ordenador (en mi caso Jaunty).&lt;br /&gt;Si no añadimos este repositorio específico, también se puede instalar R con la instrucción de consola, pero instalaríamos una versión que no sería la más reciente.&lt;br /&gt;Otros detalles de esta instalación los comentaremos más adelante en otro escrito.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;R para Mac OS X&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Para el sistema operativo de los Mac encontraremos un archivo autoinstalable del tipo &lt;span style="font-family:courier new;"&gt;R-X.X.X.dmg&lt;/span&gt;. La instalación es trivial.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4200017933558803500-8606273994000482024?l=erre-que-erre-paco.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://erre-que-erre-paco.blogspot.com/feeds/8606273994000482024/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://erre-que-erre-paco.blogspot.com/2009/08/instalacion-del-programa-r.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4200017933558803500/posts/default/8606273994000482024'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4200017933558803500/posts/default/8606273994000482024'/><link rel='alternate' type='text/html' href='http://erre-que-erre-paco.blogspot.com/2009/08/instalacion-del-programa-r.html' title='Instalación del programa R'/><author><name>Paco</name><uri>http://www.blogger.com/profile/05414727581731452919</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/_Lsnfr2zsR8A/SwkQF-4sS9I/AAAAAAAAA0c/GGwOyuhdv68/S220/francesc.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_Lsnfr2zsR8A/SnVt3PjoteI/AAAAAAAAAto/f3n4rNBZTvM/s72-c/Imagen3.png' height='72' width='72'/><thr:total>0</thr:total></entry></feed>
