viernes, 11 de enero de 2013

R - Tablas de Contingencia 2x2

Para crear una tabla 2x2
  • Opción 1:
> datos2 = matrix (data = c(740,260,350,650), ncol=2, nrow=2)
> datos2
          [,1]  [,2]
     [1,]  740   350
     [2,]  260   650
  • Opción 2
> prueba = c(340,100,400,160)
> prueba2 = matrix(prueba, byrow=T,ncol=2)
> prueba2
     [,1] [,2]
[1,]  340  100
[2,]  400  160


Lo siguiente sería renombrar las filas y columnas.
> colnames(datos2) = c ('cases','controls')
> rownames(datos2) = c ('exposed','noexposed')


Para calcular rápidamente los estadísticos Chi-cuadrado, P-value y hacer el contraste de hipótesis correspondiente solo necesitamos la siguiente función:
> prop.test(datos2)

        2-sample test for equality of proportions with continuity correction

data:  datos2 
X-squared = 305.1134, df = 1, p-value < 2.2e-16
alternative hypothesis: two.sided 
95 percent confidence interval:
 0.3518061 0.4345635 
sample estimates:
   prop 1    prop 2 
0.6788991 0.2857143

Para calcular Odds ratio, Risk ratio y otros datos muy utilizados en epidemiología es interesante instalar el paquete (epiR). La función a utilizar es la siguiente:
> epi.2by2(datos2, method="cohort.count")
             Disease +    Disease -      Total        Inc risk *        Odds
Exposed +          740          350       1090              67.9        2.11
Exposed -          260          650        910              28.6        0.40
Total             1000         1000       2000              50.0        1.00

Point estimates and 95 % CIs:
---------------------------------------------------------
Inc risk ratio                         2.38 (2.13, 2.65)
Odds ratio                             5.28 (4.34, 6.44)
Attrib risk *                          39.32 (35.28, 43.36)
Attrib risk in population *            21.43 (17.77, 25.09)
Attrib fraction in exposed (%)         57.92 (53, 62.32)
Attrib fraction in population (%)      42.86 (37.88, 47.44)
---------------------------------------------------------
 * Cases per 100 population units

viernes, 28 de diciembre de 2012

R - Importar y exportar datos

Para hacer R más versátil a la hora de reconocer archivos diseñados con otros programas es casi imprescindible haber instalado antes el paquete "foreign" (es bueno mantenerlo siempre cargado, o si no, teclear > library (foreign) antes de intentar alguna carga de datos.

1 -  Importar tablas creadas con excel: 

El ejemplo explicado a continuación está realizado con las hojas de cálculo de libre office y el interface de Rstudio.



Una vez que tenemos la tabla que vamos a usar en R debemos guardar el archivo en formato ".csv", pero atención, en este caso nuestra tabla utiliza "," para definir los decimales y esto puede dar problemas al pasar los datos a R, asi que tenemos estas dos opciones entre otras.
  • Opción 1: Cambiar las comas por puntos en la hoja de cálculo antes de salvar como formato .csv ; esto se hace de forma sencilla con la opción "Buscar y reemplazar" del menú "Editar". Para abrir el archivo en R usaríamos la función read.csv () teniendo en cuenta de haber definido el directorio de trabajo donde está el archivo y poniendo el nombre del archivo entre " ".
>  MiTablaExcelenR = read.csv ("MiArchivo.csv") 

  • Opción 2: Guardar el archivo .csv pero haciendo que el delimitador de campo sea ";" y no ",". Si usamos libre office automáticamente nos da la opción al cambio antes de guardar el archivo en dicho formato (esta opción es la recomendada para los que usamos el sistema de notación español en las hojas de cálculo).

 
 

Una vez que tenemos el archivo salvado podemos echarle un ojo en un editor de texto. Encontraremos la siguiente apariencia:

;Nº de seguimiento;Sexo;Edad;Peso (Kg);Estatura (m);Estado físico
Paco;1234;H;25;80,5;1,8;1
Pepe;2345;H;45;73,8;1,77;2
Marius;3456;H;28;85,9;1,88;2
Silvia;4567;M;27;60,2;1,65;2
Javier;5678;H;34;90;1,83;4
Noelia;6789;M;31;58,5;1,66;3
Richard;9101;H;40;88,5;1,8;2
Daniel;1213;H;33;83,5;1,75;2
Ana;1415;M;29;63;1,7;1


Ahora ya tenemos la tabla de excel preparada para ser introducida en R (cada linea del .csv es una fila de la tabla y cada dato se separa mediante ";").
Procedemos definiendo el directorio de trabajo donde está el archivo en cuestión y después usamos el siguiente comando:

> MiTablaExcelenR = read.csv2 ("NombreDelArchivo.csv")

Vemos finalmente que R ha sustituido las "," de los decimales por puntos, asi que ya tenemos los datos listos para empezar a trabajar con ellos.

  2- Leer archivo de stata (.dta):

> data = read.dta ('elarchivoquesea.dta')


jueves, 27 de diciembre de 2012

R - Regresión lineal (1)

Los ejemplos están realizados con un conjunto de datos que incluye el propio programa. Solo hay que cargarlos previamente ( > longley ).

1 - Crear un scatter plot o nube de puntos con 2 variables:

Haremos un análisis de la regresión lineal entre el número de empleados y el año. 

> plot(Employed ~ Year, data=longley)

  2 - Análisis de regresión linear:


> Regresion = lm (Employed ~ Year, data = longley)
> Regresion


Call:
lm(formula = Employed ~ Year, data = longley)

Coefficients:
(Intercept)         Year 
 -1335.1052       0.7165



La regresion que se ha realizado representa el número de personas empleadas en función del año. En esta primera tabla se obtienen los valores típicos de una función y= a + bx:
  • a = -1335.1052 ; valor de la ordenada intersección de la recta con el eje Y).
  • b = 0.7165 ; valor de la pendiente.

Podemos realizar un test de contraste de hipótesis para ver el valor de la regresión:
  • H0: no hay relación linear entre el número de empleados y el año.
  • H1: hay relación linear.


> summary (Regresion)

Call:
lm(formula = Employed ~ Year, data = longley)

Residuals:
    Min            1Q       Median        3Q           Max
-1.3118    -0.7089     0.2099     0.4244     1.4652

Coefficients:
                           Estimate         Std. Error          t value        Pr(>|t|)   
(Intercept)      -1.335e+03       9.161e+01        -14.57         7.44e-10 ***
Year                    7.165e-01          4.687e-02         15.29         3.96e-10 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.8642 on 14 degrees of freedom
Multiple R-squared: 0.9435,    Adjusted R-squared: 0.9394
F-statistic: 233.7 on 1 and 14 DF,  p-value: 3.958e-10

-->
Pr (>|t|) es el valor estadístico que vamos a utilizar para rechazar o no la hipótesis nula H0. En este caso, Pr = 3.96^-10 es tan pequeño que podemos rechazar la H0 (los 3 asteríscos que aparecen a la derecha del valor hacen referencia a los "Signif. codes" que aparecen en la siguiente linea de la consola, y significan simplemente que el valor del Pr es inferior al nivel de significación 0.001). El valor de los "Multiple R-squared" y "Adjusted R-squared" están por encima del 0.9, indicando que los puntos están bien ajustados a una línea recta.
Es importante llegados a este punto no caer en la tentación de explicar una variable en función de la otra cada vez que vemos una buena regresión lineal. La correlación no implica que haya causalidad. Así bien, en este caso, la causa de que aumente el número de empleados cada año tendrá su relación causal con el aumento de población, con el aumento del PIB, etc.

lunes, 24 de diciembre de 2012

R - Crear una tabla o conjunto de datos

Vamos a crear un conjunto de datos a partir de 2 vectores. El primero será una variable cualitativa que indica el tipo de clima (en este caso 1 o 2). El segundo vector representa la variable cuantitativa medida en cada individuo (en este caso el crecimiento en cm):
> Clima = c(1,1,1,1,1,2,2,2,2,2)
> Crecimiento = c(350,375,360,400,380,500,530,520,550,545)
> Clima
 [1] 1 1 1 1 1 2 2 2 2 2
> Crecimiento
 [1] 350 375 360 400 380 500 530 520 550 545


Acto seguido podemos unir los dos vectores en una sola tabla gracias a la función 'data.frame()' y 'cbind()'. La función cbind() significa 'collumn bind' y unirá las dos tablas en columnas:
> laTabla = data.frame (cbind(Clima,Crecimiento))
> laTabla
   Clima Crecimiento
1      1         350
2      1         375
3      1         360
4      1         400
5      1         380
6      2         500
7      2         530
8      2         520
9      2         550
10    2         545


Si lo que buscamos es unir los vectores de forma horizontal, hacerlos filas, usaremos la función 'rbind()' ('row bind'):
> laTabla2 = data.frame (rbind(Clima,Crecimiento))
> laTabla2
                             X1   X2  X3   X4   X5   X6   X7   X8   X9  X10
Clima                     1     1     1       1       1      2       2      2      2     2
Crecimiento    350 375 360 400 380 500 530 520 550 545

R - Funcionamiento básico

1 - Operaciones matemáticas:


> 4 + 5
[1] 9

 

2 - Generar un gráfico, por ejemplo un histograma de frecuencias de 500 valores aleatorios que siguen una distribución normal:


> hist(rnorm(1000))

 

3 - Los objetos:

Podemos asignar el contenido de una operación o un gráfico a un objeto utilizando el símbolo =
> miObjeto = 4 + 5
> miObjeto
[1] 9


 

4 - Ver la lista de objetos que hemos ido creando:

> ls ()

 

5 - Crear vectores y matrices:

-> Para construir un vector usamos la función 'c ()':
> V1 = c(0,34,87,26,97,566,20,15,6,70)
> V1
[1] 0   34  87  26  97  566  20  15  6  70


-> También podemos generar una secuencia de números con la función 'seq ()':
> V2 = seq(from = 1.5, to = 2.4, by = 0.1)
> V2
[1] 1.5  1.6  1.7  1.8  1.9  2.0  2.1  2.2  2.3  2.4


-> Para generar una secuencia de 10 valores aleatorios que siguen una distribución normal:
> V3 = rnorm(10)
> V3
[1] -0.38162676  0.25942840  -0.24536692  0.05354111  0.41057944
[6] 0.05557781  -0.67593268  0.53318621  -0.77285384  2.55022478


-> Se pueden realizar operaciones con vectores siempre que se cumplan ciertas condiciones:
> V1 * V2
[1]  0.0  54.4  147.9  46.8  184.3  1132.0  42.0  33.0  13.8
[10] 168.0
> V1 + c(3,10)
[1]  3  44  90  36  100  576  23  25  9  80
> 3.3 * V1
[1]  0.0  112.2  287.1  85.8  320.1  1867.8  66.0  49.5  19.8
[10] 231.0


-> Para acceder a una posición en el vector:
> V1[5]
[1] 97


-> Para acceder a distintos valores del vector (ej. 2º y 5º valor)  podemos hacer:
> V1 [c(2,5)]
[1] 34 97


-> Para ver todos los valores entre el valor 2º y 5º:
> V1[2:5]
[1] 34 87 26 97


-> Para crear una matrix:
> laMatriz = matrix(data=,nrow=2,ncol=2,byrow=FALSE, dimnames=NULL)
> laMatriz
     [,1] [,2]
[1,]   NA   NA
[2,]   NA   NA






domingo, 23 de diciembre de 2012

R - Añadir una columna a una tabla y transformar el contenido:


Este ejemplo es práctico y conciso. Creado a partir de una tabla de datos inventada:

> Datos
        X   Color Altura Coordenadax Coordenaday Padre Numero.de.hijos
1    Paco    Azul    1,8   1234253,5  89730495,4    Si               1
2    pepe   Verde    1,4   1234253,6  89730496,4   No                2
3 Sicario   Verde    1,6   1234253,7  89730497,4    Si               3
4   Edgar   Negro    1,2   1234253,8  89730498,4    Si               4
5  London Naranja      2   1234253,9  89730499,4    Si               5

Para crear una columna en última posición debemos crear un vector que vaya acorde a las características de la tabla. Lo llamaremos "UltimaFila":

> UltimaFila=vector(mode='numeric', length=5)
> UltimaFila
[1] 0 0 0 0 0 

Ahora renombramos la tabla e insertamos la columna al final a partir del vector creado:

> NuevosDatos = data.frame(Datos, UltimaFila)
> NuevosDatos
        X   Color Altura Coordenadax Coordenaday Padre Numero.de.hijos UltimaFila
1    Paco    Azul    1,8   1234253,5  89730495,4    Si               1          0
2    pepe   Verde    1,4   1234253,6  89730496,4   No                2          0
3 Sicario   Verde    1,6   1234253,7  89730497,4    Si               3          0
4   Edgar   Negro    1,2   1234253,8  89730498,4    Si               4          0
5  London Naranja      2   1234253,9  89730499,4    Si               5          0

Antes de modificar los valores de "miVector" es interesante simplificar los nombres de las variables:


> colnames(NuevosDatos)= c('Persona','Color','Altura','Coor X','Coor Y','Padre','Hijos','Hijos*2')
> NuevosDatos
  Persona   Color Altura    Coor X     Coor Y Padre Hijos Hijos*2
1    Paco    Azul    1,8 1234253,5 89730495,4    Si     1       0
2    pepe   Verde    1,4 1234253,6 89730496,4   No      2       0
3 Sicario   Verde    1,6 1234253,7 89730497,4    Si     3       0
4   Edgar   Negro    1,2 1234253,8 89730498,4    Si     4       0
5  London Naranja      2 1234253,9 89730499,4    Si     5       0

Para terminar podemos modificar los valores de la última columna a partir de otros que ya se encuentran en la tabla. Es muy importante en este caso colocar bien las comillas para definir bien la  columna ('Hijos*2') o la fórmula que vamos a aplicar (Hijos*2):


> NuevosDatos$'Hijos*2'=NuevosDatos$Hijos*2
> NuevosDatos
  Persona   Color Altura    Coor X     Coor Y Padre Hijos Hijos*2
1    Paco    Azul    1,8 1234253,5 89730495,4    Si     1       2
2    pepe   Verde    1,4 1234253,6 89730496,4   No      2       4
3 Sicario   Verde    1,6 1234253,7 89730497,4    Si     3       6
4   Edgar   Negro    1,2 1234253,8 89730498,4    Si     4       8
5  London Naranja      2 1234253,9 89730499,4    Si     5      10