Mostrando entradas con la etiqueta Tablas de contingencia. Mostrar todas las entradas
Mostrando entradas con la etiqueta Tablas de contingencia. Mostrar todas las entradas

2019-06-21

Contingency tables in R

Problem

We want to create a contingency table for one or multiple variables.

Solution

  • One variable
  • table(mtcars$am)
    
     0  1 
    19 13 
    
  • Two variables
  • table(mtcars$am, mtcars$gear)
    
         3  4  5
      0 15  4  0
      1  0  8  5
    
    If we want to include the names of the variables:

    table(mtcars[, c("am", "gear")]) 
    tabla <- table(mtcars[, 9:10])
    # or the argument dnn:
    table(mtcars$am, mtcars$gear, dnn = c("am", "gear"))
    
       gear
    am   3  4  5
      0 15  4  0
      1  0  8  5
    
  • Three variables
  • table(mtcars[, c("am", "gear", "cyl")])
    
    , , cyl = 4
    
       gear
    am   3  4  5
      0  1  2  0
      1  0  6  2
    
    , , cyl = 6
    
       gear
    am   3  4  5
      0  2  2  0
      1  0  2  1
    
    , , cyl = 8
    
       gear
    am   3  4  5
      0 12  0  0
      1  0  0  2
    
  • Flat contingency tables
  • In the previous example, a better approach would be to create a flat contingency table.

    ftable(mtcars[, c("am", "gear", "cyl")])
    
            cyl  4  6  8
    am gear             
    0  3         1  2 12
       4         2  2  0
       5         0  0  0
    1  3         0  0  0
       4         6  2  0
       5         2  1  2
    
    We use the arguments row.vars and col.vars to provide the numbers or names of the variables to be used for the rows and columns of the flat contingency table. If neither of these two is given, the last variable is used for the columns. In our example the variable cyl.

    ftable(mtcars[, c("am", "gear", "cyl")], col.vars = c(1, 2))
    
         am    0        1      
        gear  3  4  5  3  4  5
    cyl                       
    4         1  2  0  0  6  2
    6         2  2  0  0  2  1
    8        12  0  0  0  0  2
    

Alternative

The function xtabs creates contingency tables using a formula interface, each variable separated by +.

# One variable
xtabs(~ am, mtcars)
# Two variables
xtabs(~ am + gear, mtcars)
# Three variables
xtabs(~ am + gear + cyl, mtcars)
# Flat contingency table
ftable(xtabs(~ am + gear + cyl, mtcars))

Related posts

2015-08-09

Calcular el porcentaje del total de la columna en R

Title

Problema

Queremos calcular el porcentaje del total de la columna de un data frame en R. En nuestro ejemplo una columna con: 7/397, 23/397 y así sucesivamente.

    x freq
1 Jan    7
2 Feb   23
3 Mar   86
4 Apr  281
Código para crear el data frame anterior:

df <- read.table(text = "x    freq
                        Jan   7
                        Feb   23
                        Mar   86
                        Apr   281", 
                        header =TRUE)

Solución

Empleamos la función prop.table para crear esa columna.

df$prob <- prop.table(df$freq)
# En porcentajes con dos decimales:
df$prob <- round(prop.table(df$freq), 4)*100
    x freq       prob
1 Jan    7 0.01763224
2 Feb   23 0.05793451
3 Mar   86 0.21662469
4 Apr  281 0.70780856
Si deseamos el porcentaje de un mes específico:
prop.table(df$freq)[df$x == "Feb"] 
 [1] 0.05793451

Alternativas

  • Paquete base
  • df$prob <- df$freq/sum(df$freq)
    
  • dplyr
  • library(dplyr)
    df %>% mutate(prob = prop.table(freq))
    # O también
    df %>% mutate(prob = freq / sum(freq))
    
    Un mes específico:
    df %>% filter(x == "Feb")
    
        x freq       prob
    1 Feb   23 0.05793451
    

Referencias

2015-07-09

Representar gráficamente una tabla de contingencia en R

Title

Problema

Deseamos representar gráficamente una tabla de contingencia.

Solución

  • Una dimensión
  • tabla <- table(mtcars$am, dnn = c("am"))
    
    am
     0  1 
    19 13
    
    Por defecto, para tablas unidimensionales R generará un gráfico de barras.

    plot(tabla) 
    
    Si deseamos que genere un gráfico de mosaico.

    mosaicplot(tabla)(tabla) 
    
  • Dos dimensiones
  • tabla <- table(mtcars$am, mtcars$gear, dnn = c("am", "gear"))
    
       gear
    am   3  4  5
      0 15  4  0
      1  0  8  5
    
    Por defecto, para tablas de dos o más dimensiones R generará un gráfico de mosaico.

    plot(tabla) # Es equivalente a
    mosaicplot(tabla)
    
  • Tres dimensiones
  • tabla <- table(mtcars[, c("am", "gear", "cyl")])
    
    , , cyl = 4
    
       gear
    am   3  4  5
      0  1  2  0
      1  0  6  2
    
    , , cyl = 6
    
       gear
    am   3  4  5
      0  2  2  0
      1  0  2  1
    
    , , cyl = 8
    
       gear
    am   3  4  5
      0 12  0  0
      1  0  0  2
    
    plot(tabla) # Es equivalente a
    mosaicplot(tabla)
    

Referencias

2015-05-29

R: Tabulación cruzada y prueba chi-cuadrado con gmodels

Title

Problema

En R deseamos crear una tabla de referencias cruzadas similar a la producida en SAS (SAS Proc Freq) o crosstabs SPSS.

Solución

Utilizamos la función CrossTable del paquete gmodels.

  • SAS
  • CrossTable(mtcars$am, mtcars$gear, dnn = c("am", "gear"), expected = TRUE, format = "SAS")
    
       Cell Contents
    |-------------------------|
    |                       N |
    |              Expected N |
    | Chi-square contribution |
    |           N / Row Total |
    |           N / Col Total |
    |         N / Table Total |
    |-------------------------|
    
     
    Total Observations in Table:  32 
    
     
                 | gear 
              am |         3 |         4 |         5 | Row Total | 
    -------------|-----------|-----------|-----------|-----------|
               0 |        15 |         4 |         0 |        19 | 
                 |     8.906 |     7.125 |     2.969 |           | 
                 |     4.169 |     1.371 |     2.969 |           | 
                 |     0.789 |     0.211 |     0.000 |     0.594 | 
                 |     1.000 |     0.333 |     0.000 |           | 
                 |     0.469 |     0.125 |     0.000 |           | 
    -------------|-----------|-----------|-----------|-----------|
               1 |         0 |         8 |         5 |        13 | 
                 |     6.094 |     4.875 |     2.031 |           | 
                 |     6.094 |     2.003 |     4.339 |           | 
                 |     0.000 |     0.615 |     0.385 |     0.406 | 
                 |     0.000 |     0.667 |     1.000 |           | 
                 |     0.000 |     0.250 |     0.156 |           | 
    -------------|-----------|-----------|-----------|-----------|
    Column Total |        15 |        12 |         5 |        32 | 
                 |     0.469 |     0.375 |     0.156 |           | 
    -------------|-----------|-----------|-----------|-----------|
    
     
    Statistics for All Table Factors
    
    
    Pearson's Chi-squared test 
    ------------------------------------------------------------
    Chi^2 =  20.94467     d.f. =  2     p =  2.830889e-05 
    
  • SPSS
  • CrossTable(mtcars$am, mtcars$gear, dnn = c("am", "gear"), expected = TRUE, format = "SPSS")
    
    
       Cell Contents
    |-------------------------|
    |                   Count |
    |         Expected Values |
    | Chi-square contribution |
    |             Row Percent |
    |          Column Percent |
    |           Total Percent |
    |-------------------------|
    
    Total Observations in Table:  32 
    
                 | gear 
              am |        3  |        4  |        5  | Row Total | 
    -------------|-----------|-----------|-----------|-----------|
               0 |       15  |        4  |        0  |       19  | 
                 |    8.906  |    7.125  |    2.969  |           | 
                 |    4.169  |    1.371  |    2.969  |           | 
                 |   78.947% |   21.053% |    0.000% |   59.375% | 
                 |  100.000% |   33.333% |    0.000% |           | 
                 |   46.875% |   12.500% |    0.000% |           | 
    -------------|-----------|-----------|-----------|-----------|
               1 |        0  |        8  |        5  |       13  | 
                 |    6.094  |    4.875  |    2.031  |           | 
                 |    6.094  |    2.003  |    4.339  |           | 
                 |    0.000% |   61.538% |   38.462% |   40.625% | 
                 |    0.000% |   66.667% |  100.000% |           | 
                 |    0.000% |   25.000% |   15.625% |           | 
    -------------|-----------|-----------|-----------|-----------|
    Column Total |       15  |       12  |        5  |       32  | 
                 |   46.875% |   37.500% |   15.625% |           | 
    -------------|-----------|-----------|-----------|-----------|
    
     
    Statistics for All Table Factors
    
    
    Pearson's Chi-squared test 
    ------------------------------------------------------------
    Chi^2 =  20.94467     d.f. =  2     p =  2.830889e-05 
    
    
     
           Minimum expected frequency: 2.03125 
    Cells with Expected Frequency < 5: 3 of 6 (50%)
    

    Notas

    Argumentos:

    expected - si es TRUE para incluir la prueba chi-cuadrado de Pearson.
    format - indicamos el formato de la salida de datos, SAS —por defecto— o SPSS.
    dnn - nombres de las dimensiones en el resultado.

    Referencias

    2015-05-25

    Transformar tabla de contingencia en tabla de de frecuencias

    Title

    Problema

    Deseamos transformar una tabla de contingencia en una tabla de frecuencias.

    # Tabla de contigencia
    tabla <- table(mtcars[, c("am", "gear")])
    
       gear
    am   3  4  5
      0 15  4  0
      1  0  8  5
    

    Tabla de frecuencias

    tabla <- table(mtcars[, c("am", "gear")])
    cuenta <- as.data.frame(tabla)
    cuenta
    
      am gear Freq
    1  0    3   15
    2  1    3    0
    3  0    4    4
    4  1    4    8
    5  0    5    0
    6  1    5    5
    

    Transformar tabla de frecuencias en tabla de contingencia

    ftable(xtabs(Freq ~ am + gear, data = cuenta)) 
    
       gear  3  4  5
    am              
    0       15  4  0
    1        0  8  5
    
    Es el equivalente a:

    ftable(mtcars[, c("am", "gear")])
    

    Referencias

    2015-05-22

    Tablas de proporciones en R

    Title

    Problema

    Deseamos crear una tabla de proporciones.

    Solución

    • Una dimensión
    • tabla <- table(mtcars$am)
      prop.table(tabla)
      
            0       1 
      0.59375 0.40625
      
    • Dos dimensiones
    • tabla <- table(mtcars[, c("am", "gear")])
      prop.table(tabla)
      
         gear
      am        3       4       5
        0 0.46875 0.12500 0.00000
        1 0.00000 0.25000 0.15625
      
      La función prop.table tiene dos argumentos:

      • x, tabla creada anteriormente con la función table
      • margin, con tres posibles valores:
      •   Nulo, calcula x/suma(x), como en el ejemplo anterior.
          1, calcula la proporción por filas.
          2, calcula la proporción por columnas.

      # Por filas
      prop.table(tabla, 1)
      
         gear
      am          3         4         5
        0 0.7894737 0.2105263 0.0000000
        1 0.0000000 0.6153846 0.3846154
      
      # Por columnas
      prop.table(tabla, 2)
      
         gear
      am          3         4         5
        0 1.0000000 0.3333333 0.0000000
        1 0.0000000 0.6666667 1.0000000
      
    • Tres dimensiones
    • tabla <- table(mtcars[, c("am", "gear", "cyl")])
      prop.table(tabla)
      
      , , cyl = 4
      
         gear
      am        3       4       5
        0 0.03125 0.06250 0.00000
        1 0.00000 0.18750 0.06250
      
      , , cyl = 6
      
         gear
      am        3       4       5
        0 0.06250 0.06250 0.00000
        1 0.00000 0.06250 0.03125
      
      , , cyl = 8
      
         gear
      am        3       4       5
        0 0.37500 0.00000 0.00000
        1 0.00000 0.00000 0.06250
      
    • Tabla de contingencia plana
    • En caso anterior sería más claro crear una tabla de contingencia plana (Flat Contingency Table).

      tabla <- ftable(mtcars[, c("am", "gear", "cyl")])
      prop.table(tabla)
      
              cyl       4       6       8
      am gear                            
      0  3        0.03125 0.06250 0.37500
         4        0.06250 0.06250 0.00000
         5        0.00000 0.00000 0.00000
      1  3        0.00000 0.00000 0.00000
         4        0.18750 0.06250 0.00000
         5        0.06250 0.03125 0.06250
      
    • Tabla en porcentajes
    • Empleamos la función round.

      round(prop.table(tabla)*100, 2)
      
               cyl     4     6     8
      am gear                      
      0  3         3.12  6.25 37.50
         4         6.25  6.25  0.00
         5         0.00  0.00  0.00
      1  3         0.00  0.00  0.00
         4        18.75  6.25  0.00
         5         6.25  3.12  6.25
      
      round(prop.table(tabla, 1)*100, 2) # Por fila, am y gear.
      
              cyl     4     6     8
      am gear                      
      0  3         6.67 13.33 80.00
         4        50.00 50.00  0.00
         5          NaN   NaN   NaN
      1  3          NaN   NaN   NaN
         4        75.00 25.00  0.00
         5        40.00 20.00 40.00
      
      round(prop.table(tabla, 2)*100, 2) # Por columna, cilindro
      
              cyl     4     6     8
      am gear                      
      0  3         9.09 28.57 85.71
         4        18.18 28.57  0.00
         5         0.00  0.00  0.00
      1  3         0.00  0.00  0.00
         4        54.55 28.57  0.00
         5        18.18 14.29 14.29
      

    Referencias

    Nube de datos