Hematology is the study of blood, blood-forming organs, and blood diseases. This chapter outlines three fundamental procedures used in the clinical laboratory: the Complete Blood Count (CBC), Hemoglobin estimation using the Sahli method, and Blood Grouping (ABO/Rh).
Modern automated CBC analysis relies primarily on two principles:
A standard CBC includes:
Below is an R simulation showing the distribution of Hemoglobin levels in a healthy population vs. anemic patients.
# Simulating Data
set.seed(123)
healthy_hb <- rnorm(100, mean = 14, sd = 1.5)
anemic_hb <- rnorm(100, mean = 9, sd = 1.5)
df_hb <- data.frame(
Hemoglobin = c(healthy_hb, anemic_hb),
Group = c(rep("Healthy", 100), rep("Anemic", 100))
)
# Plotting the distribution
ggplot(df_hb, aes(x = Hemoglobin, fill = Group)) +
geom_density(alpha = 0.5) +
geom_vline(xintercept = 12, linetype="dashed", color="black") +
labs(title = "Hemoglobin Distribution: Healthy vs Anemic",
subtitle = "Dashed line represents lower limit of normal (approx)",
x = "Hemoglobin (g/dL)",
y = "Density") +
theme_minimal()
While automated analyzers are standard, Sahli’s method remains an important educational tool and a backup method in resource-limited settings.
Hemoglobin is converted into acid hematin by the action of dilute hydrochloric acid (0.1 N HCl). The resulting solution has a brown color. This color is matched against standard brown glass comparators in the Sahli’s comparator box by adding distilled water drop by drop.
Reaction: \[Hb + 0.1 N HCl \rightarrow Acid Hematin (Brown Color)\]
Blood grouping is based on Hemagglutination. * Antigens are present on the surface of RBCs. * Antibodies are present in the antisera (reagents). * When a specific antigen meets its corresponding antibody (e.g., Antigen A + Anti-A), clumping (agglutination) occurs.
The following table illustrates how results are interpreted. We can use R to create a logic function for interpretation.
# Function to determine blood group
determine_blood_type <- function(agg_A, agg_B, agg_D) {
# Determine ABO
abo <- ifelse(agg_A & agg_B, "AB",
ifelse(agg_A & !agg_B, "A",
ifelse(!agg_A & agg_B, "B", "O")))
# Determine Rh
rh <- ifelse(agg_D, "Positive (+)", "Negative (-)")
return(paste(abo, rh))
}
# Create a reference table (Data Frame)
results_table <- expand.grid(Anti_A = c(FALSE, TRUE),
Anti_B = c(FALSE, TRUE),
Anti_D = c(FALSE, TRUE))
# Apply the function to the table
results_table$Result <- mapply(determine_blood_type,
results_table$Anti_A,
results_table$Anti_B,
results_table$Anti_D)
# Display table nicely
kable(results_table,
col.names = c("Agglutination with Anti-A",
"Agglutination with Anti-B",
"Agglutination with Anti-D",
"Blood Group"),
caption = "Table 3.1: Blood Group Interpretation Guide")
| Agglutination with Anti-A | Agglutination with Anti-B | Agglutination with Anti-D | Blood Group |
|---|---|---|---|
| FALSE | FALSE | FALSE | O Negative (-) |
| TRUE | FALSE | FALSE | A Negative (-) |
| FALSE | TRUE | FALSE | B Negative (-) |
| TRUE | TRUE | FALSE | AB Negative (-) |
| FALSE | FALSE | TRUE | O Positive (+) |
| TRUE | FALSE | TRUE | A Positive (+) |
| FALSE | TRUE | TRUE | B Positive (+) |
| TRUE | TRUE | TRUE | AB Positive (+) |
End of Chapter ```
File > New File > R Markdown.