Overview

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:

  1. Cardiac - Cardiac patients taking diuretics
  2. NonCardiac - Other patients taking diuretics
  3. Untreated - Untreated cardiac patients

We will look at how the plasma and WBC K measurements vary between the three groups.

The data source is Leucocyte electrolytes in cardiac and non-cardiac patients receiving diuretics.
Paper PDF

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

Analysis

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.

invisible( # suppress id output
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)")
)

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!

Here is another way of showing the separation of the groups with Boxplots of E_k. Notice there is minimal overlap between the cardiac (both treated and untreated) and non-cardiac groups with no overlap for the 2Q-3Q portions shown by the boxes.

Dashed horizontal lines have been drawn at -92mV and -97mV to illustrate the range of best separation proposed above.

boxplot(E_k ~ Group, data=Kdata, ylab="Membrane Voltage (E_k, mV)")
abline(h=-92, lty=2)
abline(h=-97, lty=2)

Appendix

Display Boxplots of other variables by group. The main thing to notice here is that K_p and K_wbc do not separate the cardiac and non-cardiac groups as well as E_k did. K_ratio is simply a transformation of E_k so it has a similar separation.

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")

File originally created: Wednesday, April 22, 2015
File knitted: Fri Jun 19 14:33:47 2015