Health Observer Systems: A Comparative Review

I looked for every health data system that shares features with my Medical Snapshot proposal , something I’ve been working on since 2007. Such programmes medically measure people over time, store what they find, and don’t necessarily tell the individuals what their own data says. This article is what I learned about 26 systems, spanning nine decades from the Tuskegee Syphilis Study (1932) to Our Future Health (2022). What I Measured and Why This analysis is compares existing systems against a hypothetical system, in a way that is exploratory and hand-waving rather than solid science. ...

17 April 2026 · 11 min · Dan Shearer

Quadrant Analysis: R Source

R source for the quadrant plots in the comparative review . Data is embedded in the script. Save as snapshot-comparison.R and run using Rscript snapshot-comparison.R. # Medical Snapshot System: Quadrant Analysis # # Two scatter plots positioning 26 health data systems on research mechanics vs. ethics axes. # # Supporting exhaustive review at https://shearer.org/research/medical-observer-systems-review.md and # the overview of the Snapshot proposal at https://shearer.org/research/medical-snapshot-system.md # # and various works by Dan Shearer 2007-2026 # # Output: combined snapshot_quadrant.pdf and snapshot_quadrant.png # also snapshot_quadrant_p1.png and _p2.png separated out # # Dependencies: tidyverse, ggrepel, patchwork # install.packages(c("tidyverse", "ggrepel", "patchwork")) options(repos = c(CRAN = "https://cran.r-project.org")) if (!requireNamespace("ggrepel", quietly = TRUE)) install.packages("ggrepel") if (!requireNamespace("patchwork", quietly = TRUE)) install.packages("patchwork") library(tidyverse) library(ggrepel) library(patchwork) # -- 1. Data ------------------------------------------------------------------ # mech : research mechanics score A1-B7 (max 7) # core : core participant ethics D13,F16,C8-C10,D11 (max 6) # voluntary consent + public data release + individual clinical benefit # full : full governance ethics C8-F18 (max 11) # adds fiduciary duty, state exclusion, multi-jurisdictional, payment # category : display group # label : display name (NA = unlabelled in plot) systems <- tribble( ~id, ~label, ~mech, ~core, ~full, ~category, # -- isolated / labelled points --------------------------------------------- # Evidence tiers: A = Chinese govt source, B = Citizen Lab/HRW primary doc, # C = HRW interpretive inference only. ASPI excluded entirely. # "Physicals for All": mechanics (A1-B7) A/B-confirmed; D12+F17 inversions # A-confirmed via Article 16, 2019 Human Genetic Resources Regulations; # D13 inversion C-only (single HRW interview, culturally contested). # MPS database: A2+D13 inversions B-confirmed via Citizen Lab. # Composite scores (core, full) are unchanged from pre-exclusion values # because all inversions count zero regardless of confidence tier. "snapshot", "Medical Snapshot", 7.0, 6.0, 11.0, "Target", "physicals", "Physicals for All", 7.0, 0.0, 0.0, "Coercive", "dodsr", "DoD Serum Repository", 6.0, 2.0, 2.0, "Military", "tuskegee", "Tuskegee", 2.0, 0.0, 0.0, "Coercive", "nz", "NZ Experiment", 1.0, 0.0, 0.0, "Coercive", "ndnad", "NDNAD / CODIS", 3.0, 0.0, 0.0, "Coercive", "decode", "deCODE", 4.0, 0.0, 1.0, "Coercive", "guthrie", "Guthrie Card", 3.5, 2.0, 2.0, "Other", # -- research biobank cluster (exact scores; jitter applied in geom) -------- "epic", NA, 5.5, 2.0, 2.0, "Research", "ckb", NA, 5.0, 2.0, 2.0, "Research", "ukbb", NA, 5.0, 2.0, 2.0, "Research", "taizhou", NA, 5.0, 2.0, 2.0, "Research", "cnhbm", NA, 5.0, 1.0, 1.0, "Research", "framingham", NA, 4.0, 2.0, 2.0, "Research", "whitehall", NA, 4.0, 2.0, 2.0, "Research", "nurses", NA, 4.0, 2.0, 2.0, "Research", "alspac", NA, 4.0, 2.0, 2.0, "Research", "bbjapan", NA, 4.0, 2.0, 2.0, "Research", "allofus", NA, 4.0, 2.0, 2.0, "Research", "genscot", NA, 3.5, 2.0, 2.0, "Research", "estonian", NA, 3.0, 2.0, 2.0, "Research", "finngen", NA, 3.0, 1.0, 2.0, "Research", "ofh", NA, 3.0, 1.0, 1.0, "Research", "majengo", NA, 2.5, 0.5, 0.5, "Other", # -- surveillance ----------------------------------------------------------- "cngb", NA, 4.0, 0.0, 0.0, "Surveillance", "mps", NA, 3.0, 0.0, 0.0, "Surveillance" ) %>% mutate( category = factor(category, levels = c("Target","Research","Coercive", "Military","Surveillance","Other")), labelled = !is.na(label) ) # -- 2. Aesthetics ------------------------------------------------------------ pal <- c( "Target" = "#16a34a", "Research" = "#2563eb", "Coercive" = "#dc2626", "Military" = "#7c3aed", "Surveillance" = "#d97706", "Other" = "#6b7280" ) shp <- c( "Target" = 23, # diamond (filled) "Research" = 21, # circle (filled) "Coercive" = 24, # triangle up (filled) "Military" = 22, # square (filled) "Surveillance" = 25, # triangle down (filled) "Other" = 21 # circle (filled) ) base_theme <- theme_minimal(base_size = 13) + theme( legend.position = "bottom", legend.title = element_blank(), legend.key.size = unit(0.45, "cm"), legend.text = element_text(size = 9), panel.grid.major = element_line(colour = "grey92", linewidth = 0.35), panel.grid.minor = element_blank(), axis.title = element_text(size = 10, colour = "grey40"), axis.text = element_text(size = 9, colour = "grey50"), plot.title = element_text(size = 11, face = "plain", margin = margin(b = 2)), plot.subtitle = element_text(size = 9, colour = "grey40", lineheight = 1.3, margin = margin(b = 6)), plot.margin = margin(6, 12, 6, 6) ) # -- 3. Plot function --------------------------------------------------------- make_quad <- function(dat, y_col, y_max, q_y, y_label, title, subtitle, x_max = 7.8, gap_bracket = FALSE) { y_step <- if (y_max == 6) 1 else 2 p <- ggplot(dat, aes(x = mech, y = .data[[y_col]], colour = category, fill = category, shape = category)) + # Quadrant shading --------------------------------------------------------- annotate("rect", xmin = 3.5, xmax = Inf, ymin = -Inf, ymax = q_y, fill = "#fef2f2", alpha = 0.6) + annotate("rect", xmin = 3.5, xmax = Inf, ymin = q_y, ymax = Inf, fill = "#eff6ff", alpha = 0.28) + # Research-biobank cluster box -------------------------------------------- annotate("rect", xmin = 3.25, xmax = 5.75, ymin = 1.15, ymax = 2.95, fill = "#dbeafe", colour = "#93c5fd", alpha = 0.4, linewidth = 0.45) + annotate("text", x = 4.5, y = 3.15, label = "research biobanks", size = 3, colour = "#1d4ed8", hjust = 0.5) + # Quadrant dividers ------------------------------------------------------- geom_vline(xintercept = 3.5, linetype = "dashed", colour = "grey55", linewidth = 0.45) + geom_hline(yintercept = q_y, linetype = "dashed", colour = "grey55", linewidth = 0.45) + # Points: jitter unlabelled to reveal cluster density -------------------- geom_jitter(data = filter(dat, !labelled), position = position_jitter(width = 0.13, height = 0.08, seed = 42), size = 2.2, alpha = 0.8, stroke = 0.4) + # Points: exact positions for labelled ------------------------------------ geom_point(data = filter(dat, labelled), size = 3.5, stroke = 0.65) + # Labels (ggrepel handles overlap) ---------------------------------------- geom_label_repel( data = filter(dat, labelled), aes(label = label), colour = "grey15", fill = "white", size = 3.5, label.size = 0.3, label.padding = unit(0.20, "lines"), box.padding = unit(0.6, "lines"), point.padding = unit(0.4, "lines"), min.segment.length = 0.2, show.legend = FALSE ) + # Scales ------------------------------------------------------------------ scale_colour_manual(values = pal, drop = FALSE) + scale_fill_manual(values = pal, drop = FALSE) + scale_shape_manual(values = shp, drop = FALSE) + scale_x_continuous(limits = c(-0.2, x_max), breaks = 0:7, expand = expansion(0)) + scale_y_continuous(limits = c(-0.6, y_max + 1.6), breaks = seq(0, y_max, y_step), expand = expansion(0)) + labs(x = "Research mechanics (0 - 7)", y = y_label, title = title, subtitle = subtitle, colour = NULL, fill = NULL, shape = NULL) + base_theme # Bracket showing unclaimed gap (plot 2 only) ------------------------------ if (gap_bracket) { p <- p + annotate("segment", x = 7.3, xend = 7.3, y = 2.95, yend = 10.9, colour = "grey50", linewidth = 0.55, arrow = arrow(ends = "both", type = "open", length = unit(0.12, "cm"))) + annotate("text", x = 7.42, y = 7.0, label = "9 unachieved\nfeatures", size = 3.2, colour = "grey40", hjust = 0, lineheight = 1.2) } p } # -- 4. Build plots ----------------------------------------------------------- p1 <- make_quad( dat = systems, y_col = "core", y_max = 6, q_y = 1, y_label = "Core participant ethics (0 - 6)", title = "Plot 1 -- core participant ethics", subtitle = paste0( "Voluntary consent + public data release + individual clinical benefit.\n", "Research biobanks and DoD Serum Repository reach score 2 by different routes." ) ) p2 <- make_quad( dat = systems, y_col = "full", y_max = 11, q_y = 1, y_label = "Full governance ethics (0 - 11)", title = "Plot 2 -- full governance ethics", subtitle = paste0( "Adds fiduciary duty, state-access exclusion, multi-jurisdictional\n", "architecture, and payment. Research biobanks barely move." ), x_max = 8.1, gap_bracket = TRUE ) # -- 5. Combine and save ------------------------------------------------------ combined <- (p1 | p2) + plot_layout(guides = "collect") & theme(legend.position = "bottom") ggsave("snapshot_quadrant.pdf", combined, width = 18, height = 8, device = cairo_pdf) ggsave("snapshot_quadrant.png", combined, width = 18, height = 8, dpi = 300, bg = "white") ggsave("snapshot_quadrant_p1.pdf", p1, width = 9, height = 8, device = cairo_pdf) ggsave("snapshot_quadrant_p1.png", p1, width = 9, height = 8, dpi = 300, bg = "white") ggsave("snapshot_quadrant_p2.pdf", p2, width = 9, height = 8, device = cairo_pdf) ggsave("snapshot_quadrant_p2.png", p2, width = 9, height = 8, dpi = 300, bg = "white") message("Saved: combined, p1, and p2 as PDF and PNG")

17 April 2026 · 6 min · Dan Shearer

Rule-based Epidemic Modelling and Malaria

The Rule-based Epidemic Modelling (RBEM) Project was funded by the UK Medical Research Council project (grant X/011658/1) to make rule-based modelling methodology more accessible to the infectious disease modelling community. The rule-based approach is instead of writing differential equations, and there can be human as well as technical advantages to this. Our pre-print (draft) paper illustrates how the approach can be applied to classical problems, in addition to our previous work (cited below) on novel problems during pandemic pressures. ...

14 April 2026 · 4 min · Dan Shearer

Medical Snapshot

This is about an Observer-only Medical system, which can be immensely useful to society and governments, hepling understand health and reducing suffering. There are many such systems (I know of at least 26) but they all have a common principle: individuals have their health monitored and are not told the results. So what’s in it for the individual who gives up the right to their own health data? I started thinking about this while working in health systems (the Internet Archive found a version from 2010 ). Over the years since then I have been variously employed in privacy, data sharing/donation, safety in health data movements, causality and risk assessment and my original background of cybersecurity — all of which are combined in observer health systems. When I realised that I have been doing this all along, I made a comparison of 26 existing systems spanning 90 years , complete with a scoring system and graphical analysis. ...

14 April 2026 · 18 min · Dan Shearer

Active Heat Exchanger

The Active Heat Exchanger (AHE) research programme started as an engineering development project, and discovered first an engineering research question and then a health research question. We address the problem of houses making their occupants sick, but we also solve difficult data problems highlighted by the COVID-19 pandemic. Here is where we started. I walked into the Edinburgh Hacklab one day in 2022 and I saw this arrangement of fans and tubes in the window: ...

10 April 2026 · 14 min · Dan Shearer

Radiophobia

I was once delighted to receive a phone call from the Scottish health services for a PET scan ↗ . I had been feeling helpless in the face of a dangerous problem called ‘radiophobia’, and this was a breakthrough, so I was pleased. 💡 Advised not to have a scan due to radiation risk? If you or your children are advised against having a scan due to radiation risks, you may wish to read some of the official and scientific references at the bottom of this article. This isn’t about self-doctoring – evidently not a good idea – but about being informed. It will take a while for practices within the NHS to catch up to current understanding. I am in the fortunate position of working at a university where I have access to people who understand these things. When a medical person told me You don’t need a PET scan, and we limit the number of scans people have, because we don’t want to cause more problems than we find, it seemed a little odd. I made enquiries and learned that radiophobia can cause people to miss out on healthcare. ...

27 March 2026 · 8 min · Dan Shearer

One Health and Epidemiology

In late 2025 the Rule-based Epidemiology Modellings ↗ began to consider the wider context of their work. On the one hand, the techniques of epidemiology save lives at scale, but on the other, emerging diseases and newer health-related epidemics are accelerating. We asked: ”How can a scholar quickly grasp epidemiology basics?” This resulted in my paper discovering epidemiology . Beginning with what epidemiology is not, we see how disease management saved millions of lives from about 1950. Epidemiology matured through the 20th century but stalled in the early 21st. It became clear that epidemiology was in- sufficient, so political consensus was found to expand the scientific scope to One Health. One Health treats ecology, animals and humans as a system of systems across dozens of science fields, using the language of epidemiology. The newly-refocused World Health Organisation is committed to get 2030 global health goals back on track with a One Health approach, with further millions of lives at stake. Many new One Health scientists and scholars are not epidemiologists, and this paper is for them. ...

10 February 2026 · 1 min · Dan Shearer