Skip to contents

Weighted logrank test

Usage

wlr(data, weight, return_variance = FALSE, ratio = NULL, formula = NULL)

# Default S3 method
wlr(data, weight, return_variance = FALSE, ratio = NULL, formula = NULL)

# S3 method for class 'tte_data'
wlr(data, weight, return_variance = FALSE, ratio = NULL, formula = NULL)

# S3 method for class 'counting_process'
wlr(data, weight, return_variance = FALSE, ratio = NULL, formula = NULL)

Arguments

data

Dataset (generated by sim_pw_surv()) that has been cut by counting_process(), cut_data_by_date(), or cut_data_by_event().

weight

Weighting functions, such as fh(), mb(), and early_zero().

return_variance

A logical flag that, if TRUE, adds columns estimated variance for weighted sum of observed minus expected; see details; Default: FALSE.

ratio

randomization ratio (experimental:control).

  • If the data is generated by simtrial, such as

    • data = sim_pw_surv(...) |> cut_data_by_date(...)

    • data = sim_pw_surv(...) |> cut_data_by_event(...)

    • data = sim_pw_surv(...) |> cut_data_by_date(...) |> counting_process(...)

    • data = sim_pw_surv(...) |> cut_data_by_event(...) |> counting_process(...) there is no need to input the ratio, as simtrial gets the ratio via the block arguments in sim_pw_surv().

  • If the data is a custom dataset (see Example 2) below,

    • Users are suggested to input the planned randomization ratio to ratio;

    • If not, simtrial takes the empirical randomization ratio.

formula

A formula to specify the columns that contain the time-to-event, event, treatment, and stratum variables. Only used by the default S3 method because the other classes aleady have the required column names. For stratified designs, the formula should have the form Surv(tte, event) ~ treatment + strata(stratum), where tte, event, treatment, and stratum are the column names from data with the time-to-event measurement, event status, treatment group, and stratum, respectively. For unstratified designs, the formula can omit the stratum column: Surv(tte, event) ~ treatment.

Value

A list containing the test method (method), parameters of this test method (parameter), point estimate of the treatment effect (estimate), standardized error of the treatment effect (se), Z-score (z), p-values (p_value).

Details

  • \(z\) - Standardized normal Fleming-Harrington weighted logrank test.

  • \(i\) - Stratum index.

  • \(d_i\) - Number of distinct times at which events occurred in stratum \(i\).

  • \(t_{ij}\) - Ordered times at which events in stratum \(i\), \(j = 1, 2, \ldots, d_i\) were observed; for each observation, \(t_{ij}\) represents the time post study entry.

  • \(O_{ij.}\) - Total number of events in stratum \(i\) that occurred at time \(t_{ij}\).

  • \(O_{ije}\) - Total number of events in stratum \(i\) in the experimental treatment group that occurred at time \(t_{ij}\).

  • \(N_{ij.}\) - Total number of study subjects in stratum \(i\) who were followed for at least duration.

  • \(E_{ije}\) - Expected observations in experimental treatment group given random selection of \(O_{ij.}\) from those in stratum \(i\) at risk at time \(t_{ij}\).

  • \(V_{ije}\) - Hypergeometric variance for \(E_{ije}\) as produced in Var from counting_process().

  • \(N_{ije}\) - Total number of study subjects in stratum \(i\) in the experimental treatment group who were followed for at least duration \(t_{ij}\).

  • \(E_{ije}\) - Expected observations in experimental group in stratum \(i\) at time \(t_{ij}\) conditioning on the overall number of events and at risk populations at that time and sampling at risk observations without replacement: $$E_{ije} = O_{ij.} N_{ije}/N_{ij.}$$

  • \(S_{ij}\) - Kaplan-Meier estimate of survival in combined treatment groups immediately prior to time \(t_{ij}\).

  • \(\rho, \gamma\) - Real parameters for Fleming-Harrington test.

  • \(X_i\) - Numerator for signed logrank test in stratum \(i\) $$X_i = \sum_{j=1}^{d_{i}} S_{ij}^\rho(1-S_{ij}^\gamma)(O_{ije}-E_{ije})$$

  • \(V_{ij}\) - Variance used in denominator for Fleming-Harrington weighted logrank tests $$V_i = \sum_{j=1}^{d_{i}} (S_{ij}^\rho(1-S_{ij}^\gamma))^2V_{ij})$$ The stratified Fleming-Harrington weighted logrank test is then computed as: $$z = \sum_i X_i/\sqrt{\sum_i V_i}.$$

Examples

# ---------------------- #
#      Example 1         #
#  Use dataset generated #
#     by simtrial        #
# ---------------------- #
x <- sim_pw_surv(n = 200) |> cut_data_by_event(100)

# Example 1A: WLR test with FH wights
x |> wlr(weight = fh(rho = 0, gamma = 0.5))
#> $method
#> [1] "WLR"
#> 
#> $parameter
#> [1] "FH(rho=0, gamma=0.5)"
#> 
#> $estimate
#> [1] -10.39261
#> 
#> $se
#> [1] 2.578534
#> 
#> $z
#> [1] 4.030433
#> 
#> $info
#> [1] 6.706301
#> 
#> $info0
#> [1] 7.185266
#> 
x |> wlr(weight = fh(rho = 0, gamma = 0.5), return_variance = TRUE)
#> $method
#> [1] "WLR"
#> 
#> $parameter
#> [1] "FH(rho=0, gamma=0.5)"
#> 
#> $estimate
#> [1] -10.39261
#> 
#> $se
#> [1] 2.578534
#> 
#> $z
#> [1] 4.030433
#> 
#> $info
#> [1] 6.706301
#> 
#> $info0
#> [1] 7.185266
#> 

# Example 1B: WLR test with MB wights
x |> wlr(weight = mb(delay = 4, w_max = 2))
#> $method
#> [1] "WLR"
#> 
#> $parameter
#> [1] "MB(delay = 4, max_weight = 2)"
#> 
#> $estimate
#> [1] -22.64058
#> 
#> $se
#> [1] 6.064475
#> 
#> $z
#> [1] 3.733313
#> 
#> $info
#> [1] 35.70777
#> 
#> $info0
#> [1] 38.37037
#> 

# Example 1C: WLR test with early zero wights
x |> wlr(weight = early_zero(early_period = 4))
#> $method
#> [1] "WLR"
#> 
#> $parameter
#> [1] "Xu 2017 with first 4 months of 0 weights"
#> 
#> $estimate
#> [1] -16.83342
#> 
#> $se
#> [1] 3.511878
#> 
#> $z
#> [1] 4.793281
#> 
#> $info
#> [1] 10.75472
#> 
#> $info0
#> [1] 13.25
#> 

# Example 1D
# For increased computational speed when running many WLR tests, you can
# pre-compute the counting_process() step first, and then pass the result of
# counting_process() directly to wlr()
x <- x |> counting_process(arm = "experimental")
x |> wlr(weight = fh(rho = 0, gamma = 1))
#> $method
#> [1] "WLR"
#> 
#> $parameter
#> [1] "FH(rho=0, gamma=1)"
#> 
#> $estimate
#> [1] -6.606821
#> 
#> $se
#> [1] 1.631434
#> 
#> $z
#> [1] 4.049702
#> 
#> $info
#> [1] 2.854797
#> 
#> $info0
#> [1] 2.982862
#> 
x |> wlr(weight = mb(delay = 4, w_max = 2))
#> $method
#> [1] "WLR"
#> 
#> $parameter
#> [1] "MB(delay = 4, max_weight = 2)"
#> 
#> $estimate
#> [1] -22.64058
#> 
#> $se
#> [1] 6.064475
#> 
#> $z
#> [1] 3.733313
#> 
#> $info
#> [1] 35.70777
#> 
#> $info0
#> [1] 38.37037
#> 
x |> wlr(weight = early_zero(early_period = 4))
#> $method
#> [1] "WLR"
#> 
#> $parameter
#> [1] "Xu 2017 with first 4 months of 0 weights"
#> 
#> $estimate
#> [1] -16.83342
#> 
#> $se
#> [1] 3.511878
#> 
#> $z
#> [1] 4.793281
#> 
#> $info
#> [1] 10.75472
#> 
#> $info0
#> [1] 13.25
#> 

# ---------------------- #
#      Example 2         #
#  Use cumsum dataset    #
# ---------------------- #
x <- data.frame(treatment = ifelse(ex1_delayed_effect$trt == 1, "experimental", "control"),
                stratum = rep("All", nrow(ex1_delayed_effect)),
                tte = ex1_delayed_effect$month,
                event = ex1_delayed_effect$evntd)

# Users can specify the randomization ratio to calculate the statistical information under H0
x |> wlr(weight = fh(rho = 0, gamma = 0.5), ratio = 2)
#> $method
#> [1] "WLR"
#> 
#> $parameter
#> [1] "FH(rho=0, gamma=0.5)"
#> 
#> $estimate
#> [1] -12.28665
#> 
#> $se
#> [1] 3.716574
#> 
#> $z
#> [1] 3.305908
#> 
#> $info
#> [1] 16.60727
#> 
#> $info0
#> [1] 15.27192
#> 

x |>
  counting_process(arm = "experimental") |>
  wlr(weight = fh(rho = 0, gamma = 0.5), ratio = 2)
#> $method
#> [1] "WLR"
#> 
#> $parameter
#> [1] "FH(rho=0, gamma=0.5)"
#> 
#> $estimate
#> [1] -12.28665
#> 
#> $se
#> [1] 3.716574
#> 
#> $z
#> [1] 3.305908
#> 
#> $info
#> [1] 16.60727
#> 
#> $info0
#> [1] 15.27192
#> 

# If users don't provide the randomization ratio, we will calculate the emperical ratio
x |> wlr(weight = fh(rho = 0, gamma = 0.5))
#> $method
#> [1] "WLR"
#> 
#> $parameter
#> [1] "FH(rho=0, gamma=0.5)"
#> 
#> $estimate
#> [1] -12.28665
#> 
#> $se
#> [1] 3.716574
#> 
#> $z
#> [1] 3.305908
#> 
#> $info
#> [1] 16.60727
#> 
#> $info0
#> [1] 15.31399
#> 

x |>
  counting_process(arm = "experimental") |>
  wlr(weight = fh(rho = 0, gamma = 0.5))
#> $method
#> [1] "WLR"
#> 
#> $parameter
#> [1] "FH(rho=0, gamma=0.5)"
#> 
#> $estimate
#> [1] -12.28665
#> 
#> $se
#> [1] 3.716574
#> 
#> $z
#> [1] 3.305908
#> 
#> $info
#> [1] 16.60727
#> 
#> $info0
#> [1] 15.31399
#> 

# ---------------------- #
#      Example 3         #
#  Use formula           #
# ---------------------- #
library("survival")

# Unstratified design
x <- sim_pw_surv(n = 200) |> cut_data_by_event(100) |> as.data.frame()
colnames(x) <- c("tte", "evnt", "strtm", "trtmnt")
wlr(x, weight = fh(0, 0.5), formula = Surv(tte, evnt) ~ trtmnt)
#> $method
#> [1] "WLR"
#> 
#> $parameter
#> [1] "FH(rho=0, gamma=0.5)"
#> 
#> $estimate
#> [1] -9.735085
#> 
#> $se
#> [1] 2.489761
#> 
#> $z
#> [1] 3.910049
#> 
#> $info
#> [1] 6.325363
#> 
#> $info0
#> [1] 6.675249
#> 

# Stratified design
x$strtm <- sample(c("s1", "s2"), size = nrow(x), replace = TRUE)
wlr(x, weight = fh(0, 0.5), formula = Surv(tte, evnt) ~ trtmnt + strata(strtm))
#> $method
#> [1] "WLR"
#> 
#> $parameter
#> [1] "FH(rho=0, gamma=0.5)"
#> 
#> $estimate
#> [1] -9.203049
#> 
#> $se
#> [1] 2.514777
#> 
#> $z
#> [1] 3.659589
#> 
#> $info
#> [1] 6.290684
#> 
#> $info0
#> [1] 6.690052
#>