A. Setting up the file for data analyses

Load relevant packages

library(rio)
library(haven)
library(survival)
library(survminer)
library(tidyverse)
library(gtsummary)

Upload files

setwd("D:/OneDrive - Johns Hopkins/Desktop/Bloomberg School of Public Health/AMDAC/Datasets/CKiD")
ckdtoevent <- read.table("ckdtoevent.dat", na.strings = ".")
names(ckdtoevent) <- c("id", "male1female0", "race", "lbw", "premature",
    "sga", "icu", "Glomdx1NG0", "AgeAtCKD", "AgeAtStudyEntry",
    "gfr", "creatinine", "cystatin", "PrCrRatio", "anemia", "income",
    "MaternalEDU", "SBPpercentile", "DBPpercentile", "Heightpercentile",
    "Weightpercentile", "BMIpercentile", "QofLbyParent", "QofLbyChild",
    "IQ", "StudyEntrytoRRTorExit", "Trans2Dial1noRRT0atExit")
jointfromckd <- read.table("jointfromckd.dat", na.strings = ".")
names(jointfromckd) <- c("YearsFromCKD", "YearsFromBaseline",
    "gfr", "creatinine", "cystatin", "PrCrRatio", "anemia", "income",
    "SBPpercentile", "DBPpercentile", "Heightpercentile", "Weightpercentile",
    "BMIpercentile", "YearsFromCKDTransition", "YearsFromBaselineTransition",
    "RRTstatusAtTransition", "VisitAtTransition", "id", "AgeAtCKD",
    "male1female0", "race", "lbw", "premature", "sga", "icu",
    "Glomdx1NG0")

Defining hypertension

(Clinical Practice Guideline for Screening and Management of High Blood Pressure in Children and Adolescents)

Diagnosis Definition
Normotensive SBP and DBP values <90th percentile (on the basis of age, sex, and height percentiles)
Prehypertensive SBP and/or DBP ≥90th percentile and <95th percentile (on the basis of age, sex, and height tables)
Hypertensive SBP and/or DBP ≥95th percentile (on the basis of age, sex, and height percentiles)

Defining patterns

Diagnosis Definition
Pattern 1 Remain pre-htn/htn from baseline to study end
Pattern 2 Normortensive at baseline, but pre- or hypertensive at study end
Pattern 3 Pre- or hypertensive at baseline, then become normal at study end
Pattern 4 Others

B. Descriptive analyses (unadjusted for late entries)

Define Pre-hypertension and hypertension separately

Define HTN throughout study visits

jointfromckd <- jointfromckd %>%
    mutate(htn = ifelse(SBPpercentile >= 95 | DBPpercentile >=
        95, 2, ifelse(SBPpercentile >= 90 | DBPpercentile >=
        90, 1, 0))) %>%
    relocate(htn, .after = DBPpercentile)

Define HTN at baseline

trend <- jointfromckd %>% drop_na(SBPpercentile, DBPpercentile) %>% # be careful with this drop_na
    group_by(id) %>% 
  arrange(YearsFromBaseline) %>% 
  summarize(htn_base = head(htn,1))

Calculate number of study visits, number of time diagnosed with hypertenstion/pre/normal

aggreg <- jointfromckd %>% group_by(id) %>% 
  filter(!(id %in% c(3691,5638,5724,7382,9402))) %>% # These ids have no data on BP
  summarize(VisitNumbers= n(), 
            HTN = sum(htn == 2, na.rm = T),
            preHTN = sum(htn == 1, na.rm = T),
            NoTN = sum(htn == 0, na.rm = T)) %>% 
  mutate(change = case_when(HTN == 0 & preHTN == 0 ~ 0, # 0 means unchanged
                                HTN == 0 & NoTN == 0 ~ 0,
                                preHTN == 0 & NoTN == 0 ~ 0,
                                .default = 1), # 1 means fluctuation
         unchangedHTN = case_when(change == 0 & HTN > 0 ~ 1,
                                  .default = 0),
         unchangedpreHTN = case_when(change == 0 & preHTN > 0 ~ 1,
                                     .default = 0),
         unchangedNoTN = case_when(change == 0 & NoTN > 0 ~ 1,
                                   .default = 0),
         transition = case_when(unchangedNoTN == 1 ~ 0,
                                unchangedpreHTN == 1 ~ 1,
                                unchangedHTN == 1 ~ 2,
                                .default = 3))

Combine datasets

ckdtoevent <- left_join(ckdtoevent, trend %>%
    select(id, htn_base), by = "id")
ckdtoevent <- left_join(ckdtoevent, aggreg %>%
    select(id, VisitNumbers, HTN, preHTN, NoTN, transition),
    by = "id")

jointfromckd <- left_join(jointfromckd, trend %>%
    select(id, htn_base), by = "id")
jointfromckd <- left_join(jointfromckd, aggreg %>%
    select(id, HTN, preHTN, NoTN, transition), by = "id")

Create Survival Object with Composite outcome (renal transplant and dialysis)

ckdtoevent <- ckdtoevent %>%
    mutate(events = ifelse(Trans2Dial1noRRT0atExit %in% 1:2,
        1, 0))
ckdtoevent <- ckdtoevent %>%
    mutate(SurvObj = Surv(StudyEntrytoRRTorExit, events))

Table 1

ckdtoevent %>%
    mutate(BaselineYearsFromCKD = AgeAtStudyEntry - AgeAtCKD,
        htn_base = factor(htn_base, level = 0:2, labels = c("Normotensive",
            "Pre-hypertension", "Hypertension"))) %>%
    tbl_summary(include = c(AgeAtCKD, AgeAtStudyEntry, male1female0,
        Glomdx1NG0, BaselineYearsFromCKD, gfr, BMIpercentile,
        VisitNumbers), by = htn_base, label = list(AgeAtCKD ~
        "Age at CKD Diagnosis (years)", AgeAtStudyEntry ~ "Age at Study Entry (years)",
        male1female0 ~ "Gender Male", Glomdx1NG0 ~ "Glomerular Disease",
        BaselineYearsFromCKD ~ "Baseline Years from CKD (viz. Late time)",
        gfr ~ "Baseline GFR (ml/min per 1.73m2)", BMIpercentile ~
            "Baseline BMI Percentiles", VisitNumbers ~ "Number of Study Visit"),
        missing_text = "(Missing)") %>%
    modify_header(label ~ "**Variable**") %>%
    modify_spanning_header(c("stat_1", "stat_2", "stat_3") ~
        "**Diagnosis at Baseline**") %>%
    add_overall() %>%
    add_p() %>%
    bold_labels() %>%
    bold_p()
## 6 observations missing `htn_base` have been removed. To include these observations, use `forcats::fct_na_value_to_level()` on `htn_base` column before passing to `tbl_summary()`.
Variable Overall, N = 8891 Diagnosis at Baseline p-value2
Normotensive, N = 6201 Pre-hypertension, N = 961 Hypertension, N = 1731
Age at CKD Diagnosis (years) 0.0 (0.0, 3.5) 0.0 (0.0, 4.5) 0.0 (0.0, 1.0) 0.0 (0.0, 1.5) 0.046
Age at Study Entry (years) 11.0 (6.9, 14.6) 11.9 (8.1, 14.8) 8.9 (4.8, 14.0) 9.1 (6.0, 13.7) <0.001
Gender Male 552 (62%) 373 (60%) 65 (68%) 114 (66%) 0.2
Glomerular Disease 262 (29%) 194 (31%) 22 (23%) 46 (27%) 0.2
Baseline Years from CKD (viz. Late time) 7.7 (3.4, 12.1) 8.2 (3.7, 12.5) 5.6 (3.0, 10.2) 6.2 (3.1, 10.1) 0.004
Baseline GFR (ml/min per 1.73m2) 53 (39, 67) 55 (40, 68) 50 (38, 66) 49 (35, 60) <0.001
    (Missing) 1 1 0 0
Baseline BMI Percentiles 69 (39, 91) 68 (38, 91) 68 (36, 89) 75 (45, 94) 0.12
    (Missing) 31 13 4 14
Number of Study Visit 5 (3, 7) 6 (4, 7) 5 (3, 7) 5 (3, 7) 0.4
1 Median (IQR); n (%)
2 Kruskal-Wallis rank sum test; Pearson’s Chi-squared test

KM-curve stratified by baseline hypertension

ggsurvplot(survfit(SurvObj ~ htn_base, data = ckdtoevent), data = ckdtoevent %>%
    mutate(htn_base = factor(htn_base, levels = 0:2, labels = c("Normotensive",
        "Prehypertensive", "Hypertensive"))), palette = "lancet",
    linetype = 1, censor.size = 0.8, title = "Renal Replacement Therapy",
    xlab = "Follow-up time (years)", ylim = c(0, 1), break.x.by = 1) +
    guides(colour = guide_legend(nrow = 2))

Transition of blood pressure diagnosis during the study period

jointfromckd %>%
    drop_na(htn, htn_base) %>%
    mutate(htn = factor(htn, level = 0:2, label = c("Normotensive",
        "Prehypertensive", "Hypertensive")), htn_base = factor(htn_base,
        level = 0:2, label = c("Normotensive", "Prehypertensive",
            "Hypertensive"))) %>%
    ggplot(aes(x = YearsFromBaseline, y = htn, group = id, col = htn_base)) +
    geom_line() + facet_grid(htn_base + transition ~ .)
## `geom_line()`: Each group consists of only one observation.
## ℹ Do you need to adjust the group aesthetic?

KM-curve stratified by transition

ggsurvplot(survfit(SurvObj ~ transition, data = ckdtoevent %>%
    mutate(transition = factor(transition, levels = 0:3, labels = c("All-time Normotensive",
        "All-time Pre-Hypertensive", "All-time Hypertensive",
        "FLuctuation")))), data = ckdtoevent, palette = "lancet",
    linetype = 1, censor.size = 0.8, title = "Renal Replacement Therapy",
    xlab = "Follow-up time (years)", ylim = c(0, 1), break.x.by = 1) +
    guides(colour = guide_legend(nrow = 2))

Combine HTN and Pre-HTN

Define HTN throughout study visits

jointfromckd <- jointfromckd %>%
    mutate(abtn = ifelse(SBPpercentile >= 90 | DBPpercentile >=
        90, 1, 0)) %>%
    relocate(abtn, .after = DBPpercentile)

Define HTN at baseline and study end

trend_c <- jointfromckd %>%
    drop_na(SBPpercentile, DBPpercentile) %>%
    group_by(id) %>%
    arrange(YearsFromBaseline) %>%
    summarize(abtn_base = head(abtn, 1), abtn_end = tail(abtn,
        1))

Calculate number of study visits, number of hypertenstion/pre/normal

aggreg_c <- left_join(jointfromckd, trend_c %>% select(id,abtn_base,abtn_end), by = "id") %>% 
  group_by(id) %>% 
  filter(!(id %in% c(3691,5638,5724,7382,9402))) %>% # These ids have no data on BP
  summarize(VisitNumbers= n(), 
            abHTN = sum(abtn == 1, na.rm = T),
            NoTN = sum(abtn == 0, na.rm = T),
            abtn_base = head(abtn_base,1)) %>% 
  mutate(change = case_when(NoTN == 0 ~ 0, # 0 means unchanged
                                abHTN == 0 ~ 0,
                                .default = 1), # 1 means fluctuation
         unchangedAbHTN = case_when(change == 0 & abHTN > 0 ~ 1,
                                  .default = 0),
         unchangedNoTN = case_when(change == 0 & NoTN > 0 ~ 1,
                                   .default = 0),
         transition_c = case_when(unchangedNoTN == 1 ~ 0,
                                     unchangedAbHTN == 1 ~ 1,
                                     .default = 2),
         transition_c_spec = case_when(transition_c == 0 ~ 0,
                                     transition_c == 1 ~ 1,
                                     transition_c == 2 & abtn_base == 1 ~ 2,
                                     transition_c == 2 & abtn_base ==  0 ~ 3))

Combine datasets

ckdtoevent <- left_join(ckdtoevent, aggreg_c %>%
    select(id, transition_c, transition_c_spec), by = "id")
ckdtoevent <- left_join(ckdtoevent, trend_c %>%
    select(id, abtn_base, abtn_end), by = "id")

jointfromckd <- left_join(jointfromckd, trend_c %>%
    select(id, abtn_base, abtn_end), by = "id")
jointfromckd <- left_join(jointfromckd, aggreg_c %>%
    select(id, transition_c, transition_c_spec), by = "id")

Transition of blood pressure diagnosis during the study period

jointfromckd %>%
    drop_na(abtn, abtn_base) %>%
    mutate(abtn = factor(abtn, level = 0:1, label = c("Normotensive",
        "Abnormotensive")), abtn_base = factor(abtn_base, level = 0:1,
        label = c("Normotensive", "Abnormotensive"))) %>%
    ggplot(aes(x = YearsFromBaseline, y = abtn, group = id, col = abtn_base)) +
    geom_line() + facet_grid(abtn_base + transition_c_spec ~
    .)

KM-curve stratified by transition

ggsurvplot(survfit(SurvObj ~ transition_c_spec, data = ckdtoevent),
    data = ckdtoevent, palette = "lancet", linetype = 1, censor.size = 0.8,
    title = "Renal Replacement Therapy", xlab = "Follow-up time (years)",
    ylim = c(0, 1), break.x.by = 1) + guides(colour = guide_legend(nrow = 2))