In Men
library(epicalc)
use(BP_men)
BP_men_complete <- subset(BP_men, !is.na(Body.Mass.Index))
use(BP_men_complete)
# conduct normal linear least-squares regression with BMI as target and age as predictor
regress.BMI.agem = lm(Body.Mass.Index~Age)
summ(Body.Mass.Index)
obs. mean median s.d. min. max.
1169 28.363 28.247 5.48 14.968 43.929

summ(MeanSBP)
obs. mean median s.d. min. max.
1169 140.445 137.333 18.87 93.333 222.667

# extract residuals from this regression
residuals.BMI.agem = residuals(regress.BMI.agem)
# conduct normal linear least-squares regression with SBP as target and age as predictor
regress.SBP.agem = lm(MeanSBP~Age)
# extract residuals from this regression
residuals.SBP.agem = residuals(regress.SBP.agem)
library(ggplot2)
plotcc <- data.frame(residuals.BMI.agem,residuals.SBP.agem)
ggplot(plotcc,aes(residuals.BMI.agem, residuals.SBP.agem))+
geom_point()+
theme(plot.subtitle = element_text(vjust = 1),
plot.caption = element_text(vjust = 1),
axis.line = element_line(size = 0.5,
linetype = "solid"), panel.grid.major = element_line(colour = "gray98"),
axis.title = element_text(size = 15),
panel.background = element_rect(fill = "gray99",
colour = "white", linetype = "twodash"),
plot.background = element_rect(fill = "white"))+
annotate("text", x=-13, y=80, parse = TRUE,
label="Men",
size=10)+
theme(axis.title = element_text(size = 16), axis.text = element_text(
colour = "gray0"), axis.text.x = element_text(size = 16),
axis.text.y = element_text(size = 15),
plot.title = element_text(size = 16,
face = "bold")) + theme(plot.caption = element_text(size = 14,
face = "italic", colour = "gray13", hjust = 0),
plot.title = element_text(size = 18,
hjust = 0.5)) +labs(title = "Partial Correlation Between BMI and SBP controlling for age ",
x = "Residuals from Regressing BMI on Age",
y = "Residuals from Regressing SBP on Age",
caption = "Abbreviations: BMI, Body Mass Index; SBP, systolic blood pressure.")

# no age adjustment
plot(BP_men_complete$Body.Mass.Index, BP_men_complete$MeanSBP)

# use Spearman correlation coefficient to calculate the partial correlation
partial.correlation = cor(residuals.BMI.agem, residuals.SBP.agem, method = 'spearman')
partial.correlation
[1] 0.1536098
# sample size
n = length(residuals.BMI.agem)
# calculate the test statistic and p-value of the Spearman correlation coefficient
test.statistic = partial.correlation*sqrt((n-3)/(1-partial.correlation^2))
test.statistic
[1] 5.308276
p.value = 2*pt(abs(test.statistic), n-3, lower.tail = F)
p.value
[1] 1.324022e-07
In Women
library(epicalc)
use(BP_women)
BP_women_complete <- subset(BP_women, !is.na(Body.Mass.Index))
use(BP_women_complete)
# conduct normal linear least-squares regression with BMI as target and age as predictor
regress.BMI.age = lm(Body.Mass.Index~Age)
summ(Body.Mass.Index)
obs. mean median s.d. min. max.
1302 29.059 28.541 6.11 15.52 46.125

summ(MeanSBP)
obs. mean median s.d. min. max.
1302 135.434 130.333 23.83 89.333 236

# extract residuals from this regression
residuals.BMI.age = residuals(regress.BMI.age)
# conduct normal linear least-squares regression with SBP as target and age as predictor
regress.SBP.age = lm(MeanSBP~Age)
# extract residuals from this regression
residuals.SBP.age = residuals(regress.SBP.age)
library(ggplot2)
plotcc <- data.frame(residuals.BMI.age,residuals.SBP.age)
ggplot(plotcc,aes(residuals.BMI.age, residuals.SBP.age))+
geom_point()+
theme(plot.subtitle = element_text(vjust = 1),
plot.caption = element_text(vjust = 1),
axis.line = element_line(size = 0.5,
linetype = "solid"), panel.grid.major = element_line(colour = "gray98"),
axis.title = element_text(size = 15),
panel.background = element_rect(fill = "gray99",
colour = "white", linetype = "twodash"),
plot.background = element_rect(fill = "white"))+
annotate("text", x=-13, y=80, parse = TRUE,
label="Women",
size=10)+
theme(axis.title = element_text(size = 16), axis.text = element_text(
colour = "gray0"), axis.text.x = element_text(size = 16),
axis.text.y = element_text(size = 15),
plot.title = element_text(size = 16,
face = "bold")) + theme(plot.caption = element_text(size = 14,
face = "italic", colour = "gray13", hjust = 0),
plot.title = element_text(size = 18,
hjust = 0.5)) +labs(title = "Partial Correlation Between BMI and SBP controlling for age ",
x = "Residuals from Regressing BMI on Age",
y = "Residuals from Regressing SBP on Age",
caption = "Abbreviations: BMI, Body Mass Index; SBP, systolic blood pressure.")

# no age adjustment
plot(BP_women_complete$Body.Mass.Index, BP_women_complete$MeanSBP)

# use Spearman correlation coefficient to calculate the partial correlation
partial.correlation = cor(residuals.BMI.age, residuals.SBP.age, method = 'spearman')
partial.correlation
[1] 0.2254494
# sample size
n = length(residuals.BMI.age)
# calculate the test statistic and p-value of the Spearman correlation coefficient
test.statistic = partial.correlation*sqrt((n-3)/(1-partial.correlation^2))
test.statistic
[1] 8.340288
p.value = 2*pt(abs(test.statistic), n-3, lower.tail = F)
p.value
[1] 1.869277e-16
LS0tCnRpdGxlOiAiUGFydGlhbCBDb3JyZWxhdGlvbiBDb2VmZmljaWVudCBvZiBCTUkgYW5kIHN5c3RvbGljIGJsb29kIHByZXNzdXJlIGJ5IHNleCIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKIyBJbiBNZW4KYGBge3IsIGZpZy5oZWlnaHQ9NywgZmlnLndpZHRoPTh9CmxpYnJhcnkoZXBpY2FsYykKdXNlKEJQX21lbikKQlBfbWVuX2NvbXBsZXRlIDwtIHN1YnNldChCUF9tZW4sICFpcy5uYShCb2R5Lk1hc3MuSW5kZXgpKQp1c2UoQlBfbWVuX2NvbXBsZXRlKQoKCiMgY29uZHVjdCBub3JtYWwgbGluZWFyIGxlYXN0LXNxdWFyZXMgcmVncmVzc2lvbiB3aXRoIEJNSSBhcyB0YXJnZXQgYW5kIGFnZSBhcyBwcmVkaWN0b3IKcmVncmVzcy5CTUkuYWdlbSA9IGxtKEJvZHkuTWFzcy5JbmRleH5BZ2UpCgpzdW1tKEJvZHkuTWFzcy5JbmRleCkKc3VtbShNZWFuU0JQKQoKIyBleHRyYWN0IHJlc2lkdWFscyBmcm9tIHRoaXMgcmVncmVzc2lvbgpyZXNpZHVhbHMuQk1JLmFnZW0gPSByZXNpZHVhbHMocmVncmVzcy5CTUkuYWdlbSkKCgojIGNvbmR1Y3Qgbm9ybWFsIGxpbmVhciBsZWFzdC1zcXVhcmVzIHJlZ3Jlc3Npb24gd2l0aCBTQlAgYXMgdGFyZ2V0IGFuZCBhZ2UgYXMgcHJlZGljdG9yCnJlZ3Jlc3MuU0JQLmFnZW0gPSBsbShNZWFuU0JQfkFnZSkKCgojIGV4dHJhY3QgcmVzaWR1YWxzIGZyb20gdGhpcyByZWdyZXNzaW9uCnJlc2lkdWFscy5TQlAuYWdlbSA9IHJlc2lkdWFscyhyZWdyZXNzLlNCUC5hZ2VtKQoKbGlicmFyeShnZ3Bsb3QyKQpwbG90Y2MgPC0gZGF0YS5mcmFtZShyZXNpZHVhbHMuQk1JLmFnZW0scmVzaWR1YWxzLlNCUC5hZ2VtKQpnZ3Bsb3QocGxvdGNjLGFlcyhyZXNpZHVhbHMuQk1JLmFnZW0sIHJlc2lkdWFscy5TQlAuYWdlbSkpKwogIGdlb21fcG9pbnQoKSsKICB0aGVtZShwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KHZqdXN0ID0gMSksCiAgICAgICAgICAgICAgICAgICAgIHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dCh2anVzdCA9IDEpLAogICAgICAgICAgICAgICAgICAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoc2l6ZSA9IDAuNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmV0eXBlID0gInNvbGlkIiksIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gImdyYXk5OCIpLAogICAgICAgICAgICAgICAgICAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksCiAgICAgICAgICAgICAgICAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJncmF5OTkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG91ciA9ICJ3aGl0ZSIsIGxpbmV0eXBlID0gInR3b2Rhc2giKSwKICAgICAgICAgICAgICAgICAgICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAid2hpdGUiKSkrCiAgYW5ub3RhdGUoInRleHQiLCB4PS0xMywgeT04MCwgcGFyc2UgPSBUUlVFLAogICAgICAgICAgIGxhYmVsPSJNZW4iLAogICAgICAgICAgIHNpemU9MTApKwogIHRoZW1lKGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2KSwgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KAogICAgY29sb3VyID0gImdyYXkwIiksIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNiksIAogICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSwgCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2UgPSAiYm9sZCIpKSArIHRoZW1lKHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQsIAogICAgZmFjZSA9ICJpdGFsaWMiLCBjb2xvdXIgPSAiZ3JheTEzIiwgaGp1c3QgPSAwKSwgCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxOCwgCiAgICAgICAgaGp1c3QgPSAwLjUpKSArbGFicyh0aXRsZSA9ICJQYXJ0aWFsIENvcnJlbGF0aW9uIEJldHdlZW4gQk1JIGFuZCBTQlAgY29udHJvbGxpbmcgZm9yIGFnZSAiLCAKICAgIHggPSAiUmVzaWR1YWxzIGZyb20gUmVncmVzc2luZyBCTUkgb24gQWdlIiwgCiAgICB5ID0gIlJlc2lkdWFscyBmcm9tIFJlZ3Jlc3NpbmcgU0JQIG9uIEFnZSIsIAogICAgY2FwdGlvbiA9ICJBYmJyZXZpYXRpb25zOiBCTUksIEJvZHkgTWFzcyBJbmRleDsgU0JQLCBzeXN0b2xpYyBibG9vZCBwcmVzc3VyZS4iKQoKIyBubyBhZ2UgYWRqdXN0bWVudApwbG90KEJQX21lbl9jb21wbGV0ZSRCb2R5Lk1hc3MuSW5kZXgsIEJQX21lbl9jb21wbGV0ZSRNZWFuU0JQKQoKCgojIHVzZSBTcGVhcm1hbiBjb3JyZWxhdGlvbiBjb2VmZmljaWVudCB0byBjYWxjdWxhdGUgdGhlIHBhcnRpYWwgY29ycmVsYXRpb24KcGFydGlhbC5jb3JyZWxhdGlvbiA9IGNvcihyZXNpZHVhbHMuQk1JLmFnZW0sIHJlc2lkdWFscy5TQlAuYWdlbSwgbWV0aG9kID0gJ3NwZWFybWFuJykKcGFydGlhbC5jb3JyZWxhdGlvbgoKCiMgc2FtcGxlIHNpemUKbiA9IGxlbmd0aChyZXNpZHVhbHMuQk1JLmFnZW0pCgojIGNhbGN1bGF0ZSB0aGUgdGVzdCBzdGF0aXN0aWMgYW5kIHAtdmFsdWUgb2YgdGhlIFNwZWFybWFuIGNvcnJlbGF0aW9uIGNvZWZmaWNpZW50CnRlc3Quc3RhdGlzdGljID0gcGFydGlhbC5jb3JyZWxhdGlvbipzcXJ0KChuLTMpLygxLXBhcnRpYWwuY29ycmVsYXRpb25eMikpCnRlc3Quc3RhdGlzdGljIAoKcC52YWx1ZSA9IDIqcHQoYWJzKHRlc3Quc3RhdGlzdGljKSwgbi0zLCBsb3dlci50YWlsID0gRikKcC52YWx1ZQpgYGAKCgoKIyBJbiBXb21lbgpgYGB7ciBmaWcuaGVpZ2h0PTcsIGZpZy53aWR0aD04fQoKbGlicmFyeShlcGljYWxjKQp1c2UoQlBfd29tZW4pCkJQX3dvbWVuX2NvbXBsZXRlIDwtIHN1YnNldChCUF93b21lbiwgIWlzLm5hKEJvZHkuTWFzcy5JbmRleCkpCnVzZShCUF93b21lbl9jb21wbGV0ZSkKCgojIGNvbmR1Y3Qgbm9ybWFsIGxpbmVhciBsZWFzdC1zcXVhcmVzIHJlZ3Jlc3Npb24gd2l0aCBCTUkgYXMgdGFyZ2V0IGFuZCBhZ2UgYXMgcHJlZGljdG9yCnJlZ3Jlc3MuQk1JLmFnZSA9IGxtKEJvZHkuTWFzcy5JbmRleH5BZ2UpCgpzdW1tKEJvZHkuTWFzcy5JbmRleCkKc3VtbShNZWFuU0JQKQoKIyBleHRyYWN0IHJlc2lkdWFscyBmcm9tIHRoaXMgcmVncmVzc2lvbgpyZXNpZHVhbHMuQk1JLmFnZSA9IHJlc2lkdWFscyhyZWdyZXNzLkJNSS5hZ2UpCgoKIyBjb25kdWN0IG5vcm1hbCBsaW5lYXIgbGVhc3Qtc3F1YXJlcyByZWdyZXNzaW9uIHdpdGggU0JQIGFzIHRhcmdldCBhbmQgYWdlIGFzIHByZWRpY3RvcgpyZWdyZXNzLlNCUC5hZ2UgPSBsbShNZWFuU0JQfkFnZSkKCgojIGV4dHJhY3QgcmVzaWR1YWxzIGZyb20gdGhpcyByZWdyZXNzaW9uCnJlc2lkdWFscy5TQlAuYWdlID0gcmVzaWR1YWxzKHJlZ3Jlc3MuU0JQLmFnZSkKCmxpYnJhcnkoZ2dwbG90MikKcGxvdGNjIDwtIGRhdGEuZnJhbWUocmVzaWR1YWxzLkJNSS5hZ2UscmVzaWR1YWxzLlNCUC5hZ2UpCmdncGxvdChwbG90Y2MsYWVzKHJlc2lkdWFscy5CTUkuYWdlLCByZXNpZHVhbHMuU0JQLmFnZSkpKwogIGdlb21fcG9pbnQoKSsKICB0aGVtZShwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KHZqdXN0ID0gMSksCiAgICAgICAgICAgICAgICAgICAgIHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dCh2anVzdCA9IDEpLAogICAgICAgICAgICAgICAgICAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoc2l6ZSA9IDAuNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmV0eXBlID0gInNvbGlkIiksIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gImdyYXk5OCIpLAogICAgICAgICAgICAgICAgICAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksCiAgICAgICAgICAgICAgICAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJncmF5OTkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG91ciA9ICJ3aGl0ZSIsIGxpbmV0eXBlID0gInR3b2Rhc2giKSwKICAgICAgICAgICAgICAgICAgICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAid2hpdGUiKSkrCiAgYW5ub3RhdGUoInRleHQiLCB4PS0xMywgeT04MCwgcGFyc2UgPSBUUlVFLAogICAgICAgICAgIGxhYmVsPSJXb21lbiIsCiAgICAgICAgICAgc2l6ZT0xMCkrCiAgdGhlbWUoYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTYpLCBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoCiAgICBjb2xvdXIgPSAiZ3JheTAiKSwgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2KSwgCiAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpLCAKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZSA9ICJib2xkIikpICsgdGhlbWUocGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCwgCiAgICBmYWNlID0gIml0YWxpYyIsIGNvbG91ciA9ICJncmF5MTMiLCBoanVzdCA9IDApLCAKICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE4LCAKICAgICAgICBoanVzdCA9IDAuNSkpICtsYWJzKHRpdGxlID0gIlBhcnRpYWwgQ29ycmVsYXRpb24gQmV0d2VlbiBCTUkgYW5kIFNCUCBjb250cm9sbGluZyBmb3IgYWdlICIsIAogICAgeCA9ICJSZXNpZHVhbHMgZnJvbSBSZWdyZXNzaW5nIEJNSSBvbiBBZ2UiLCAKICAgIHkgPSAiUmVzaWR1YWxzIGZyb20gUmVncmVzc2luZyBTQlAgb24gQWdlIiwgCiAgICBjYXB0aW9uID0gIkFiYnJldmlhdGlvbnM6IEJNSSwgQm9keSBNYXNzIEluZGV4OyBTQlAsIHN5c3RvbGljIGJsb29kIHByZXNzdXJlLiIpCgojIG5vIGFnZSBhZGp1c3RtZW50CnBsb3QoQlBfd29tZW5fY29tcGxldGUkQm9keS5NYXNzLkluZGV4LCBCUF93b21lbl9jb21wbGV0ZSRNZWFuU0JQKQoKCgoKIyB1c2UgU3BlYXJtYW4gY29ycmVsYXRpb24gY29lZmZpY2llbnQgdG8gY2FsY3VsYXRlIHRoZSBwYXJ0aWFsIGNvcnJlbGF0aW9uCnBhcnRpYWwuY29ycmVsYXRpb24gPSBjb3IocmVzaWR1YWxzLkJNSS5hZ2UsIHJlc2lkdWFscy5TQlAuYWdlLCBtZXRob2QgPSAnc3BlYXJtYW4nKQpwYXJ0aWFsLmNvcnJlbGF0aW9uCgojIHNhbXBsZSBzaXplCm4gPSBsZW5ndGgocmVzaWR1YWxzLkJNSS5hZ2UpCgojIGNhbGN1bGF0ZSB0aGUgdGVzdCBzdGF0aXN0aWMgYW5kIHAtdmFsdWUgb2YgdGhlIFNwZWFybWFuIGNvcnJlbGF0aW9uIGNvZWZmaWNpZW50CnRlc3Quc3RhdGlzdGljID0gcGFydGlhbC5jb3JyZWxhdGlvbipzcXJ0KChuLTMpLygxLXBhcnRpYWwuY29ycmVsYXRpb25eMikpCnRlc3Quc3RhdGlzdGljIAoKcC52YWx1ZSA9IDIqcHQoYWJzKHRlc3Quc3RhdGlzdGljKSwgbi0zLCBsb3dlci50YWlsID0gRikKcC52YWx1ZQoKYGBgCgo=