library(GGally)
library(ggplot2)
library(haven)
library(MatchIt)
library(cobalt)
library(haven)
library(readxl)
library(writexl)
df <- read_excel("DATABASE_for_Vlad.xlsx")
df$robotic<-as.factor(df$robotic)
df$dx<-as.factor(df$dx)
Matching scenario 1 (df_psm1): nearest neighbor 2:1 w/o caliper
df_psm1 <- matchit(robotic ~ sex2f + age + bmi30 + pci + dx,
data = df, method = "nearest", ratio = 2)
summary(df_psm1)
##
## Call:
## matchit(formula = robotic ~ sex2f + age + bmi30 + pci + dx, data = df,
## method = "nearest", ratio = 2)
##
## Summary of Balance for All Data:
## Means Treated Means Control Std. Mean Diff. Var. Ratio eCDF Mean
## distance 0.4008 0.1266 1.2399 1.8586 0.3679
## sex2f 1.6667 1.7324 -0.1347 1.1977 0.0329
## age 65.6333 60.7634 0.3798 1.1839 0.1174
## bmi30 0.6000 0.3803 0.4485 . 0.2197
## pci 5.6000 11.0282 -1.2462 0.1969 0.1586
## dx1 0.6667 0.3239 0.7270 . 0.3427
## dx2 0.0000 0.2676 -0.6653 . 0.2676
## dx8 0.1333 0.2817 -0.4364 . 0.1484
## dx9 0.2000 0.1268 0.1831 . 0.0732
## eCDF Max
## distance 0.6554
## sex2f 0.0657
## age 0.2751
## bmi30 0.2197
## pci 0.3390
## dx1 0.3427
## dx2 0.2676
## dx8 0.1484
## dx9 0.0732
##
## Summary of Balance for Matched Data:
## Means Treated Means Control Std. Mean Diff. Var. Ratio eCDF Mean
## distance 0.4008 0.2673 0.6036 1.8597 0.1054
## sex2f 1.6667 1.8333 -0.3416 1.6571 0.0833
## age 65.6333 62.9267 0.2111 1.1448 0.0675
## bmi30 0.6000 0.4667 0.2722 . 0.1333
## pci 5.6000 7.2333 -0.3750 0.6228 0.0697
## dx1 0.6667 0.5667 0.2121 . 0.1000
## dx2 0.0000 0.0000 0.0000 . 0.0000
## dx8 0.1333 0.2333 -0.2942 . 0.1000
## dx9 0.2000 0.2000 0.0000 . 0.0000
## eCDF Max Std. Pair Dist.
## distance 0.3667 0.6401
## sex2f 0.1667 0.8881
## age 0.2000 1.2188
## bmi30 0.1333 1.0887
## pci 0.2333 1.2321
## dx1 0.1000 1.2021
## dx2 0.0000 0.0000
## dx8 0.1000 0.6864
## dx9 0.0000 0.4000
##
## Sample Sizes:
## Control Treated
## All 71 15
## Matched 30 15
## Unmatched 41 0
## Discarded 0 0
df_psm1
## A matchit object
## - method: 2:1 nearest neighbor matching without replacement
## - distance: Propensity score
## - estimated with logistic regression
## - number of obs.: 86 (original), 45 (matched)
## - target estimand: ATT
## - covariates: sex2f, age, bmi30, pci, dx
summary(df_psm1)$sum.all %>% round(2) # before matching
## Means Treated Means Control Std. Mean Diff. Var. Ratio eCDF Mean
## distance 0.40 0.13 1.24 1.86 0.37
## sex2f 1.67 1.73 -0.13 1.20 0.03
## age 65.63 60.76 0.38 1.18 0.12
## bmi30 0.60 0.38 0.45 NA 0.22
## pci 5.60 11.03 -1.25 0.20 0.16
## dx1 0.67 0.32 0.73 NA 0.34
## dx2 0.00 0.27 -0.67 NA 0.27
## dx8 0.13 0.28 -0.44 NA 0.15
## dx9 0.20 0.13 0.18 NA 0.07
## eCDF Max Std. Pair Dist.
## distance 0.66 NA
## sex2f 0.07 NA
## age 0.28 NA
## bmi30 0.22 NA
## pci 0.34 NA
## dx1 0.34 NA
## dx2 0.27 NA
## dx8 0.15 NA
## dx9 0.07 NA
summary(df_psm1)$sum.matched %>% round(2) # after matching
## Means Treated Means Control Std. Mean Diff. Var. Ratio eCDF Mean
## distance 0.40 0.27 0.60 1.86 0.11
## sex2f 1.67 1.83 -0.34 1.66 0.08
## age 65.63 62.93 0.21 1.14 0.07
## bmi30 0.60 0.47 0.27 NA 0.13
## pci 5.60 7.23 -0.37 0.62 0.07
## dx1 0.67 0.57 0.21 NA 0.10
## dx2 0.00 0.00 0.00 NA 0.00
## dx8 0.13 0.23 -0.29 NA 0.10
## dx9 0.20 0.20 0.00 NA 0.00
## eCDF Max Std. Pair Dist.
## distance 0.37 0.64
## sex2f 0.17 0.89
## age 0.20 1.22
## bmi30 0.13 1.09
## pci 0.23 1.23
## dx1 0.10 1.20
## dx2 0.00 0.00
## dx8 0.10 0.69
## dx9 0.00 0.40
summary(df_psm1)$reduction # change in percent
## NULL
summary(df_psm1)$nn # flowchart
## Control Treated
## All (ESS) 71 15
## All 71 15
## Matched (ESS) 30 15
## Matched 30 15
## Unmatched 41 0
## Discarded 0 0
plot(summary(df_psm1))

bal.plot(df_psm1,
var.name = "sex2f")

bal.plot(df_psm1,
var.name = "age")

bal.plot(df_psm1,
var.name = "bmi30")

bal.plot(df_psm1,
var.name = "pci")

bal.plot(df_psm1,
var.name = "dx")

Matching scenario 2 (df_psm2): nearest neighbor 2:1 caliper 0.4
(loose)
df_psm2 <- matchit(robotic ~ sex2f + age + bmi30 + pci + dx,
data = df, method = "nearest", caliper=0.4, ratio = 2)
summary(df_psm2)
##
## Call:
## matchit(formula = robotic ~ sex2f + age + bmi30 + pci + dx, data = df,
## method = "nearest", caliper = 0.4, ratio = 2)
##
## Summary of Balance for All Data:
## Means Treated Means Control Std. Mean Diff. Var. Ratio eCDF Mean
## distance 0.4008 0.1266 1.2399 1.8586 0.3679
## sex2f 1.6667 1.7324 -0.1347 1.1977 0.0329
## age 65.6333 60.7634 0.3798 1.1839 0.1174
## bmi30 0.6000 0.3803 0.4485 . 0.2197
## pci 5.6000 11.0282 -1.2462 0.1969 0.1586
## dx1 0.6667 0.3239 0.7270 . 0.3427
## dx2 0.0000 0.2676 -0.6653 . 0.2676
## dx8 0.1333 0.2817 -0.4364 . 0.1484
## dx9 0.2000 0.1268 0.1831 . 0.0732
## eCDF Max
## distance 0.6554
## sex2f 0.0657
## age 0.2751
## bmi30 0.2197
## pci 0.3390
## dx1 0.3427
## dx2 0.2676
## dx8 0.1484
## dx9 0.0732
##
## Summary of Balance for Matched Data:
## Means Treated Means Control Std. Mean Diff. Var. Ratio eCDF Mean
## distance 0.3232 0.3164 0.0310 0.9253 0.0217
## sex2f 1.7273 1.7727 -0.0932 1.1756 0.0227
## age 62.5091 60.8091 0.1326 1.0186 0.0618
## bmi30 0.5455 0.5455 0.0000 . 0.0000
## pci 6.5455 5.9545 0.1357 0.7474 0.0496
## dx1 0.6364 0.6364 0.0000 . 0.0000
## dx2 0.0000 0.0000 0.0000 . 0.0000
## dx8 0.1818 0.2273 -0.1337 . 0.0455
## dx9 0.1818 0.1364 0.1136 . 0.0455
## eCDF Max Std. Pair Dist.
## distance 0.1818 0.1116
## sex2f 0.0455 0.6148
## age 0.2273 1.4055
## bmi30 0.0000 0.4000
## pci 0.2273 1.1709
## dx1 0.0000 0.5000
## dx2 0.0000 0.0000
## dx8 0.0455 1.0296
## dx9 0.0455 0.8750
##
## Sample Sizes:
## Control Treated
## All 71. 15
## Matched (ESS) 18.62 11
## Matched 20. 11
## Unmatched 51. 4
## Discarded 0. 0
df_psm2
## A matchit object
## - method: 2:1 nearest neighbor matching without replacement
## - distance: Propensity score [caliper]
## - estimated with logistic regression
## - caliper: <distance> (0.081)
## - number of obs.: 86 (original), 31 (matched)
## - target estimand: ATT
## - covariates: sex2f, age, bmi30, pci, dx
summary(df_psm2)$sum.all %>% round(2) # before matching
## Means Treated Means Control Std. Mean Diff. Var. Ratio eCDF Mean
## distance 0.40 0.13 1.24 1.86 0.37
## sex2f 1.67 1.73 -0.13 1.20 0.03
## age 65.63 60.76 0.38 1.18 0.12
## bmi30 0.60 0.38 0.45 NA 0.22
## pci 5.60 11.03 -1.25 0.20 0.16
## dx1 0.67 0.32 0.73 NA 0.34
## dx2 0.00 0.27 -0.67 NA 0.27
## dx8 0.13 0.28 -0.44 NA 0.15
## dx9 0.20 0.13 0.18 NA 0.07
## eCDF Max Std. Pair Dist.
## distance 0.66 NA
## sex2f 0.07 NA
## age 0.28 NA
## bmi30 0.22 NA
## pci 0.34 NA
## dx1 0.34 NA
## dx2 0.27 NA
## dx8 0.15 NA
## dx9 0.07 NA
summary(df_psm2)$sum.matched %>% round(2) # after matching
## Means Treated Means Control Std. Mean Diff. Var. Ratio eCDF Mean
## distance 0.32 0.32 0.03 0.93 0.02
## sex2f 1.73 1.77 -0.09 1.18 0.02
## age 62.51 60.81 0.13 1.02 0.06
## bmi30 0.55 0.55 0.00 NA 0.00
## pci 6.55 5.95 0.14 0.75 0.05
## dx1 0.64 0.64 0.00 NA 0.00
## dx2 0.00 0.00 0.00 NA 0.00
## dx8 0.18 0.23 -0.13 NA 0.05
## dx9 0.18 0.14 0.11 NA 0.05
## eCDF Max Std. Pair Dist.
## distance 0.18 0.11
## sex2f 0.05 0.61
## age 0.23 1.41
## bmi30 0.00 0.40
## pci 0.23 1.17
## dx1 0.00 0.50
## dx2 0.00 0.00
## dx8 0.05 1.03
## dx9 0.05 0.87
summary(df_psm2)$reduction # change in percent
## NULL
summary(df_psm2)$nn # flowchart
## Control Treated
## All (ESS) 71.00000 15
## All 71.00000 15
## Matched (ESS) 18.61538 11
## Matched 20.00000 11
## Unmatched 51.00000 4
## Discarded 0.00000 0
plot(summary(df_psm2))

bal.plot(df_psm2,
var.name = "sex2f")

bal.plot(df_psm2,
var.name = "age")

bal.plot(df_psm2,
var.name = "bmi30")

bal.plot(df_psm2,
var.name = "pci")

bal.plot(df_psm2,
var.name = "dx")

Matching scenario 3 (df_psm3): nearest neighbor 1:1 w/o caliper
(greedy)
df_psm3 <- matchit(robotic ~ sex2f + age + bmi30 + pci + dx,
data = df, method = "nearest", ratio = 1)
summary(df_psm3)
##
## Call:
## matchit(formula = robotic ~ sex2f + age + bmi30 + pci + dx, data = df,
## method = "nearest", ratio = 1)
##
## Summary of Balance for All Data:
## Means Treated Means Control Std. Mean Diff. Var. Ratio eCDF Mean
## distance 0.4008 0.1266 1.2399 1.8586 0.3679
## sex2f 1.6667 1.7324 -0.1347 1.1977 0.0329
## age 65.6333 60.7634 0.3798 1.1839 0.1174
## bmi30 0.6000 0.3803 0.4485 . 0.2197
## pci 5.6000 11.0282 -1.2462 0.1969 0.1586
## dx1 0.6667 0.3239 0.7270 . 0.3427
## dx2 0.0000 0.2676 -0.6653 . 0.2676
## dx8 0.1333 0.2817 -0.4364 . 0.1484
## dx9 0.2000 0.1268 0.1831 . 0.0732
## eCDF Max
## distance 0.6554
## sex2f 0.0657
## age 0.2751
## bmi30 0.2197
## pci 0.3390
## dx1 0.3427
## dx2 0.2676
## dx8 0.1484
## dx9 0.0732
##
## Summary of Balance for Matched Data:
## Means Treated Means Control Std. Mean Diff. Var. Ratio eCDF Mean
## distance 0.4008 0.3491 0.2340 1.3982 0.0302
## sex2f 1.6667 1.6667 0.0000 1.0000 0.0000
## age 65.6333 61.8467 0.2953 1.2498 0.1060
## bmi30 0.6000 0.5333 0.1361 . 0.0667
## pci 5.6000 6.0000 -0.0918 0.5700 0.0455
## dx1 0.6667 0.7333 -0.1414 . 0.0667
## dx2 0.0000 0.0000 0.0000 . 0.0000
## dx8 0.1333 0.0667 0.1961 . 0.0667
## dx9 0.2000 0.2000 0.0000 . 0.0000
## eCDF Max Std. Pair Dist.
## distance 0.2667 0.3055
## sex2f 0.0000 0.5333
## age 0.2667 1.2032
## bmi30 0.0667 0.9526
## pci 0.2000 1.2551
## dx1 0.0667 0.9899
## dx2 0.0000 0.0000
## dx8 0.0667 0.1961
## dx9 0.0000 0.4000
##
## Sample Sizes:
## Control Treated
## All 71 15
## Matched 15 15
## Unmatched 56 0
## Discarded 0 0
df_psm3
## A matchit object
## - method: 1:1 nearest neighbor matching without replacement
## - distance: Propensity score
## - estimated with logistic regression
## - number of obs.: 86 (original), 30 (matched)
## - target estimand: ATT
## - covariates: sex2f, age, bmi30, pci, dx
summary(df_psm3)$sum.all %>% round(2) # before matching
## Means Treated Means Control Std. Mean Diff. Var. Ratio eCDF Mean
## distance 0.40 0.13 1.24 1.86 0.37
## sex2f 1.67 1.73 -0.13 1.20 0.03
## age 65.63 60.76 0.38 1.18 0.12
## bmi30 0.60 0.38 0.45 NA 0.22
## pci 5.60 11.03 -1.25 0.20 0.16
## dx1 0.67 0.32 0.73 NA 0.34
## dx2 0.00 0.27 -0.67 NA 0.27
## dx8 0.13 0.28 -0.44 NA 0.15
## dx9 0.20 0.13 0.18 NA 0.07
## eCDF Max Std. Pair Dist.
## distance 0.66 NA
## sex2f 0.07 NA
## age 0.28 NA
## bmi30 0.22 NA
## pci 0.34 NA
## dx1 0.34 NA
## dx2 0.27 NA
## dx8 0.15 NA
## dx9 0.07 NA
summary(df_psm3)$sum.matched %>% round(2) # after matching
## Means Treated Means Control Std. Mean Diff. Var. Ratio eCDF Mean
## distance 0.40 0.35 0.23 1.40 0.03
## sex2f 1.67 1.67 0.00 1.00 0.00
## age 65.63 61.85 0.30 1.25 0.11
## bmi30 0.60 0.53 0.14 NA 0.07
## pci 5.60 6.00 -0.09 0.57 0.05
## dx1 0.67 0.73 -0.14 NA 0.07
## dx2 0.00 0.00 0.00 NA 0.00
## dx8 0.13 0.07 0.20 NA 0.07
## dx9 0.20 0.20 0.00 NA 0.00
## eCDF Max Std. Pair Dist.
## distance 0.27 0.31
## sex2f 0.00 0.53
## age 0.27 1.20
## bmi30 0.07 0.95
## pci 0.20 1.26
## dx1 0.07 0.99
## dx2 0.00 0.00
## dx8 0.07 0.20
## dx9 0.00 0.40
summary(df_psm3)$reduction # change in percent
## NULL
summary(df_psm3)$nn # flowchart
## Control Treated
## All (ESS) 71 15
## All 71 15
## Matched (ESS) 15 15
## Matched 15 15
## Unmatched 56 0
## Discarded 0 0
plot(summary(df_psm3))

bal.plot(df_psm3,
var.name = "sex2f")

bal.plot(df_psm3,
var.name = "age")

bal.plot(df_psm3,
var.name = "bmi30")

bal.plot(df_psm3,
var.name = "pci")

bal.plot(df_psm3,
var.name = "dx")

Matching scenario 4 (df_psm4): nearest neighbor 1:1 caliper 0.4
df_psm4 <- matchit(robotic ~ sex2f + age + bmi30 + pci + dx,
data = df, method = "nearest", caliper=0.4, ratio = 1)
summary(df_psm4)
##
## Call:
## matchit(formula = robotic ~ sex2f + age + bmi30 + pci + dx, data = df,
## method = "nearest", caliper = 0.4, ratio = 1)
##
## Summary of Balance for All Data:
## Means Treated Means Control Std. Mean Diff. Var. Ratio eCDF Mean
## distance 0.4008 0.1266 1.2399 1.8586 0.3679
## sex2f 1.6667 1.7324 -0.1347 1.1977 0.0329
## age 65.6333 60.7634 0.3798 1.1839 0.1174
## bmi30 0.6000 0.3803 0.4485 . 0.2197
## pci 5.6000 11.0282 -1.2462 0.1969 0.1586
## dx1 0.6667 0.3239 0.7270 . 0.3427
## dx2 0.0000 0.2676 -0.6653 . 0.2676
## dx8 0.1333 0.2817 -0.4364 . 0.1484
## dx9 0.2000 0.1268 0.1831 . 0.0732
## eCDF Max
## distance 0.6554
## sex2f 0.0657
## age 0.2751
## bmi30 0.2197
## pci 0.3390
## dx1 0.3427
## dx2 0.2676
## dx8 0.1484
## dx9 0.0732
##
## Summary of Balance for Matched Data:
## Means Treated Means Control Std. Mean Diff. Var. Ratio eCDF Mean
## distance 0.3232 0.3253 -0.0093 0.9123 0.0127
## sex2f 1.7273 1.7273 0.0000 1.0000 0.0000
## age 62.5091 63.0182 -0.0397 1.2548 0.0711
## bmi30 0.5455 0.5455 0.0000 . 0.0000
## pci 6.5455 7.0000 -0.1044 0.5821 0.0455
## dx1 0.6364 0.7273 -0.1928 . 0.0909
## dx2 0.0000 0.0000 0.0000 . 0.0000
## dx8 0.1818 0.0909 0.2674 . 0.0909
## dx9 0.1818 0.1818 0.0000 . 0.0000
## eCDF Max Std. Pair Dist.
## distance 0.0909 0.0893
## sex2f 0.0000 0.3636
## age 0.1818 1.3018
## bmi30 0.0000 0.3636
## pci 0.1818 1.2732
## dx1 0.0909 0.9642
## dx2 0.0000 0.0000
## dx8 0.0909 0.2674
## dx9 0.0000 0.3636
##
## Sample Sizes:
## Control Treated
## All 71 15
## Matched 11 11
## Unmatched 60 4
## Discarded 0 0
df_psm4
## A matchit object
## - method: 1:1 nearest neighbor matching without replacement
## - distance: Propensity score [caliper]
## - estimated with logistic regression
## - caliper: <distance> (0.081)
## - number of obs.: 86 (original), 22 (matched)
## - target estimand: ATT
## - covariates: sex2f, age, bmi30, pci, dx
summary(df_psm4)$sum.all %>% round(2) # before matching
## Means Treated Means Control Std. Mean Diff. Var. Ratio eCDF Mean
## distance 0.40 0.13 1.24 1.86 0.37
## sex2f 1.67 1.73 -0.13 1.20 0.03
## age 65.63 60.76 0.38 1.18 0.12
## bmi30 0.60 0.38 0.45 NA 0.22
## pci 5.60 11.03 -1.25 0.20 0.16
## dx1 0.67 0.32 0.73 NA 0.34
## dx2 0.00 0.27 -0.67 NA 0.27
## dx8 0.13 0.28 -0.44 NA 0.15
## dx9 0.20 0.13 0.18 NA 0.07
## eCDF Max Std. Pair Dist.
## distance 0.66 NA
## sex2f 0.07 NA
## age 0.28 NA
## bmi30 0.22 NA
## pci 0.34 NA
## dx1 0.34 NA
## dx2 0.27 NA
## dx8 0.15 NA
## dx9 0.07 NA
summary(df_psm4)$sum.matched %>% round(2) # after matching
## Means Treated Means Control Std. Mean Diff. Var. Ratio eCDF Mean
## distance 0.32 0.33 -0.01 0.91 0.01
## sex2f 1.73 1.73 0.00 1.00 0.00
## age 62.51 63.02 -0.04 1.25 0.07
## bmi30 0.55 0.55 0.00 NA 0.00
## pci 6.55 7.00 -0.10 0.58 0.05
## dx1 0.64 0.73 -0.19 NA 0.09
## dx2 0.00 0.00 0.00 NA 0.00
## dx8 0.18 0.09 0.27 NA 0.09
## dx9 0.18 0.18 0.00 NA 0.00
## eCDF Max Std. Pair Dist.
## distance 0.09 0.09
## sex2f 0.00 0.36
## age 0.18 1.30
## bmi30 0.00 0.36
## pci 0.18 1.27
## dx1 0.09 0.96
## dx2 0.00 0.00
## dx8 0.09 0.27
## dx9 0.00 0.36
summary(df_psm4)$reduction # change in percent
## NULL
summary(df_psm4)$nn # flowchart
## Control Treated
## All (ESS) 71 15
## All 71 15
## Matched (ESS) 11 11
## Matched 11 11
## Unmatched 60 4
## Discarded 0 0
plot(summary(df_psm4))

bal.plot(df_psm4,
var.name = "sex2f")

bal.plot(df_psm4,
var.name = "age")

bal.plot(df_psm4,
var.name = "bmi30")

bal.plot(df_psm4,
var.name = "pci")

bal.plot(df_psm4,
var.name = "dx")

Matching scenario 5 (df_psm5): nearest neighbor 1:1 caliper
0.35
df_psm5 <- matchit(robotic ~ sex2f + age + bmi30 + pci + dx,
data = df, method = "nearest", caliper=0.35, ratio = 1)
summary(df_psm5)
##
## Call:
## matchit(formula = robotic ~ sex2f + age + bmi30 + pci + dx, data = df,
## method = "nearest", caliper = 0.35, ratio = 1)
##
## Summary of Balance for All Data:
## Means Treated Means Control Std. Mean Diff. Var. Ratio eCDF Mean
## distance 0.4008 0.1266 1.2399 1.8586 0.3679
## sex2f 1.6667 1.7324 -0.1347 1.1977 0.0329
## age 65.6333 60.7634 0.3798 1.1839 0.1174
## bmi30 0.6000 0.3803 0.4485 . 0.2197
## pci 5.6000 11.0282 -1.2462 0.1969 0.1586
## dx1 0.6667 0.3239 0.7270 . 0.3427
## dx2 0.0000 0.2676 -0.6653 . 0.2676
## dx8 0.1333 0.2817 -0.4364 . 0.1484
## dx9 0.2000 0.1268 0.1831 . 0.0732
## eCDF Max
## distance 0.6554
## sex2f 0.0657
## age 0.2751
## bmi30 0.2197
## pci 0.3390
## dx1 0.3427
## dx2 0.2676
## dx8 0.1484
## dx9 0.0732
##
## Summary of Balance for Matched Data:
## Means Treated Means Control Std. Mean Diff. Var. Ratio eCDF Mean
## distance 0.3232 0.3253 -0.0093 0.9123 0.0127
## sex2f 1.7273 1.7273 0.0000 1.0000 0.0000
## age 62.5091 63.0182 -0.0397 1.2548 0.0711
## bmi30 0.5455 0.5455 0.0000 . 0.0000
## pci 6.5455 7.0000 -0.1044 0.5821 0.0455
## dx1 0.6364 0.7273 -0.1928 . 0.0909
## dx2 0.0000 0.0000 0.0000 . 0.0000
## dx8 0.1818 0.0909 0.2674 . 0.0909
## dx9 0.1818 0.1818 0.0000 . 0.0000
## eCDF Max Std. Pair Dist.
## distance 0.0909 0.0893
## sex2f 0.0000 0.3636
## age 0.1818 1.3018
## bmi30 0.0000 0.3636
## pci 0.1818 1.2732
## dx1 0.0909 0.9642
## dx2 0.0000 0.0000
## dx8 0.0909 0.2674
## dx9 0.0000 0.3636
##
## Sample Sizes:
## Control Treated
## All 71 15
## Matched 11 11
## Unmatched 60 4
## Discarded 0 0
df_psm5
## A matchit object
## - method: 1:1 nearest neighbor matching without replacement
## - distance: Propensity score [caliper]
## - estimated with logistic regression
## - caliper: <distance> (0.071)
## - number of obs.: 86 (original), 22 (matched)
## - target estimand: ATT
## - covariates: sex2f, age, bmi30, pci, dx
summary(df_psm5)$sum.all %>% round(2) # before matching
## Means Treated Means Control Std. Mean Diff. Var. Ratio eCDF Mean
## distance 0.40 0.13 1.24 1.86 0.37
## sex2f 1.67 1.73 -0.13 1.20 0.03
## age 65.63 60.76 0.38 1.18 0.12
## bmi30 0.60 0.38 0.45 NA 0.22
## pci 5.60 11.03 -1.25 0.20 0.16
## dx1 0.67 0.32 0.73 NA 0.34
## dx2 0.00 0.27 -0.67 NA 0.27
## dx8 0.13 0.28 -0.44 NA 0.15
## dx9 0.20 0.13 0.18 NA 0.07
## eCDF Max Std. Pair Dist.
## distance 0.66 NA
## sex2f 0.07 NA
## age 0.28 NA
## bmi30 0.22 NA
## pci 0.34 NA
## dx1 0.34 NA
## dx2 0.27 NA
## dx8 0.15 NA
## dx9 0.07 NA
summary(df_psm5)$sum.matched %>% round(2) # after matching
## Means Treated Means Control Std. Mean Diff. Var. Ratio eCDF Mean
## distance 0.32 0.33 -0.01 0.91 0.01
## sex2f 1.73 1.73 0.00 1.00 0.00
## age 62.51 63.02 -0.04 1.25 0.07
## bmi30 0.55 0.55 0.00 NA 0.00
## pci 6.55 7.00 -0.10 0.58 0.05
## dx1 0.64 0.73 -0.19 NA 0.09
## dx2 0.00 0.00 0.00 NA 0.00
## dx8 0.18 0.09 0.27 NA 0.09
## dx9 0.18 0.18 0.00 NA 0.00
## eCDF Max Std. Pair Dist.
## distance 0.09 0.09
## sex2f 0.00 0.36
## age 0.18 1.30
## bmi30 0.00 0.36
## pci 0.18 1.27
## dx1 0.09 0.96
## dx2 0.00 0.00
## dx8 0.09 0.27
## dx9 0.00 0.36
summary(df_psm5)$reduction # change in percent
## NULL
summary(df_psm5)$nn # flowchart
## Control Treated
## All (ESS) 71 15
## All 71 15
## Matched (ESS) 11 11
## Matched 11 11
## Unmatched 60 4
## Discarded 0 0
plot(summary(df_psm5))

bal.plot(df_psm5,
var.name = "sex2f")

bal.plot(df_psm5,
var.name = "age")

bal.plot(df_psm5,
var.name = "bmi30")

bal.plot(df_psm5,
var.name = "pci")

bal.plot(df_psm5,
var.name = "dx")

Balances check on Love Plot <3
max_length <- max(length(get.w(df_psm1)), length(get.w(df_psm2)), length(get.w(df_psm3)), length(get.w(df_psm4)), length(get.w(df_psm5)))
weights <- data.frame(
df_psm1 = c(get.w(df_psm1), rep(NA, max_length - length(get.w(df_psm1)))),
df_psm2 = c(get.w(df_psm2), rep(NA, max_length - length(get.w(df_psm2)))),
df_psm3 = c(get.w(df_psm3), rep(NA, max_length - length(get.w(df_psm3)))),
df_psm4 = c(get.w(df_psm4), rep(NA, max_length - length(get.w(df_psm4)))),
df_psm5 = c(get.w(df_psm5), rep(NA, max_length - length(get.w(df_psm5))))
)
bal_tab <- bal.tab(robotic ~ sex2f + age + bmi30 + pci + dx,
data = df,
weights = weights,
method = "matching",
binary = "std")
## Note: `s.d.denom` not specified; assuming "treated" for df_psm1, "pooled" for
## df_psm2, "treated" for df_psm3, "pooled" for df_psm4, and "pooled" for df_psm5.
love.plot(bal_tab,
shapes = c("square", "circle", "triangle", "diamond", "star"),
line=TRUE,
threshold = 0.3) +
scale_color_hue()
## Warning: The argument to `shape` must be 6 valid shapes. See `?love.plot` for more information.
## Using default shapes instead.
## Warning: Unadjusted values are missing. This can occur when `un = FALSE` and
## `quick = TRUE` in the original call to `bal.tab()`.
## Scale for colour is already present.
## Adding another scale for colour, which will replace the existing scale.

Exporting all
psm_list <- list(df_psm1, df_psm2, df_psm3, df_psm4, df_psm5)
file_names <- c('df_psm1.xlsx', 'df_psm2.xlsx', 'df_psm3.xlsx', 'df_psm4.xlsx', 'df_psm5.xlsx')
for (i in seq_along(psm_list)) {
df_matched <- match.data(psm_list[[i]], data = df)
cat("For", file_names[i], ":\n")
cat("robotic == 1:", nrow(df_matched[df_matched$robotic == 1,]), "\n")
cat("robotic == 0:", nrow(df_matched[df_matched$robotic == 0,]), "\n")
cat("Dimensions of matched data:", dim(df_matched), "\n\n")
write_xlsx(df_matched, file_names[i])
}
## For df_psm1.xlsx :
## robotic == 1: 15
## robotic == 0: 30
## Dimensions of matched data: 45 23
##
## For df_psm2.xlsx :
## robotic == 1: 11
## robotic == 0: 20
## Dimensions of matched data: 31 23
##
## For df_psm3.xlsx :
## robotic == 1: 15
## robotic == 0: 15
## Dimensions of matched data: 30 23
##
## For df_psm4.xlsx :
## robotic == 1: 11
## robotic == 0: 11
## Dimensions of matched data: 22 23
##
## For df_psm5.xlsx :
## robotic == 1: 11
## robotic == 0: 11
## Dimensions of matched data: 22 23