Here is a dataset containing measurements of both plasma and WBC Potassium. While not the same as RBC K, I think the same basic membrane voltage concepts apply. This gives an idea of what might be done with the Gubbio Study RBC and serum K dataset.
It contains 33 subjects in three groups: Cardiac patients taking diuretics, other patients taking diuretics, and untreated cardiac patients.
The data source is Leucocyte electrolytes in cardiac and non-cardiac patients receiving diuretics.
Some additional information on RBC and WBC K measurements:
A method for simultaneously estimating plasma, erythrocyte, and leukocyte sodium, potassium, and magnesium: reference values and considerations from biological variation data
First load the data from an Excel spreadsheet saved as CSV.
Kdata <- read.csv("Lancet1974.csv")
kable(Kdata, row.names=FALSE)
| Group | Patient_number | K_p | K_wbc | K_ratio | E_k | Notes |
|---|---|---|---|---|---|---|
| Cardiac | 1 | 4.6 | 116.0 | 25.2 | -87.1 | Leucocyte electrolytes in cardiac and non-cardiac patients receiving diuretics |
| Cardiac | 2 | 4.0 | 142.0 | 35.5 | -96.4 | http://www.thelancet.com/journals/lancet/article/PIIS0140673674930013/abstract |
| Cardiac | 3 | 5.1 | 103.0 | 20.2 | -81.1 | |
| Cardiac | 4 | 4.6 | 122.0 | 26.5 | -88.5 | |
| Cardiac | 5 | 4.7 | 123.0 | 26.2 | -88.1 | |
| Cardiac | 6 | 4.5 | 95.6 | 21.2 | -82.5 | |
| Cardiac | 7 | 5.1 | 100.0 | 19.6 | -80.4 | |
| Cardiac | 8 | 4.5 | 114.0 | 25.3 | -87.3 | |
| Cardiac | 9 | 3.9 | 111.0 | 28.5 | -90.4 | |
| Cardiac | 10 | 4.6 | 90.0 | 19.6 | -80.3 | |
| Cardiac | 11 | 4.7 | 126.0 | 26.8 | -88.8 | |
| Cardiac | 12 | 5.2 | 126.0 | 24.2 | -86.1 | |
| Cardiac | 13 | 4.3 | 140.0 | 32.6 | -94.0 | |
| Cardiac | 14 | 5.0 | 116.0 | 23.2 | -84.9 | |
| Cardiac | 15 | 3.9 | 115.0 | 29.5 | -91.4 | |
| Cardiac | 16 | 4.7 | 79.4 | 16.9 | -76.3 | Two sickest |
| Cardiac | 17 | 3.5 | 65.8 | 18.8 | -79.2 | Two sickest |
| Cardiac | 18 | 4.3 | 154.0 | 35.8 | -96.6 | |
| NonCardiac | 19 | 3.5 | 137.0 | 39.1 | -99.0 | |
| NonCardiac | 20 | 3.9 | 128.0 | 32.8 | -94.3 | |
| NonCardiac | 21 | 3.0 | 129.0 | 43.0 | -101.6 | |
| NonCardiac | 22 | 4.3 | 132.0 | 30.7 | -92.5 | |
| NonCardiac | 23 | 4.0 | 131.0 | 32.8 | -94.2 | |
| NonCardiac | 24 | 3.0 | 190.0 | 63.3 | -112.0 | |
| NonCardiac | 25 | 2.8 | 110.0 | 39.3 | -99.1 | |
| NonCardiac | 26 | 3.6 | 135.0 | 37.5 | -97.9 | |
| NonCardiac | 27 | 2.8 | 149.0 | 53.2 | -107.3 | |
| NonCardiac | 28 | 3.8 | 143.0 | 37.6 | -98.0 | |
| Untreated | 29 | 4.9 | 120.0 | 24.5 | -86.4 | |
| Untreated | 30 | 4.7 | 123.0 | 26.2 | -88.1 | |
| Untreated | 31 | 4.4 | 130.0 | 29.5 | -91.4 | |
| Untreated | 32 | 3.2 | 108.0 | 33.8 | -95.0 | |
| Untreated | 33 | 3.8 | 97.9 | 25.8 | -87.7 |
Display the three groups of subjects in a scatterplot.
scatterplot(K_p ~ K_wbc | Group, data=Kdata, smooth=FALSE, reg.line=FALSE,
id.n=nrow(Kdata), xlab="WBC K (mEq/L)", ylab="Plasma K (mEq/L)")
## 1 19 29 2 20 30 3 21 31 4 22 32 5 23 33 6 24 7 25 8 26 9 27 10 28
## 1 1 1 2 2 2 3 3 3 4 4 4 5 5 5 6 6 7 7 8 8 9 9 10 10
## 11 12 13 14 15 16 17 18
## 11 12 13 14 15 16 17 18
This plot is interesting because the groups separate the most cleanly using a diagonal line from lower left to upper right (i.e. roughly equivalent to a constant membrane voltage).
The diuretic treated and untreated cardiac patients look like they belong in one group (though the treated subjects appear “worse”, here more dysaerobic) with the non-cardiac diuretic subjects in a separate group to the lower right (more anaerobic).
Although this is not a complete separation (i.e. there is overlap) I find the plot suggestive.
This can also be seen to some extent in the membrane voltage boxplot below, but I think this scatterplot shows things more clearly.
Here is another variant of the scatterplot showing membrane voltage contour lines.
K_p <- seq(2.7, 5.4, 0.1)
K_wbc <- seq(60, 195, 5)
grd <- expand.grid(K_wbc, K_p)
colnames(grd) <- c("K_wbc", "K_p")
grd$E_k <- -27 * log(grd$K_wbc / grd$K_p) # mV
contourplot(E_k ~ K_wbc * K_p, grd, cuts=10,
main="Resting Membrane Potential Due to Potassium (mV)",
xlab="WBC K (mEq/L)", ylab="Plasma K (mEq/L)",
xlim=c(64,195), ylim=c(2.7,5.3),
panel = function(...) {
panel.contourplot(...)
panel.abline(h=4.2,lty=2)
panel.abline(v=128,lty=2)
},
colorkey = FALSE, region = TRUE)
trellis.focus("panel", 1, 1, highlight=FALSE)
invisible(lpoints(Kdata$K_wbc, Kdata$K_p, pch=19, col=Kdata$Group))
ltext(Kdata$K_wbc, Kdata$K_p, labels=Kdata$Patient_number, adj=c(0,0))
trellis.unfocus()
Notice how a membrane voltage of between -92 and -97 mV comes close to separating the groups as described above.
Also notice how the two subjects described in the paper as the sickest (16 and 17) have the most depolarized membrane voltages!
Display Boxplots of variables by group.
boxplot(K_p ~ Group, data=Kdata, ylab="Plasma K (mEq/L)")
boxplot(K_wbc ~ Group, data=Kdata, ylab="WBC K (mEq/L)")
boxplot(K_ratio ~ Group, data=Kdata, ylab="WBC/Plasma K Ratio")
boxplot(E_k ~ Group, data=Kdata, ylab="Membrane Voltage (E_k, mV)")