Stents - comparing distributions. See Chapter 3 in Regression and Other Stories.


Load packages

library("rprojroot")
root<-has_file(".ROS-Examples-root")$make_fix_file()

Exercise time

n <- c(104,90)
y_bar_pre <- c(528.0, 490.0)
y_bar_post <- c(556.3, 501.8)
s_pre <- c(178.7, 195.0)
s_post <- c(178.7, 190.9)
interval_width_diff <- c(45.1 - 11.6, 31.3 - (-7.8))
se_diff <- interval_width_diff/(2*qt(.975, n-1))
s_diff <- se_diff*sqrt(n)
rho <- (s_pre^2 + s_post^2 - s_diff^2)/(2*s_pre*s_post)
b <- rho*s_post/s_pre
b <- mean(b)
diff <- function (a) return(a[1] - a[2])
diff_simple <- diff(y_bar_post)
diff_gain <- diff(y_bar_post - y_bar_pre)
diff_regression <- diff(y_bar_post - b*y_bar_pre)
se_simple <- sqrt(s_post^2/n)
se_diff_simple <- sqrt(sum(se_simple^2))
se_gain <- sqrt(s_pre^2/n + s_post^2/n - 2*rho*s_pre*s_post/n)
se_diff_gain <- sqrt(sum(se_gain^2))
se_regression <- sqrt(b^2*s_pre^2/n + s_post^2/n - 2*b*rho*s_pre*s_post/n)
se_diff_regression <- sqrt(sum(se_regression^2))
diffs <- c(diff_simple, diff_gain, diff_regression)
ses <- c(se_diff_simple, se_diff_gain, se_diff_regression)
round(diffs, 1)
[1] 54.5 16.5 21.3
round(ses, 1)
[1] 26.7 13.0 12.5
round(diffs/ses, 1)
[1] 2.0 1.3 1.7
round(2*pnorm(-diffs/ses), 2)
[1] 0.04 0.20 0.09

Bootstrap

z <- (diffs/ses)[3]
print(1-pnorm(1.96 - z))
[1] 0.3981781
print(pnorm(-1.96 - z))
[1] 0.000125159

Treadmill score

n <- c(104,90)
y_bar_pre <- c(4.24, 4.18)
y_bar_post <- c(5.46, 4.28)
s_pre <- c(4.82, 4.65)
s_post <- c(4.79, 4.98)
interval_width_diff <- c(2.07 - 0.37, 1.19 - (-0.99))
se_diff <- interval_width_diff/(2*qt(.975, n-1))
s_diff <- se_diff*sqrt(n)
rho <- (s_pre^2 + s_post^2 - s_diff^2)/(2*s_pre*s_post)
b <- rho*s_post/s_pre
b <- mean(b)
diff <- function (a) return(a[1] - a[2])
diff_simple <- diff(y_bar_post)
diff_gain <- diff(y_bar_post - y_bar_pre)
diff_regression <- diff(y_bar_post - b*y_bar_pre)
se_simple <- sqrt(s_post^2/n)
se_diff_simple <- sqrt(sum(se_simple^2))
se_gain <- sqrt(s_pre^2/n + s_post^2/n - 2*rho*s_pre*s_post/n)
se_diff_gain <- sqrt(sum(se_gain^2))
se_regression <- sqrt(b^2*s_pre^2/n + s_post^2/n - 2*b*rho*s_pre*s_post/n)
se_diff_regression <- sqrt(sum(se_regression^2))
diffs <- c(diff_simple, diff_gain, diff_regression)
ses <- c(se_diff_simple, se_diff_gain, se_diff_regression)
round(diffs, 1)
[1] 1.2 1.1 1.1
round(ses, 1)
[1] 0.7 0.7 0.6
round(diffs/ses, 1)
[1] 1.7 1.6 1.9
round(2*pnorm(-diffs/ses), 2)
[1] 0.09 0.11 0.06

Graph showing distribution shift

par(mar=c(3,3,0,1), mgp=c(1.5,.5,0), tck=-.01)
plot(c(0,1000), c(0, 1.1), yaxs="i", yaxt="n", xlab="Exercise time (seconds)", ylab="", bty="n", type="n")
curve(dnorm(x, 510, 190)/dnorm(0, 0, 190), add=TRUE)
curve(dnorm(x, 530, 190)/dnorm(0, 0, 190), add=TRUE)
text(270, .7, "Controls")
text(755, .7, "Treated")
abline(c(510, 510), c(0, 1))

LS0tCnRpdGxlOiAiUmVncmVzc2lvbiBhbmQgT3RoZXIgU3RvcmllczogU3RlbnRzIgphdXRob3I6ICJBbmRyZXcgR2VsbWFuLCBKZW5uaWZlciBIaWxsLCBBa2kgVmVodGFyaSIKZGF0ZTogImByIGZvcm1hdChTeXMuRGF0ZSgpKWAiCm91dHB1dDoKICBodG1sX2RvY3VtZW50OgogICAgdGhlbWU6IHJlYWRhYmxlCiAgICB0b2M6IHRydWUKICAgIHRvY19kZXB0aDogMgogICAgdG9jX2Zsb2F0OiB0cnVlCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCi0tLQpTdGVudHMgLSBjb21wYXJpbmcgZGlzdHJpYnV0aW9ucy4gU2VlIENoYXB0ZXIgMyBpbgpSZWdyZXNzaW9uIGFuZCBPdGhlciBTdG9yaWVzLgoKLS0tLS0tLS0tLS0tLQoKCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQobWVzc2FnZT1GQUxTRSwgZXJyb3I9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGNvbW1lbnQ9TkEpCiMgc3dpdGNoIHRoaXMgdG8gVFJVRSB0byBzYXZlIGZpZ3VyZXMgaW4gc2VwYXJhdGUgZmlsZXMKc2F2ZWZpZ3MgPC0gRkFMU0UKYGBgCgojIyMjIExvYWQgcGFja2FnZXMKCmBgYHtyIH0KbGlicmFyeSgicnByb2pyb290IikKcm9vdDwtaGFzX2ZpbGUoIi5ST1MtRXhhbXBsZXMtcm9vdCIpJG1ha2VfZml4X2ZpbGUoKQpgYGAKCiMjIyMgRXhlcmNpc2UgdGltZQoKYGBge3IgfQpuIDwtIGMoMTA0LDkwKQp5X2Jhcl9wcmUgPC0gYyg1MjguMCwgNDkwLjApCnlfYmFyX3Bvc3QgPC0gYyg1NTYuMywgNTAxLjgpCnNfcHJlIDwtIGMoMTc4LjcsIDE5NS4wKQpzX3Bvc3QgPC0gYygxNzguNywgMTkwLjkpCmludGVydmFsX3dpZHRoX2RpZmYgPC0gYyg0NS4xIC0gMTEuNiwgMzEuMyAtICgtNy44KSkKc2VfZGlmZiA8LSBpbnRlcnZhbF93aWR0aF9kaWZmLygyKnF0KC45NzUsIG4tMSkpCnNfZGlmZiA8LSBzZV9kaWZmKnNxcnQobikKcmhvIDwtIChzX3ByZV4yICsgc19wb3N0XjIgLSBzX2RpZmZeMikvKDIqc19wcmUqc19wb3N0KQpiIDwtIHJobypzX3Bvc3Qvc19wcmUKYiA8LSBtZWFuKGIpCmRpZmYgPC0gZnVuY3Rpb24gKGEpIHJldHVybihhWzFdIC0gYVsyXSkKZGlmZl9zaW1wbGUgPC0gZGlmZih5X2Jhcl9wb3N0KQpkaWZmX2dhaW4gPC0gZGlmZih5X2Jhcl9wb3N0IC0geV9iYXJfcHJlKQpkaWZmX3JlZ3Jlc3Npb24gPC0gZGlmZih5X2Jhcl9wb3N0IC0gYip5X2Jhcl9wcmUpCnNlX3NpbXBsZSA8LSBzcXJ0KHNfcG9zdF4yL24pCnNlX2RpZmZfc2ltcGxlIDwtIHNxcnQoc3VtKHNlX3NpbXBsZV4yKSkKc2VfZ2FpbiA8LSBzcXJ0KHNfcHJlXjIvbiArIHNfcG9zdF4yL24gLSAyKnJobypzX3ByZSpzX3Bvc3QvbikKc2VfZGlmZl9nYWluIDwtIHNxcnQoc3VtKHNlX2dhaW5eMikpCnNlX3JlZ3Jlc3Npb24gPC0gc3FydChiXjIqc19wcmVeMi9uICsgc19wb3N0XjIvbiAtIDIqYipyaG8qc19wcmUqc19wb3N0L24pCnNlX2RpZmZfcmVncmVzc2lvbiA8LSBzcXJ0KHN1bShzZV9yZWdyZXNzaW9uXjIpKQpkaWZmcyA8LSBjKGRpZmZfc2ltcGxlLCBkaWZmX2dhaW4sIGRpZmZfcmVncmVzc2lvbikKc2VzIDwtIGMoc2VfZGlmZl9zaW1wbGUsIHNlX2RpZmZfZ2Fpbiwgc2VfZGlmZl9yZWdyZXNzaW9uKQpyb3VuZChkaWZmcywgMSkKcm91bmQoc2VzLCAxKQpyb3VuZChkaWZmcy9zZXMsIDEpCnJvdW5kKDIqcG5vcm0oLWRpZmZzL3NlcyksIDIpCmBgYAoKIyMjIyBCb290c3RyYXAKCmBgYHtyIH0KeiA8LSAoZGlmZnMvc2VzKVszXQpwcmludCgxLXBub3JtKDEuOTYgLSB6KSkKcHJpbnQocG5vcm0oLTEuOTYgLSB6KSkKYGBgCgojIyMjIFRyZWFkbWlsbCBzY29yZQoKYGBge3IgfQpuIDwtIGMoMTA0LDkwKQp5X2Jhcl9wcmUgPC0gYyg0LjI0LCA0LjE4KQp5X2Jhcl9wb3N0IDwtIGMoNS40NiwgNC4yOCkKc19wcmUgPC0gYyg0LjgyLCA0LjY1KQpzX3Bvc3QgPC0gYyg0Ljc5LCA0Ljk4KQppbnRlcnZhbF93aWR0aF9kaWZmIDwtIGMoMi4wNyAtIDAuMzcsIDEuMTkgLSAoLTAuOTkpKQpzZV9kaWZmIDwtIGludGVydmFsX3dpZHRoX2RpZmYvKDIqcXQoLjk3NSwgbi0xKSkKc19kaWZmIDwtIHNlX2RpZmYqc3FydChuKQpyaG8gPC0gKHNfcHJlXjIgKyBzX3Bvc3ReMiAtIHNfZGlmZl4yKS8oMipzX3ByZSpzX3Bvc3QpCmIgPC0gcmhvKnNfcG9zdC9zX3ByZQpiIDwtIG1lYW4oYikKZGlmZiA8LSBmdW5jdGlvbiAoYSkgcmV0dXJuKGFbMV0gLSBhWzJdKQpkaWZmX3NpbXBsZSA8LSBkaWZmKHlfYmFyX3Bvc3QpCmRpZmZfZ2FpbiA8LSBkaWZmKHlfYmFyX3Bvc3QgLSB5X2Jhcl9wcmUpCmRpZmZfcmVncmVzc2lvbiA8LSBkaWZmKHlfYmFyX3Bvc3QgLSBiKnlfYmFyX3ByZSkKc2Vfc2ltcGxlIDwtIHNxcnQoc19wb3N0XjIvbikKc2VfZGlmZl9zaW1wbGUgPC0gc3FydChzdW0oc2Vfc2ltcGxlXjIpKQpzZV9nYWluIDwtIHNxcnQoc19wcmVeMi9uICsgc19wb3N0XjIvbiAtIDIqcmhvKnNfcHJlKnNfcG9zdC9uKQpzZV9kaWZmX2dhaW4gPC0gc3FydChzdW0oc2VfZ2Fpbl4yKSkKc2VfcmVncmVzc2lvbiA8LSBzcXJ0KGJeMipzX3ByZV4yL24gKyBzX3Bvc3ReMi9uIC0gMipiKnJobypzX3ByZSpzX3Bvc3QvbikKc2VfZGlmZl9yZWdyZXNzaW9uIDwtIHNxcnQoc3VtKHNlX3JlZ3Jlc3Npb25eMikpCmRpZmZzIDwtIGMoZGlmZl9zaW1wbGUsIGRpZmZfZ2FpbiwgZGlmZl9yZWdyZXNzaW9uKQpzZXMgPC0gYyhzZV9kaWZmX3NpbXBsZSwgc2VfZGlmZl9nYWluLCBzZV9kaWZmX3JlZ3Jlc3Npb24pCnJvdW5kKGRpZmZzLCAxKQpyb3VuZChzZXMsIDEpCnJvdW5kKGRpZmZzL3NlcywgMSkKcm91bmQoMipwbm9ybSgtZGlmZnMvc2VzKSwgMikKYGBgCgojIyMjIEdyYXBoIHNob3dpbmcgZGlzdHJpYnV0aW9uIHNoaWZ0CgpgYGB7ciBldmFsPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQppZiAoc2F2ZWZpZ3MpIHBkZigic3RlbnRzX3NoaWZ0XzEucGRmIiwgaGVpZ2h0PTMsIHdpZHRoPTYpCmBgYApgYGB7ciB9CnBhcihtYXI9YygzLDMsMCwxKSwgbWdwPWMoMS41LC41LDApLCB0Y2s9LS4wMSkKcGxvdChjKDAsMTAwMCksIGMoMCwgMS4xKSwgeWF4cz0iaSIsIHlheHQ9Im4iLCB4bGFiPSJFeGVyY2lzZSB0aW1lIChzZWNvbmRzKSIsIHlsYWI9IiIsIGJ0eT0ibiIsIHR5cGU9Im4iKQpjdXJ2ZShkbm9ybSh4LCA1MTAsIDE5MCkvZG5vcm0oMCwgMCwgMTkwKSwgYWRkPVRSVUUpCmN1cnZlKGRub3JtKHgsIDUzMCwgMTkwKS9kbm9ybSgwLCAwLCAxOTApLCBhZGQ9VFJVRSkKdGV4dCgyNzAsIC43LCAiQ29udHJvbHMiKQp0ZXh0KDc1NSwgLjcsICJUcmVhdGVkIikKYWJsaW5lKGMoNTEwLCA1MTApLCBjKDAsIDEpKQpgYGAKYGBge3IgZXZhbD1GQUxTRSwgaW5jbHVkZT1GQUxTRX0KaWYgKHNhdmVmaWdzKSBkZXYub2ZmKCkKYGBgCgo=