2 votos

Discrepancia en el cálculo de la DMS entre los paquetes CreateTableOne y Cobalt R

Estaba intentando calcular las diferencias de medias estandarizadas (DME) después de realizar el emparejamiento de la puntuación de propensión para verificar que se había logrado el equilibrio, pero me encontré con algunas discrepancias entre los paquetes.

Probé dos enfoques para evaluar el equilibrio utilizando tanto el paquete CreateTableOne como el paquete cobalt en R, sin embargo, estaba obteniendo resultados diferentes y quería preguntar a la comunidad si alguien tenía alguna sugerencia sobre lo que puede estar causando la discrepancia.

Aquí están los datos ANTES de realizar cualquier comparación usando CreateTableOne:

> print(CreateTableOne(vars = variables_for_table, strata = "treated", data = working_data), quote = FALSE, noSpaces = TRUE, smd = TRUE)

                                       Stratified by treated
                                          No            Yes           p     test SMD  
  n                                       198           41                            
  age_at_diagnosis (mean (SD))            64.37 (10.63) 62.40 (14.87) 0.316      0.153
  charlson_score (mean (SD))              1.93 (2.19)   3.10 (3.81)   0.008      0.374
  median_wbc_6mo (mean (SD))              9.31 (3.98)   8.62 (4.23)   0.317      0.169
  chemotherapy = Yes (%)                  113 (57.1)    29 (70.7)     0.148      0.287
  radiation = Yes (%)                     117 (59.1)    26 (63.4)     0.735      0.089
  smoking = Yes (%)                       70 (35.4)     22 (53.7)     0.044      0.375
  alcohol = Yes (%)                       6 (3.0)       2 (4.9)       0.903      0.095
  myocardial_infarction = Yes (%)         3 (1.5)       2 (4.9)       0.441      0.192
  congestive_heart_failure = Yes (%)      5 (2.5)       2 (4.9)       0.761      0.125
  peripheral_vascular_disease = Yes (%)   8 (4.0)       2 (4.9)       1.000      0.041
  cerebrovascular_disease = Yes (%)       21 (10.6)     8 (19.5)      0.185      0.251
  dementia = Yes (%)                      1 (0.5)       1 (2.4)       0.768      0.161
  chronic_pulmonary_disease = Yes (%)     18 (9.1)      4 (9.8)       1.000      0.023
  rheumatic_disease = Yes (%)             8 (4.0)       3 (7.3)       0.616      0.142
  mild_liver_disease = Yes (%)            4 (2.0)       4 (9.8)       0.042      0.333
  diabetes_without_complication = Yes (%) 16 (8.1)      4 (9.8)       0.966      0.059
  diabetes_with_complication = Yes (%)    1 (0.5)       1 (2.4)       0.768      0.161
  hemiplegia_or_paraplegia = Yes (%)      5 (2.5)       1 (2.4)       1.000      0.006
  renal_disease = Yes (%)                 5 (2.5)       3 (7.3)       0.282      0.223
  malignancy = Yes (%)                    17 (8.6)      3 (7.3)       1.000      0.047
  metastatic_cancer = Yes (%)             8 (4.0)       6 (14.6)      0.024      0.370
  hiv_or_aids = Yes (%)                   0 (0.0)       1 (2.4)       0.383      0.224

Aquí está DESPUÉS de realizar el cotejo con el paquete MatchIt y evaluar el equilibrio de nuevo con CreateTableOne:

> formula = treated~ age_at_diagnosis + charlson_score + median_wbc_6mo + chemotherapy + radiation + smoking + alcohol + myocardial_infarction + congestive_heart_failure + peripheral_vascular_disease + cerebrovascular_disease + dementia + chronic_pulmonary_disease + rheumatic_disease + mild_liver_disease + diabetes_without_complication + diabetes_with_complication + hemiplegia_or_paraplegia + renal_disease + malignancy  + metastatic_cancer + hiv_or_aids
> matched_data = matchit(formula, data = working_data, distance = "glm", method = "nearest", replace = FALSE, ratio = 4, caliper = 0.3)
> matched_data = match.data(matched_data)

> print(CreateTableOne(vars = variables_for_table, strata = "treated", data = matched_data), quote = FALSE, noSpaces = TRUE, smd = TRUE)

                                        Stratified by treated
                                          No            Yes           p     test SMD   
  n                                       106           34                             
  age_at_diagnosis (mean (SD))            62.58 (11.14) 62.17 (15.04) 0.865      0.031 
  charlson_score (mean (SD))              1.88 (1.98)   1.91 (1.68)   0.927      0.019 
  median_wbc_6mo (mean (SD))              9.23 (4.08)   9.00 (4.46)   0.775      0.055 
  chemotherapy = Yes (%)                  69 (65.1)     23 (67.6)     0.948      0.054 
  radiation = Yes (%)                     64 (60.4)     21 (61.8)     1.000      0.028 
  smoking = Yes (%)                       47 (44.3)     17 (50.0)     0.705      0.114 
  alcohol = Yes (%)                       4 (3.8)       2 (5.9)       0.967      0.098 
  myocardial_infarction = Yes (%)         3 (2.8)       2 (5.9)       0.762      0.150 
  congestive_heart_failure = Yes (%)      2 (1.9)       1 (2.9)       1.000      0.069 
  peripheral_vascular_disease = Yes (%)   6 (5.7)       2 (5.9)       1.000      0.010 
  cerebrovascular_disease = Yes (%)       14 (13.2)     6 (17.6)      0.717      0.123 
  dementia = Yes (%)                      0 (0.0)       0 (0.0)       NaN        <0.001
  chronic_pulmonary_disease = Yes (%)     12 (11.3)     3 (8.8)       0.927      0.083 
  rheumatic_disease = Yes (%)             3 (2.8)       1 (2.9)       1.000      0.007 
  mild_liver_disease = Yes (%)            3 (2.8)       1 (2.9)       1.000      0.007 
  diabetes_without_complication = Yes (%) 8 (7.5)       3 (8.8)       1.000      0.047 
  diabetes_with_complication = Yes (%)    0 (0.0)       0 (0.0)       NaN        <0.001
  hemiplegia_or_paraplegia = Yes (%)      1 (0.9)       1 (2.9)       0.981      0.145 
  renal_disease = Yes (%)                 4 (3.8)       1 (2.9)       1.000      0.046 
  malignancy = Yes (%)                    7 (6.6)       1 (2.9)       0.707      0.172 
  metastatic_cancer = Yes (%)             3 (2.8)       1 (2.9)       1.000      0.007 
  hiv_or_aids = No (%)                    106 (100.0)   34 (100.0)    NA         <0.001

Me gustaría llamar su atención sobre la variable "malignidad" (tercera fila desde abajo). Tras el emparejamiento, en el grupo de tratamiento la prevalencia de malignidad es del 2,9% frente al 6,6% en el grupo no tratado, lo que resulta en una DME de 0,172 por CreateTableOne. Sin embargo, si evaluamos el equilibrio pasando el objeto MatchIt directamente al paquete de cobalto, como se indica a continuación, obtenemos un valor diferente de SMD para malignidad .

> bal.tab(matched_data, un=TRUE, addl = addl, binary = "std", m.threshold = 0.1)

Call
 matchit(formula = formula, data = working_data, method = "nearest", 
    distance = "glm", replace = FALSE, caliper = 0.3, ratio = 4)

Balance Measures
                                      Type Diff.Un Diff.Adj        M.Threshold
distance                          Distance  0.6876   0.0271     Balanced, <0.1
age_at_diagnosis                   Contin. -0.1329   0.0006     Balanced, <0.1
charlson_score                     Contin.  0.3051  -0.0540     Balanced, <0.1
median_wbc_6mo                     Contin. -0.1637  -0.0555     Balanced, <0.1
chemotherapy_Yes                    Binary  0.3002   0.0269     Balanced, <0.1
radiation_Yes                       Binary  0.0898   0.0051     Balanced, <0.1
smoking_Yes                         Binary  0.3671  -0.0147     Balanced, <0.1
alcohol_Yes                         Binary  0.0858   0.1252 Not Balanced, >0.1
myocardial_infarction_Yes           Binary  0.1561  -0.0683     Balanced, <0.1
congestive_heart_failure_Yes        Binary  0.1092   0.0683     Balanced, <0.1
peripheral_vascular_disease_Yes     Binary  0.0389   0.0228     Balanced, <0.1
cerebrovascular_disease_Yes         Binary  0.2247   0.0742     Balanced, <0.1
dementia_Yes                        Binary  0.1254   0.0000     Balanced, <0.1
chronic_pulmonary_disease_Yes       Binary  0.0224  -0.1569 Not Balanced, >0.1
rheumatic_disease_Yes               Binary  0.1258   0.0000     Balanced, <0.1
mild_liver_disease_Yes              Binary  0.2607  -0.1239 Not Balanced, >0.1
diabetes_without_complication_Yes   Binary  0.0565  -0.0661     Balanced, <0.1
diabetes_with_complication_Yes      Binary  0.1254   0.0000     Balanced, <0.1
hemiplegia_or_paraplegia_Yes        Binary -0.0056   0.1430 Not Balanced, >0.1
renal_disease_Yes                   Binary  0.1840  -0.0565     Balanced, <0.1
malignancy_Yes                      Binary -0.0487  -0.0941     Balanced, <0.1
metastatic_cancer_Yes               Binary  0.2997  -0.0485     Balanced, <0.1
hiv_or_aids_Yes                     Binary  0.1581   0.0000     Balanced, <0.1

Balance tally for mean differences
                   count
Balanced, <0.1        19
Not Balanced, >0.1     4

Variable with the greatest mean difference
                      Variable Diff.Adj        M.Threshold
 chronic_pulmonary_disease_Yes  -0.1569 Not Balanced, >0.1

Sample sizes
                     Control Treated
All                   198.        41
Matched (ESS)          83.07      34
Matched (Unweighted)  106.        34
Unmatched              92.         7

Como se ha visto, la DMS de malignidad después del emparejamiento calculado por el paquete cobalto es de 0,0941, que está por debajo del umbral comúnmente aceptado de 0,1 y, por tanto, se considera equilibrado. Sin embargo, CreateTableOne indica una DMS de 0,172, que está por encima del umbral y, por tanto, no está equilibrada. Al observar los datos, la prevalencia de malignidad en el grupo tratado es sólo del 2,9% frente al 6,6% en el grupo no tratado, lo que me hace pensar que la covariable puede no estar equilibrada como sugiere la DMS de CreateTableOne.

Una discrepancia similar se observa en "enfermedad_leve_del_hígado" en el que tras el emparejamiento hay una prevalencia del 2,9% en el grupo tratado frente al 2,8% en el grupo no tratado, lo que da como resultado una DME de 0,007 por CreateTableOne (que indica equilibrio) pero una DME de 0,1239 en cobalto (que indica falta de equilibrio).

  • ¿Qué podría estar causando estas discrepancias y qué paquete es mejor confiar a la hora de evaluar el equilibrio tras el emparejamiento?
  • ¿Me he perdido algo en la interpretación?
  • Cualquier idea o sugerencia será muy apreciada.

2voto

Noah Puntos 85

Hay dos razones por las que estos valores difieren. La razón por la que los valores de precompensación difieren es por la forma en que cobalt y tableone calcular el denominador de la diferencia media estandarizada. tableone utiliza $\sqrt{\frac{s_1^2 + s_0^2}{2}}$ en el denominador de la DMS, mientras que cobalt utiliza $s_1$ en el denominador (donde $s_1$ y $s_0$ son las desviaciones estándar de la covariable en los grupos tratado y de control). Esta opción puede modificarse en cobalt ; se puede establecer s.d.denom = "pooled" para utilizar el tableone versión. cobalt elige el factor de normalización por defecto en función del estimando suministrado a matchit() que en este caso es el TCA, lo que sugiere que el grupo tratado es la población objetivo, por lo que el factor de estandarización debería reflejarlo. Véase mi respuesta aquí para obtener información sobre esta opción. Al final, no importa demasiado y los resultados no suelen diferir a menos que haya un desequilibrio grave en las varianzas de los dos grupos.

La razón por la que los dos resultados difieren después del emparejamiento es que usted no incluyó las ponderaciones del emparejamiento en las estadísticas de equilibrio para tableone . Debido a que usted hizo una coincidencia 4:1 con un calibrador, no todas las unidades tratadas recibieron 4 coincidencias. Algunas recibieron 3, otras 2, otras 1 y otras ninguna. En este caso, las unidades de control emparejadas reciben diferentes pesos dependiendo de cuántas otras unidades de control fueron emparejadas con su unidad tratada. Por ejemplo, si una unidad tratada sólo recibió una unidad de control emparejada (porque todas las demás estaban fuera del calibre o ya habían sido emparejadas), esa unidad de control recibiría un peso de 1, pero si una unidad tratada recibió cuatro unidades de control emparejadas, cada unidad de control emparejada recibiría un peso de 1/4. Las ponderaciones son necesarias para evaluar el equilibrio y para utilizarlas en la estimación del efecto del tratamiento. cobalt extrae automáticamente los pesos del matchit y los incluye en el cálculo de la DMS; tableone no lo hace, a menos que suministre los pesos manualmente utilizando svyCreateTableOne() . Incluso si utiliza svyCreateTableOne() Si no es así, las DMS no se calcularán correctamente porque utilizarán la varianza ponderada en los cálculos, lo cual es inapropiado. Véase mi respuesta aquí para obtener más detalles al respecto.

Debe utilizar cobalt para evaluar el equilibrio. tableone es muy bueno para hacer tablas bonitas, pero no se ha puesto tanto cuidado en asegurarse de que las estadísticas de equilibrio se calculan correctamente y de forma consistente para una variedad de circunstancias porque no es para lo que el paquete fue diseñado, mientras que cobalt fue diseñado específicamente para evaluar el equilibrio después de usar MatchIt y otros paquetes.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X