Instalar XML en Windows y en UBUNTU

Instalar XML en Ubuntu
XML es un paquete muy útil para descargar tablas (HTML) de la web, sin embargo, a pesar que está disponible en CRAN se puede notar que los archivos binarios para instalarlo en Windows no están disponibles (una gran tragedia para los usuarios de Windows) y esto está explícitamente dicho alli mismo, a pesar de esto, existe un pequeño documento titulado ReadMe que da ciertos indicios sobre qué hacer, por otro lado para los usuarios de Linux sí que está disponible el fichero tar.gz pero su suerte no es mejor que la de los usuarios de Windows, puesto que cuando se quiere instalar el paquete resulta en un vano esfuerzo y el resultado es un vil error parecido a este:
...
ERROR: configuration failed for package ‘XML’
* removing ‘/home/user/R/i686-pc-linux-gnu-library/2.12/XML’
...
Los puntos suspensivos indican que antes del error hay muchas otras letras y después del error también.
Dado que ni los usuarios de Windows ni los usuarios de Ubuntu tuvimos suerte con esto y dado que el ReadMe es confuso y muy largo para leerlo, entonces he hecho este post para hacerlo más fácil, este post sólo contempla la instación de XML para Ubuntu y Windows.

Instalar XML en Ubuntu

Lo primero es instalar el siguiente paquete libxml2-dev, por cierto esto debe hacerse desde la terminal (Ctrl Alt T para abrir la terminal) las instrucciones son las siguientes:
sudo apt-get update
sudo apt-get install libxml2-dev
Una vez que se tiene instalado libxml2-dev, entonces se pude instalar XML (siempre desde la terminal)
sudo apt-get install r-cran-xml
Y con esto ya está listo para ser usado en R.

Instalar XML en Windows

Para los usuarios de Windows la cosa es un poco más sencilla, basta con descargar el fichero zip de este sitio y luego lo instalan en R utilizando la opción de instalar paquete(s) a partir de archivos zip locales o simplemente haciendo
utils:::menuInstallLocal()
Luego seleccionar el zip llamado XML_3.9-4.1.zip y listo.
El material para este post fue recopilado de http://stackoverflow.com/questions/tagged/r

mtable el equivalente en R de estimates table de stata

Indicaciones de stata
Antes de convertirme en asiduo usuario de R  fui usuario de STATA que satisface bien las necesidades de cálculo siempre y cuando no se tenga que programar, una vez que se requiere programar se tienen dos alternativas:

1. Acostumbrarse a su incómoda sintaxis ('lenguaje' para ser un poco más formal) o
2. Emigrar hacia otro programa cuyo lenguaje sea más manejable, en mi caso ese lenguaje fue R, pero este post no trata sobre las razones por las cuales cambié de programa, sino que se trata de mostrar algo que en stata me gustaba mucho y que pensaba que lo echaría en falta al cambiarme a R, se trata de la comparación de dos (o más) modelos de regresión cuyo output se vea en una sola tabla, en stata esto se logra con la función estimates table y en R con la función mtable del paquete memisc.


Ejemplos de ambos resultados se muestran a continuación

Indicaciones de stata


Los siguientes comandos de stata son un extracto de un do file
  sysuse auto                                  /* Cargar la base de datos                       */
  regress price weight length mpg              /* Estimación una regresión simple con constante */
  estimates store constant                     /* Guardando los resultados de la estimación     */
  regress price weight length mpg , noconstant /* Estimación una regresión simple con constante */
  estimates store nonconstant                  /* Guardando los resultados de la estimación     */

  /* A continuación se crea la tabla para comparar los dos modelos */ 
  estimates table constant nonconstant, b(%9.4f) star stats( r2, r2_a, F, ll, N)
En seguida se ve que el resultado es el siguiente:
--------------------------------------------
    Variable |   constant     nonconstant   
-------------+------------------------------
      weight |    4.3648***      3.2291**   
      length | -104.8682*      -25.4414     
         mpg |  -86.7893        54.6221     
       _cons |  1.45e+04*                   
-------------+------------------------------
          r2 |    0.3574         0.8713     
        r2_a |    0.3298         0.8659     
           F |   12.9762       160.2632     
          ll | -679.3516      -682.4405     
           N |        74             74     
--------------------------------------------
    legend: * p<0.05; ** p<0.01; *** p<0.001

Los argumentos de la función estimates table indican lo siguiente: b(%9.4f)es para redondear al cuarto decimal, star es para indicar que la siginificancia se reflejará con el uso de estrellas (ver leyenda de la tabla), stats es la lista de estadísticos que queremos que aparezcan en la tabla, además de los coeficientes, los estadíscos que se han pedido fueron: R cuadrado (r2), R cuadrado ajustado (r2_a), el estadístico F (F), log-likelihood (ll) y tamaño muestral (N), se pueden agregar otros más para igualar el resultado de la tabla de R.

El resultado es muy elegante y práctico, sin embargo tiene unas limitantes, sólo se indica el nivel de significancia a partir de las 'estrellas' pero no se pueden proporcionar los valores de los errores estándar, eso lo dice claro en el manual de ayuda (help(estimates table)) cuando dice:“The star and star() options may not be combined with the se, t, or p options”. Lo cual es una verdadera lástima.

Un resultado más limpio se podría lograr con la función .esttab del paquete estout, sin embargo, este no lo ilustro porque es más común usar estimates store.

Indicaciones de R


library(foreign)
auto <- read.dta("http://www.stata-press.com/data/r9/auto.dta")  # Importar datos
const <- lm(price ~ weight + length + mpg, data = auto)  # Modelo con constante
nonconst <- lm(price ~ weight + length + mpg - 1, data = auto)  # Modelo sin constante
library(memisc)
mtable(const, nonconst)
## 
## Calls:
## const: lm(formula = price ~ weight + length + mpg, data = auto)
## nonconst: lm(formula = price ~ weight + length + mpg - 1, data = auto)
## 
## ===========================================
##                     const       nonconst   
## -------------------------------------------
## (Intercept)     14542.434*                 
##                 (5890.632)                 
## weight              4.365***     3.229**   
##                    (1.167)      (1.111)    
## length           -104.868*     -25.441     
##                   (39.722)     (24.117)    
## mpg               -86.789       54.622     
##                   (83.943)     (63.526)    
## -------------------------------------------
## R-squared               0.357         0.871
## adj. R-squared          0.330         0.866
## sigma                2414.563      2499.692
## F                      12.976       160.263
## p                       0.000         0.000
## Log-likelihood       -679.352      -682.440
## Deviance        408107984.249 443640629.333
## AIC                  1368.703      1372.881
## BIC                  1380.224      1382.097
## N                      74            74    
## ===========================================

Con lo cual cambiarse de stata a R no es tan traumático.

Resultados en formato latex también es posible tanto en stata como en R, pero eso es tema para otra entrada.


Asking for help in R


There are several ways you can ask for help in R, here I show some of them:
1- Use ? operator followed by the function name you wanna get help from. For example:
?mean
?var
You can either put the function name inside quotation marks or not just like the examples above. If you feel like using quotation marks, then you can write the help search query just like:
?'mean'
?'var'
The result obtained using the latter expression is the same as the former one. Some 'special' functions need to be explicity enclosed in quotation marks such as '[', '[[', '+' (all arithmetic operators), 'in', '%o%', '%*%', among others.

If you type ?[[ insted of typing ?'[[' you'll get an error message, in order to avoid it write ?'[['. One rule of thumb could be: always ask for help using quotation marks.

2- Another useful function for searching what a specific function does is 'help.search'. How does it work? well, if you thought of using ?'help.search' to answer that question, then you're right. Once you read what 'help.search' does youu can understand the examples below.

help.search("linear models")  # In case you forgot how to fit linear models
help.search("print")  # All help pages with topics or title matching 'print'
3- Forgot a function name? If so, then 'apropos' function is your friend!.
apropos("GLM")  # more than a dozen
##  [1] "anova.glm"            "anova.glmlist"        ".__C__anova.glm"     
##  [4] ".__C__anova.glm.null" ".__C__glm"            ".__C__glm.null"      
##  [7] "glm"                  "glm.control"          "glm.fit"             
## [10] "glm.fit.null"         "model.frame.glm"      "predict.glm"         
## [13] "print.glm"            "residuals.glm"        "rstandard.glm"       
## [16] "rstudent.glm"         "summary.glm"         
apropos("lm")  # a lot of results
##  [1] "anova.glm"            "anova.glmlist"        "anovalist.lm"        
##  [4] "anova.lm"             "anova.lmlist"         "anova.mlm"           
##  [7] ".__C__anova.glm"      ".__C__anova.glm.null" ".__C__glm"           
## [10] ".__C__glm.null"       ".__C__lm"             ".__C__mlm"           
## [13] "colMeans"             "contr.helmert"        ".__C__optionalMethod"
## [16] "getAllMethods"        "glm"                  "glm.control"         
## [19] "glm.fit"              "glm.fit.null"         "hatvalues.lm"        
## [22] "KalmanForecast"       "KalmanLike"           "KalmanRun"           
## [25] "KalmanSmooth"         "kappa.lm"             "lm"                  
## [28] "lm.fit"               "lm.fit.null"          "lm.influence"        
## [31] "lm.wfit"              "lm.wfit.null"         "model.frame.glm"     
## [34] "model.frame.lm"       "model.matrix.lm"      "nlm"                 
## [37] "nlminb"               "plot.lm"              "plot.mlm"            
## [40] "predict.glm"          "predict.lm"           "predict.mlm"         
## [43] "print.glm"            "print.lm"             "residuals.glm"       
## [46] "residuals.lm"         "rstandard.glm"        "rstandard.lm"        
## [49] "rstudent.glm"         "rstudent.lm"          "summary.glm"         
## [52] "summary.lm"           "summary.mlm"         
apropos("arima")
## [1] "arima"       "arima0"      "arima0.diag" "arima.sim"   "makeARIMA"  
## [6] "varimax"    
4- What about searching on the web?
4-1- http://rseek.org/ is a good place to start.
4-2- Mailing lists are good options http://www.r-project.org/mail.html
4-3- My very favorite is Stackoverflow (tagged R questions) http://stackoverflow.com/questions/tagged/r
I highly recommend using Stackoverflow, but also I recommend reading carefully how to ask for help in there, see http://stackoverflow.com/faq
-->

Vector Autoregressive Modelling: A brief introduction to 'vars' package

Some weeks ago there was a RUG-BCN meeting where I said some words about VAR modelling using R, by the way RUG-BCN stands for R User Group Barcelona, which is the R local user group founded in Barcelona, Spain.

The talk was about introducing vars package as well as what a VAR model is, all of this was from a very basic point of view.

In this post you can find some slides about VAR modelling using vars package



Importar / Exportar datos con R

En el blog del grupo de usuarios locales de R de Barcelona llamado RUG-BCN (R User Group Barcelona) escribí y publiqué una entrada donde indico de forma básica cómo importar datos con R, en ella explico cómo usar algunas de las distintas funciones disponibles en R para importar bases de datos que han sido elaboradas en otros softwares, tales como Excel, Stata y SPSS, así mismo se indica cómo exportar desde R a esos formatos anteriormente mencionados.

El post se encuentra en esta dirección

Gráfico con dos ejes Y

# Generando datos artificiales
set.seed(001)                # Esto hace reproducible el ejemplo
y1 <- rnorm(100)             # extracción de números aleatorios de una N(0,1)
y2 <-100 +  rnorm(100,50, 6) # creación de otra variable aleatoria

# Haciendo el gráfico 1
plot(lowess(y2),             # Valores a graficar
     type="l",               # pinta líneas en el gráfico
     col="red",              # color rojo para la línea
     bty='l',                # para no pintar línea superior en la 'caja' del gráfico, vea '?box'
     main='Gráfico con dos ejes Y',  # Título 
     ylab='', xlab='',       # no etiquetas en los ejes
     las=1,                  # números de los ejes correctamente girados
     cex.axis=.75)           # tamaño de los números de los ejes

plot of chunk unnamed-chunk-1


# Haciendo el segundo gráfico y agregándoselo al anterior.
par(new=TRUE)                # permite sobreimponer un gráfico al anterior

plot(y1^2,
     type="l", 
     col="blue", 
     bty='n',                # evita superponer líneas en la 'caja' del gráfico, vea '?box'
     xaxt="n",               # sin números el eje x, esto se hará luego con 'axis'
     yaxt="n",               # sin números el eje y, esto se hará luego con 'axis'
     xlab="", ylab="", 
     cex.axis=.75)

axis(4, las=1, cex.axis=.75) # pinta el eje que hace falta

legend("topright",           # ubicación de la leyenda 'parte superior derecha'
       legend=c("y1","y2"),  # contenido de la leyenda
       col=c("red","blue"),  # colores de líneas
       lty=1,                # tipo de línea: línea sólida
       cex=0.8,              # tamaño del contenido de la leyenda
       bty='n')              # sin cuadro que rodee a la leyenda.

plot of chunk unnamed-chunk-1