dplyr - R: Calcular la diferencia entre proporciones para datos categóricos

CorePress2024-01-25  152

Tengo un conjunto de datos que compara datos de sí/no para las opciones A/B/C/D. Quiero calcular las proporciones de cada opción A/B/C/D que son sí, y calcular la diferencia absoluta y relativa en proporción en comparación con la proporción de A que son sí.

Si hay una forma más eficiente de llegar a este cambio relativo y absoluto en las proporciones en comparación con una proporción de referencia, ¡a mí también me interesaría mucho saberlo! Hasta ahora, he estado usando dplyr, estaré feliz de usar otra biblioteca si logra el resultado deseado.

Datos:

Mis datos están en el siguiente formato:

> str ( df )
'data.frame':   589 obs. of  2 variables:
 $ grp1: Factor w/ 4 levels "A","B","C","D": 3 1 2 1 3 3 4 2 2 1 ...
 $ grp2: Factor w/ 2 levels "N","Y": 1 2 1 1 1 1 1 2 2 2 ...
>
> table ( df )
    grp2
grp1   N   Y
   A  81  40
   B 144  61
   C 117  38
   D  88  20

Proporciones:

He calculado las proporciones de sí/(sí + no) de la siguiente manera:

>library ( dplyr )
> df %>%
+      group_by ( grp1 , grp2 ) %>%
+      summarise ( n = n () ) %>% 
+      mutate ( total = sum ( n ) ) %>%
+      mutate ( prop = n / sum ( n ) ) %>% 
+      filter ( grp2 == "Y" )
# A tibble: 4 x 4
# Groups:   grp1 [4]
  grp1  grp2      n total prop
  <fct> <fct> <int> <int> <dbl>
1 A     Y        40   121 0.331
2 B     Y        61   205 0.298
3 C     Y        38   155 0.245
4 D     Y        20   108 0.185

Lo que quiero:

Codificado de forma fija, diferencia.absoluta = prop - 0.331, diferencia.relativa = prop / 0,331. Quiero que el código use el primer valor de la columna de accesorios como valor de referencia, en lugar de tener que especificar el valor de referencia manualmente.

  grp1  grp2      n  total   prop  difference.absolute  difference.relative
1 A     Y        40    121  0.331                    0                    1
2 B     Y        61    205  0.298              -0.0334                0.899
3 C     Y        38    155  0.245              -0.0858                0.741
4 D     Y        20    108  0.185               -0.146                0.559



------------------------------------

¿Estás buscando algo como esto?

df %>%
  group_by ( grp1 , grp2 ) %>%
  summarise ( n = n () ) %>% 
  mutate ( total = sum ( n ) ) %>%
  mutate ( prop = n / sum ( n ) ) %>% 
  filter ( grp2 == "Y" ) %>% 
  ungroup() %>% 
  mutate(difference.absolute = prop - prop[1]) %>% 
  mutate(difference.relative = prop / prop[1])

6

Algo así, sí. Pero si agrego esos dos comandos al final de mi canal, aparece "Error: Problemacon mutate() entrada diferencia.absoluta. x La diferencia de entrada.absoluta no se puede reciclar al tamaño 1. ℹ La diferencia de entrada.absoluta es prop - df$prop[1]. ℹ La diferencia de entrada.absoluta debe ser de tamaño 1, no 0. ℹ El error ocurrió en el grupo 1: grp1 = "A".'

- Ged

28 de marzo de 2021 a las 9:52

2

@Ged dplyr está intentando aplicar la operación en grupo. Intente agregar un paso desagrupar() antes.

-Wiktor Gustafsson

28 de marzo de 2021 a las 9:58

@WiktorGustafsson, agregar ungroup() %>% después de mi código/antes de mutate(difference.absolute = prop - df$prop[1]) me da la entrada 'difference.absolute' no se puede reciclar al tamaño 4.

- Ged

28/03/2021 a las 10:11

1

¡Lo he resuelto! Su solución, @WiktorGustafsson y @ornaldo_, pero refiriéndose a df como . dentro de mutate() en su lugar

- Ged

28/03/2021 a las 10:25

2

@Ged ¡Genial! Pero creo que puedes saltarte eso por completo y simplemente hacer referencia a las variables directamente, es decir, simplemente prop en lugar de .$prop. Debe saber que el alcance es df.

-Wiktor Gustafsson

28/03/2021 a las 11:08



------------------------------------

simplificando un poco tu sintaxis

df %>% count(grp1, grp2) %>%
  group_by(grp1) %>%
  mutate(total = sum(n),
         prop = n/total) %>%
  filter(grp2 == "Y") %>% ungroup() %>%
  mutate(difference.absolut = prop - first(prop),
         difference.relative = prop/first(prop))

# A tibble: 4 x 7
  grp1  grp2      n total  prop difference.absolut difference.relative
  <chr> <chr> <int> <int> <dbl>              <dbl>               <dbl>
1 A     Y        40   121 0.331             0                    1    
2 B     Y        61   205 0.298            -0.0330               0.900
3 C     Y        38   155 0.245            -0.0854               0.742
4 D     Y        20   108 0.185            -0.145                0.560

Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare