load(file="gee-main-interaction-models.RData")

Model summary for CBT-Time 2-way interaction:

summary(PCSMKD_CBT_interactions)
            Estimates Model SE Robust SE    wald       p
(Intercept)  4.329000  0.04344  0.047380 91.3600 0.00000
cAGE         0.015270  0.01727  0.022710  0.6723 0.50140
cBLCGSMD     0.006982  0.00206  0.002979  2.3440 0.01910
MI1          0.089610  0.03805  0.046750  1.9170 0.05526
CBT1        -0.023990  0.05322  0.052940 -0.4532 0.65040
TIME1        0.063770  0.05641  0.034260  1.8610 0.06270
CBT1:TIME1  -0.096820  0.07631  0.049260 -1.9660 0.04935

 Estimated Correlation Parameter:  0 
 Correlation Structure:  independence 
 Est. Scale Parameter:  0.1836 

 Number of GEE iterations: 2 
 Number of Clusters:  273    Maximum Cluster Size:  2 
 Number of observations with nonzero weight:  516 

Let’s start by extracting all the coefficients

beta_coefs <- (summary(PCSMKD_CBT_interactions))$beta
beta_coefs <- lapply(beta_coefs, function(x){round(exp(x), 5)})
names(beta_coefs) <- summary(PCSMKD_CBT_interactions)$coefnames

beta_coefs
$`(Intercept)`
[1] 75.85613

$cAGE
[1] 1.01538

$cBLCGSMD
[1] 1.00701

$MI1
[1] 1.09375

$CBT1
[1] 0.97629

$TIME1
[1] 1.06584

$`CBT1:TIME1`
[1] 0.90772

Lay out the two-panel interaction plot:

beta_coefs["(Intercept)"]
$`(Intercept)`
[1] 75.85613
#Panel 1: CBT=0
panel1_p1 <- as.numeric(beta_coefs["(Intercept)"])
panel1_p2 <- as.numeric(beta_coefs["(Intercept)"]) + as.numeric(beta_coefs["TIME1"]) 
panel1_p3 <- as.numeric(beta_coefs["(Intercept)"]) + as.numeric(beta_coefs["MI1"]) 
panel1_p4 <- as.numeric(beta_coefs["(Intercept)"]) + as.numeric(beta_coefs["MI1"]) + as.numeric(beta_coefs["TIME1"])
  
#Panel 2: CBT=1
panel2_p1 <- panel1_p1 + as.numeric(beta_coefs["CBT1"])
panel2_p2 <- panel1_p2 + as.numeric(beta_coefs["CBT1"])
panel2_p3 <- panel1_p3 + as.numeric(beta_coefs["CBT1"])
panel2_p4 <- panel1_p4 + as.numeric(beta_coefs["CBT1"])

panel1_slope_l1 <- (panel1_p2-panel1_p1)/(1-0)
panel1_slope_l2 <- (panel1_p4-panel1_p3)/(1-0)

panel1_int_l1 = panel1_p1 - panel1_slope_l1*0
panel1_int_l2 = panel1_p3 - panel1_slope_l2*0
  
#Visualize Panel 1: CBT=0
plot(x=0, y=panel1_p1, type="p", xlab="Time", ylab = "Model Coefficients",
    xaxt="n", yaxt="n", xlim = c(-0.2, 1.2), ylim = c(75, 80), main="CBT=0")
axis(1, at = c(0, 1), labels=c("0", "1"), tick=TRUE)
points(x=1, y=panel1_p2)
points(x=0, y=panel1_p3)
points(x=1, y=panel1_p4)
abline(a=panel1_int_l1, b=panel1_slope_l1)
abline(a=panel1_int_l2, b=panel1_slope_l2)


panel2_slope_l1 <- (panel2_p2-panel2_p1)/(1-0)
panel2_slope_l2 <- (panel2_p4-panel2_p3)/(1-0)

panel2_int_l1 = panel2_p1 - panel2_slope_l1*0
panel2_int_l2 = panel2_p3 - panel2_slope_l2*0

#Visualize Panel 2: CBT=1
plot(x=0, y=panel2_p1, type="p", xlab="Time", ylab = "Model Coefficients",
    xaxt="n", yaxt="n", xlim = c(-0.2, 1.2), ylim = c(75, 80), main="CBT=1")

axis(1, at = c(0, 1), labels=c("0", "1"), tick=TRUE)

points(x=1, y=panel2_p2)
points(x=0, y=panel2_p3)
points(x=1, y=panel2_p4)

abline(a=panel2_int_l1, b=panel2_slope_l1)
abline(a=panel2_int_l2, b=panel2_slope_l2)

LS0tCnRpdGxlOiAiVHdvLVdheSBJbnRlcmFjdGlvbiBwbG90cyBmcm9tIENCVC1USU1FIE1vZGVsIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgoKYGBge3J9CmxvYWQoZmlsZT0iZ2VlLW1haW4taW50ZXJhY3Rpb24tbW9kZWxzLlJEYXRhIikKYGBgCgpNb2RlbCBzdW1tYXJ5IGZvciBDQlQtVGltZSAyLXdheSBpbnRlcmFjdGlvbjoKYGBge3J9CnN1bW1hcnkoUENTTUtEX0NCVF9pbnRlcmFjdGlvbnMpCmBgYApMZXQncyBzdGFydCBieSBleHRyYWN0aW5nIGFsbCB0aGUgY29lZmZpY2llbnRzCgpgYGB7cn0KYmV0YV9jb2VmcyA8LSAoc3VtbWFyeShQQ1NNS0RfQ0JUX2ludGVyYWN0aW9ucykpJGJldGEKYmV0YV9jb2VmcyA8LSBsYXBwbHkoYmV0YV9jb2VmcywgZnVuY3Rpb24oeCl7cm91bmQoZXhwKHgpLCA1KX0pCm5hbWVzKGJldGFfY29lZnMpIDwtIHN1bW1hcnkoUENTTUtEX0NCVF9pbnRlcmFjdGlvbnMpJGNvZWZuYW1lcwoKYmV0YV9jb2VmcwpgYGAKCkxheSBvdXQgdGhlIHR3by1wYW5lbCBpbnRlcmFjdGlvbiBwbG90OgoKLSBQYW5lbCAxOiBDQlQgPSAwIChpLmUuLCBOaWNBKQoKICBGb3IgZ3JvdXAgcmVjZWl2aW5nIE5pY0E6CiAgCiAgICAtIFBsb3QgcDEgPSAlIHNtb2tpbmcgZGF5cyBjb2VmZmljaWVudCByZXBvcnRlZCBhdCB0aW1lIDAgZm9yIHBlcnNvbnMgcmVjZWl2aW5nIFJUIChNST0wKQogICAgLSBQbG90IHAyID0gJSBzbW9raW5nIGRheXMgY29lZmZpY2llbnQgcmVwb3J0ZWQgYXQgdGltZSAxIGZvciBwZXJzb25zIHJlY2VpdmluZyBSVCAoTUk9MCkKICAgIC0gQ29ubmVjdCAocDEsIHAyKSBieSBhIHN0cmFpZ2h0IGxpbmUKICAgIAogICAgLSBQbG90IHAzID0gJSBzbW9raW5nIGRheXMgY29lZmZpY2llbnQgcmVwb3J0ZWQgYXQgdGltZSAwIGZvciBwZXJzb25zIHJlY2VpdmluZyBNSQogICAgLSBQbG90IHA0ID0gJSBzbW9raW5nIGRheXMgY29lZmZpY2llbnQgcmVwb3J0ZWQgYXQgdGltZSAxIGZvciBwZXJzb25zIHJlY2VpdmluZyBNSQogICAgLSBDb25uZWN0IChwMywgcDQpIGJ5IGEgc3RyYWlnaHQgbGluZQogIAotIFBhbmVsIDI6IENCVCA9IDEgCgogIEZvciBncm91cCByZWNlaXZpbmcgQ0JUOgogICAgLSBEZWZpbmUgcG9pbnRzIHAxLCBwMiwgcDMsIHA0IGFuZCBjb25uZWN0IHRoZW0gYXMgZGVzY3JpYmVkIGFib3ZlLiAKCgoKYGBge3J9CmJldGFfY29lZnNbIihJbnRlcmNlcHQpIl0KCiNQYW5lbCAxOiBDQlQ9MApwYW5lbDFfcDEgPC0gYXMubnVtZXJpYyhiZXRhX2NvZWZzWyIoSW50ZXJjZXB0KSJdKQpwYW5lbDFfcDIgPC0gYXMubnVtZXJpYyhiZXRhX2NvZWZzWyIoSW50ZXJjZXB0KSJdKSArIGFzLm51bWVyaWMoYmV0YV9jb2Vmc1siVElNRTEiXSkgCnBhbmVsMV9wMyA8LSBhcy5udW1lcmljKGJldGFfY29lZnNbIihJbnRlcmNlcHQpIl0pICsgYXMubnVtZXJpYyhiZXRhX2NvZWZzWyJNSTEiXSkgCnBhbmVsMV9wNCA8LSBhcy5udW1lcmljKGJldGFfY29lZnNbIihJbnRlcmNlcHQpIl0pICsgYXMubnVtZXJpYyhiZXRhX2NvZWZzWyJNSTEiXSkgKyBhcy5udW1lcmljKGJldGFfY29lZnNbIlRJTUUxIl0pCiAgCiNQYW5lbCAyOiBDQlQ9MQpwYW5lbDJfcDEgPC0gcGFuZWwxX3AxICsgYXMubnVtZXJpYyhiZXRhX2NvZWZzWyJDQlQxIl0pCnBhbmVsMl9wMiA8LSBwYW5lbDFfcDIgKyBhcy5udW1lcmljKGJldGFfY29lZnNbIkNCVDEiXSkKcGFuZWwyX3AzIDwtIHBhbmVsMV9wMyArIGFzLm51bWVyaWMoYmV0YV9jb2Vmc1siQ0JUMSJdKQpwYW5lbDJfcDQgPC0gcGFuZWwxX3A0ICsgYXMubnVtZXJpYyhiZXRhX2NvZWZzWyJDQlQxIl0pCmBgYAoKYGBge3J9CgpwYW5lbDFfc2xvcGVfbDEgPC0gKHBhbmVsMV9wMi1wYW5lbDFfcDEpLygxLTApCnBhbmVsMV9zbG9wZV9sMiA8LSAocGFuZWwxX3A0LXBhbmVsMV9wMykvKDEtMCkKCnBhbmVsMV9pbnRfbDEgPSBwYW5lbDFfcDEgLSBwYW5lbDFfc2xvcGVfbDEqMApwYW5lbDFfaW50X2wyID0gcGFuZWwxX3AzIC0gcGFuZWwxX3Nsb3BlX2wyKjAKICAKI1Zpc3VhbGl6ZSBQYW5lbCAxOiBDQlQ9MApwbG90KHg9MCwgeT1wYW5lbDFfcDEsIHR5cGU9InAiLCB4bGFiPSJUaW1lIiwgeWxhYiA9ICJNb2RlbCBDb2VmZmljaWVudHMiLAogICAgeGF4dD0ibiIsIHlheHQ9Im4iLCB4bGltID0gYygtMC4yLCAxLjIpLCB5bGltID0gYyg3NSwgODApLCBtYWluPSJDQlQ9MCIpCmF4aXMoMSwgYXQgPSBjKDAsIDEpLCBsYWJlbHM9YygiMCIsICIxIiksIHRpY2s9VFJVRSkKcG9pbnRzKHg9MSwgeT1wYW5lbDFfcDIpCnBvaW50cyh4PTAsIHk9cGFuZWwxX3AzKQpwb2ludHMoeD0xLCB5PXBhbmVsMV9wNCkKYWJsaW5lKGE9cGFuZWwxX2ludF9sMSwgYj1wYW5lbDFfc2xvcGVfbDEpCmFibGluZShhPXBhbmVsMV9pbnRfbDIsIGI9cGFuZWwxX3Nsb3BlX2wyKQpgYGAKCmBgYHtyfQoKcGFuZWwyX3Nsb3BlX2wxIDwtIChwYW5lbDJfcDItcGFuZWwyX3AxKS8oMS0wKQpwYW5lbDJfc2xvcGVfbDIgPC0gKHBhbmVsMl9wNC1wYW5lbDJfcDMpLygxLTApCgpwYW5lbDJfaW50X2wxID0gcGFuZWwyX3AxIC0gcGFuZWwyX3Nsb3BlX2wxKjAKcGFuZWwyX2ludF9sMiA9IHBhbmVsMl9wMyAtIHBhbmVsMl9zbG9wZV9sMiowCgojVmlzdWFsaXplIFBhbmVsIDI6IENCVD0xCnBsb3QoeD0wLCB5PXBhbmVsMl9wMSwgdHlwZT0icCIsIHhsYWI9IlRpbWUiLCB5bGFiID0gIk1vZGVsIENvZWZmaWNpZW50cyIsCiAgICB4YXh0PSJuIiwgeWF4dD0ibiIsIHhsaW0gPSBjKC0wLjIsIDEuMiksIHlsaW0gPSBjKDc1LCA4MCksIG1haW49IkNCVD0xIikKCmF4aXMoMSwgYXQgPSBjKDAsIDEpLCBsYWJlbHM9YygiMCIsICIxIiksIHRpY2s9VFJVRSkKCnBvaW50cyh4PTEsIHk9cGFuZWwyX3AyKQpwb2ludHMoeD0wLCB5PXBhbmVsMl9wMykKcG9pbnRzKHg9MSwgeT1wYW5lbDJfcDQpCgphYmxpbmUoYT1wYW5lbDJfaW50X2wxLCBiPXBhbmVsMl9zbG9wZV9sMSkKYWJsaW5lKGE9cGFuZWwyX2ludF9sMiwgYj1wYW5lbDJfc2xvcGVfbDIpCgpgYGA=