Survival Analysis: From Biostats to AI Lifetimes

Applied Statistics
A practical introduction to survival analysis, censoring, Kaplan-Meier estimation, log-rank tests, and Cox proportional hazards models.
Published

August 15, 2024

Modified

June 9, 2026

Executive Summary

Many important outcomes are not just about whether an event happens.

They are about when it happens.

Examples include:

  • time to death,
  • time to relapse,
  • time to hospital discharge,
  • time to equipment failure,
  • time to customer churn,
  • time to product adoption,
  • or time to mission-critical breakdown.

These are not ordinary regression problems.

They involve a special complication:

for some observations, the event has not occurred by the time observation ends.

That is censoring, and it is one of the main reasons survival analysis exists as a distinct field (Kaplan and Meier 1958; Klein and Moeschberger 2003).

Survival analysis provides tools for (Kaplan and Meier 1958; Cox 1972; Klein and Moeschberger 2003):

  • estimating time-to-event curves,
  • comparing groups,
  • modeling hazard rates,
  • and handling incomplete follow-up properly.

This matters not only in biostatistics, but also in AI/ML settings involving churn, event prediction, and lifetime modeling.

This post introduces:

  • censoring,
  • Kaplan-Meier curves,
  • hazard functions,
  • and Cox proportional hazards models,
  • with a clinical-trial style example.

Survival analysis matters because event timing contains information that ordinary yes/no outcomes throw away, and censoring means missing event times are often informative, not ignorable.


Survival Analysis Begins with Time-to-Event Thinking

In standard binary outcome analysis, we might ask whether an event happened.

In survival analysis, we ask something richer:

  • how long until the event occurs?
  • how does risk evolve over time?
  • do groups differ in their time-to-event patterns?
  • how do predictors affect the event hazard?

This shift matters because two patients can both experience the same event, but at very different times.

Time carries information.

That is why survival analysis is not just a niche add-on to regression. It is the natural framework for studying event timing.


Censoring Is the Central Data Challenge

One of the defining features of survival data is censoring.

Right censoring occurs when:

  • a subject has not yet experienced the event by the end of follow-up,
  • is lost to follow-up,
  • or leaves observation before the event occurs.

In these cases, we do not know the exact event time. We only know that it exceeds the observed follow-up time.

That is critically different from ordinary missing data.

A censored observation still provides partial information. It tells us the subject survived or remained event-free up to a known time.

Survival methods are designed to use that partial information correctly.


The Survival Function and Hazard Function Capture Different Ideas

Two fundamental quantities in survival analysis are:

Survival Function

\[ S(t) = P(T > t) \]

This is the probability that the event time (T) exceeds time (t).

It answers:

what proportion remain event-free beyond time (t)?

Hazard Function

The hazard describes the instantaneous event risk at time (t), given survival up to that point.

Very loosely, it answers:

among those still at risk, how likely is the event to occur next?

The survival function is often easier to visualize. The hazard function is often more natural for modeling covariate effects.

Both are central.


A Clinical-Trial Style Example Makes the Problem Concrete

To illustrate survival analysis, we will simulate a simple clinical-trial style dataset with:

  • two treatment groups,
  • event times,
  • and right censoring.
library(dplyr)
library(tibble)
library(ggplot2)

n <- 250

surv_df <- tibble::tibble(
  id = 1:n,
  treatment = sample(c("Standard", "New Therapy"), size = n, replace = TRUE),
  age = rnorm(n, mean = 60, sd = 10)
) |>
  dplyr::mutate(
    true_rate = dplyr::if_else(treatment == "New Therapy", 0.05, 0.08) *
      exp(0.02 * (age - 60)),
    true_event_time = rexp(n, rate = true_rate),
    censor_time = runif(n, min = 4, max = 20),
    time = pmin(true_event_time, censor_time),
    status = as.integer(true_event_time <= censor_time)
  )

surv_df |>
  dplyr::summarise(
    n = dplyr::n(),
    events = sum(status),
    censored = sum(status == 0),
    event_rate = mean(status)
  )
# A tibble: 1 × 4
      n events censored event_rate
  <int>  <int>    <int>      <dbl>
1   250    120      130       0.48

Here:

  • time is the observed follow-up time
  • status = 1 means the event occurred
  • status = 0 means the subject was censored

This is the standard structure used in many survival workflows.


Kaplan-Meier Estimation Provides a Nonparametric Survival Curve

The Kaplan-Meier estimator is one of the most important tools in survival analysis.

It estimates the survival function nonparametrically, meaning it does not assume a specific parametric distribution for event times.

This makes it an excellent first step for describing survival patterns.

We begin by creating a survival object and fitting Kaplan-Meier curves by treatment.

required_pkgs <- c("survival")
missing_pkgs <- required_pkgs[
  !vapply(required_pkgs, requireNamespace, logical(1), quietly = TRUE)
]

if (length(missing_pkgs) > 0) {
  stop("Missing packages: ", paste(missing_pkgs, collapse = ", "))
}

library(survival)

surv_obj <- survival::Surv(time = surv_df$time, event = surv_df$status)

km_fit <- survival::survfit(surv_obj ~ treatment, data = surv_df)

summary(km_fit)
Call: survfit(formula = surv_obj ~ treatment, data = surv_df)

                treatment=New Therapy 
    time n.risk n.event survival std.err lower 95% CI upper 95% CI
  0.0965    127       1    0.992 0.00784        0.977        1.000
  0.1630    126       1    0.984 0.01105        0.963        1.000
  0.2190    125       1    0.976 0.01348        0.950        1.000
  0.4039    124       1    0.969 0.01550        0.939        0.999
  0.6956    123       1    0.961 0.01726        0.927        0.995
  0.9363    122       1    0.953 0.01883        0.917        0.990
  0.9451    121       1    0.945 0.02025        0.906        0.985
  1.0731    120       1    0.937 0.02156        0.896        0.980
  1.2270    119       1    0.929 0.02277        0.886        0.975
  1.2648    118       1    0.921 0.02390        0.876        0.969
  1.3767    117       1    0.913 0.02496        0.866        0.964
  1.5487    116       1    0.906 0.02596        0.856        0.958
  2.3179    115       1    0.898 0.02690        0.846        0.952
  2.3200    114       1    0.890 0.02779        0.837        0.946
  2.3564    113       1    0.882 0.02864        0.828        0.940
  2.5655    112       1    0.874 0.02945        0.818        0.934
  2.8571    111       1    0.866 0.03021        0.809        0.927
  3.8362    110       1    0.858 0.03095        0.800        0.921
  3.9885    109       1    0.850 0.03165        0.791        0.915
  4.1062    107       1    0.842 0.03234        0.781        0.908
  4.3133    104       1    0.834 0.03303        0.772        0.902
  4.4090    102       1    0.826 0.03370        0.763        0.895
  4.5336    101       1    0.818 0.03434        0.753        0.888
  4.5890    100       1    0.810 0.03496        0.744        0.881
  4.8091     98       1    0.802 0.03557        0.735        0.874
  5.2799     92       1    0.793 0.03623        0.725        0.867
  5.3908     91       1    0.784 0.03687        0.715        0.860
  5.5460     88       1    0.775 0.03751        0.705        0.852
  5.7481     87       1    0.766 0.03812        0.695        0.845
  5.9914     81       1    0.757 0.03881        0.684        0.837
  7.5287     75       1    0.747 0.03958        0.673        0.828
  7.7021     73       1    0.737 0.04034        0.662        0.820
  8.0902     72       1    0.726 0.04105        0.650        0.811
  8.6670     64       1    0.715 0.04195        0.637        0.802
  9.1817     61       1    0.703 0.04287        0.624        0.792
  9.2170     59       1    0.691 0.04377        0.611        0.783
  9.3474     58       1    0.679 0.04461        0.597        0.773
  9.9556     54       1    0.667 0.04552        0.583        0.762
  9.9867     51       1    0.654 0.04647        0.569        0.751
 10.6609     46       1    0.640 0.04758        0.553        0.740
 11.2042     44       1    0.625 0.04867        0.537        0.728
 12.5418     33       1    0.606 0.05075        0.514        0.714
 12.7676     31       1    0.586 0.05274        0.492        0.700
 14.2457     24       1    0.562 0.05592        0.462        0.683
 14.6053     22       1    0.537 0.05892        0.433        0.665
 15.2750     18       1    0.507 0.06274        0.398        0.646
 15.8000     15       1    0.473 0.06704        0.358        0.624
 16.3571     13       1    0.437 0.07107        0.317        0.601

                treatment=Standard 
   time n.risk n.event survival std.err lower 95% CI upper 95% CI
  0.145    123       1    0.992  0.0081        0.976        1.000
  0.466    122       1    0.984  0.0114        0.962        1.000
  0.653    121       1    0.976  0.0139        0.949        1.000
  0.688    120       1    0.967  0.0160        0.937        0.999
  0.725    119       1    0.959  0.0178        0.925        0.995
  0.820    118       1    0.951  0.0194        0.914        0.990
  0.890    117       1    0.943  0.0209        0.903        0.985
  0.960    116       1    0.935  0.0222        0.892        0.980
  1.215    115       1    0.927  0.0235        0.882        0.974
  1.325    114       1    0.919  0.0246        0.872        0.968
  1.382    113       1    0.911  0.0257        0.862        0.962
  1.543    112       1    0.902  0.0268        0.851        0.956
  1.629    111       1    0.894  0.0277        0.842        0.950
  1.645    110       1    0.886  0.0286        0.832        0.944
  1.671    109       1    0.878  0.0295        0.822        0.938
  1.749    108       1    0.870  0.0303        0.812        0.931
  2.084    107       1    0.862  0.0311        0.803        0.925
  2.424    106       1    0.854  0.0319        0.793        0.918
  2.493    105       1    0.846  0.0326        0.784        0.912
  2.550    104       1    0.837  0.0333        0.775        0.905
  2.596    103       1    0.829  0.0339        0.765        0.899
  2.897    102       1    0.821  0.0346        0.756        0.892
  3.079    101       1    0.813  0.0352        0.747        0.885
  3.140    100       1    0.805  0.0357        0.738        0.878
  3.328     99       1    0.797  0.0363        0.729        0.871
  3.444     98       1    0.789  0.0368        0.720        0.864
  3.476     97       1    0.780  0.0373        0.711        0.857
  3.530     96       1    0.772  0.0378        0.702        0.850
  3.838     95       1    0.764  0.0383        0.693        0.843
  3.889     94       1    0.756  0.0387        0.684        0.836
  4.712     87       1    0.747  0.0392        0.674        0.828
  4.750     86       1    0.739  0.0397        0.665        0.821
  4.822     85       1    0.730  0.0402        0.655        0.813
  4.859     84       1    0.721  0.0407        0.646        0.806
  4.950     83       1    0.713  0.0411        0.637        0.798
  5.165     79       1    0.704  0.0415        0.627        0.790
  5.182     78       1    0.695  0.0420        0.617        0.782
  5.224     77       1    0.686  0.0424        0.607        0.774
  5.461     76       1    0.677  0.0428        0.598        0.766
  5.599     75       1    0.668  0.0432        0.588        0.758
  5.894     73       1    0.658  0.0435        0.578        0.749
  6.568     71       1    0.649  0.0439        0.569        0.741
  6.652     70       1    0.640  0.0442        0.559        0.733
  6.893     68       1    0.630  0.0446        0.549        0.724
  6.897     67       1    0.621  0.0449        0.539        0.716
  7.125     65       1    0.611  0.0452        0.529        0.707
  7.438     63       1    0.602  0.0455        0.519        0.698
  7.465     62       1    0.592  0.0458        0.509        0.689
  7.832     58       1    0.582  0.0461        0.498        0.680
  7.838     57       1    0.572  0.0464        0.488        0.670
  7.860     56       1    0.561  0.0467        0.477        0.661
  8.027     54       1    0.551  0.0470        0.466        0.651
  8.271     52       1    0.540  0.0473        0.455        0.642
  8.350     51       1    0.530  0.0475        0.444        0.632
  8.426     50       1    0.519  0.0477        0.434        0.622
  8.651     47       1    0.508  0.0480        0.422        0.612
  8.852     46       1    0.497  0.0482        0.411        0.601
  8.883     45       1    0.486  0.0484        0.400        0.591
  9.205     42       1    0.475  0.0486        0.388        0.580
  9.241     40       1    0.463  0.0488        0.376        0.569
  9.602     38       1    0.450  0.0490        0.364        0.558
  9.695     37       1    0.438  0.0492        0.352        0.546
  9.836     35       1    0.426  0.0493        0.339        0.534
  9.980     34       1    0.413  0.0494        0.327        0.522
 10.004     32       1    0.400  0.0496        0.314        0.510
 10.743     29       1    0.387  0.0497        0.300        0.497
 11.201     26       1    0.372  0.0500        0.286        0.484
 11.478     25       1    0.357  0.0502        0.271        0.470
 11.730     22       1    0.341  0.0504        0.255        0.455
 12.471     17       1    0.321  0.0513        0.234        0.439
 12.848     14       1    0.298  0.0525        0.211        0.421
 15.186     10       1    0.268  0.0550        0.179        0.401

This gives estimated survival probabilities over time for each treatment group.


Kaplan-Meier Curves Make Time-to-Event Patterns Visible

A Kaplan-Meier curve shows the estimated probability of remaining event-free over time.

plot(
  km_fit,
  col = c("black", "steelblue"),
  lwd = 2,
  xlab = "Follow-Up Time",
  ylab = "Survival Probability",
  main = "Kaplan-Meier Curves by Treatment"
)
legend(
  "bottomleft",
  legend = levels(factor(surv_df$treatment)),
  col = c("black", "steelblue"),
  lwd = 2,
  bty = "n"
)

These curves are valuable because they show:

  • group separation over time
  • the timing of divergence
  • and the effect of censoring indirectly through the stepwise structure

They are often one of the clearest graphics in a clinical or event-time analysis.


Survival Curves Use Censored Observations Rather Than Discarding Them

One of the strengths of Kaplan-Meier estimation is that censored observations still contribute information.

A censored subject is counted as:

  • event-free up to the censoring time,
  • then removed from the risk set afterward.

This is exactly the kind of partial information ordinary methods often mishandle.

That is why a naïve approach such as:

  • coding event yes/no only,
  • or analyzing only those with completed event times

can waste information and bias interpretation.

Survival methods were built precisely to avoid that mistake.


Median Survival Time Is Often a Useful Summary

A Kaplan-Meier curve is rich, but analysts often also want a summary such as the median survival time.

This is the time at which the survival probability drops to 0.5.

summary(km_fit)$table
                      records n.max n.start events    rmean se(rmean)    median
treatment=New Therapy     127   127     127     48 13.36720 0.6988038 15.800019
treatment=Standard        123   123     123     72 10.13797 0.6826309  8.851555
                        0.95LCL  0.95UCL
treatment=New Therapy 12.767623       NA
treatment=Standard     7.832121 10.74252

Median survival can be useful, but it should be interpreted in context.

It compresses a whole time-to-event curve into one number. That can be helpful for communication, but it also loses detail about the full trajectory.


Group Comparison Often Uses the Log-Rank Test

A standard nonparametric way to compare survival curves across groups is the log-rank test (Kaplan and Meier 1958; Klein and Moeschberger 2003).

This test evaluates whether the groups differ in their survival experience over time.

survival::survdiff(surv_obj ~ treatment, data = surv_df)
Call:
survival::survdiff(formula = surv_obj ~ treatment, data = surv_df)

                        N Observed Expected (O-E)^2/E (O-E)^2/V
treatment=New Therapy 127       48     66.5      5.13      11.6
treatment=Standard    123       72     53.5      6.36      11.6

 Chisq= 11.6  on 1 degrees of freedom, p= 7e-04 

The log-rank test is useful, but like many omnibus tests, it does not provide a full model of covariate effects.

It answers a group-comparison question. It does not directly adjust for multiple predictors or estimate hazard ratios.

That is where the Cox model becomes especially useful.


The Cox Proportional Hazards Model Relates Predictors to Hazard

The Cox proportional hazards model is one of the most widely used models in survival analysis.

It relates predictors to the hazard function without requiring a fully specified baseline hazard.

The model can be written as:

\[ h(t \mid X) = h_0(t)\exp(\beta_1 X_1 + \cdots + \beta_p X_p) \]

where:

  • (h_0(t)) is the baseline hazard
  • the exponential term scales the hazard multiplicatively

This makes the Cox model semi-parametric:

  • the covariate effects are modeled parametrically
  • the baseline hazard is left unspecified

That balance is one reason the Cox model is so useful in applied work.


Fitting a Cox Model in R

We can fit a Cox model using treatment and age as predictors.

fit_cox <- survival::coxph(
  survival::Surv(time, status) ~ treatment + age,
  data = surv_df
)

summary(fit_cox)
Call:
survival::coxph(formula = survival::Surv(time, status) ~ treatment + 
    age, data = surv_df)

  n= 250, number of events= 120 

                      coef exp(coef) se(coef)     z Pr(>|z|)    
treatmentStandard 0.646491  1.908831 0.187841 3.442 0.000578 ***
age               0.020010  1.020211 0.009521 2.102 0.035576 *  
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

                  exp(coef) exp(-coef) lower .95 upper .95
treatmentStandard     1.909     0.5239     1.321     2.758
age                   1.020     0.9802     1.001     1.039

Concordance= 0.599  (se = 0.029 )
Likelihood ratio test= 15.9  on 2 df,   p=4e-04
Wald test            = 15.45  on 2 df,   p=4e-04
Score (logrank) test = 15.8  on 2 df,   p=4e-04

This output provides:

  • estimated coefficients
  • hazard ratios after exponentiation
  • standard errors
  • confidence intervals
  • and p-values

But the most important quantity for interpretation is usually the hazard ratio.


Hazard Ratios Are Multiplicative Effects on Instantaneous Risk

Exponentiating Cox model coefficients gives hazard ratios.

hr_tbl <- tibble::tibble(
  term = names(coef(fit_cox)),
  estimate = coef(fit_cox),
  hazard_ratio = exp(coef(fit_cox))
)

hr_tbl
# A tibble: 2 × 3
  term              estimate hazard_ratio
  <chr>                <dbl>        <dbl>
1 treatmentStandard   0.646          1.91
2 age                 0.0200         1.02

Interpretation example:

  • a hazard ratio below 1 for New Therapy suggests lower event hazard than the reference group
  • a hazard ratio above 1 for age suggests that higher age is associated with increased hazard

This is a conditional interpretation:

  • treatment effect holding age constant
  • age effect holding treatment constant

That is one of the strengths of the Cox model compared with simple curve comparison alone.


The Cox Model Is About Hazard, Not Directly About Survival Time

One of the most common interpretive pitfalls is to treat hazard ratios as if they were simple ratios of survival times.

They are not.

A hazard ratio is a ratio of instantaneous event rates among those still at risk.

That makes it very useful, but also more subtle than a direct “time multiplier.”

In practice, this means:

  • hazard ratios are informative,
  • but they should not be oversimplified into claims about exact survival duration differences.

The hazard framing is one of the reasons survival analysis requires careful language.


The Proportional Hazards Assumption Must Be Checked

A central assumption of the Cox model is proportional hazards (Cox 1972).

This means the hazard ratio between groups is assumed to remain constant over time.

If this assumption is badly violated, the model may become misleading.

A standard diagnostic uses Schoenfeld residuals.

survival::cox.zph(fit_cox)
          chisq df    p
treatment 0.632  1 0.43
age       0.375  1 0.54
GLOBAL    0.915  2 0.63

This test and its associated plots help assess whether the proportional hazards assumption is reasonable.

In applied work, this is not optional bookkeeping. It is part of responsible interpretation.


Visual Diagnostics Help Assess Proportionality

If you want a graphical check, you can plot the proportional hazards diagnostics.

plot(survival::cox.zph(fit_cox))

If the effect appears to vary strongly over time, then the proportional hazards assumption may be questionable.

In such cases, analysts may need:

  • time-varying effects
  • stratified Cox models
  • or alternative survival modeling approaches

This is one reason survival analysis remains a modeling discipline, not merely a software routine.


Survival Analysis Matters in AI/ML Because Many Events Are Time-Dependent

Survival analysis is not confined to clinical trials.

It also matters in AI/ML settings such as:

  • churn prediction
  • customer lifetime analysis
  • equipment failure forecasting
  • retention modeling
  • time-to-conversion problems
  • and maintenance scheduling

In all of these problems, the key issue is not only whether an event occurs, but when.

That is why survival methods remain important even as more ML approaches emerge.

They handle event timing and censoring directly, which many naïve classifiers do not.


Survival ML Extends Classical Ideas Rather Than Replacing Them

Modern ML has produced extensions such as:

  • random survival forests
  • penalized Cox models
  • deep survival models
  • and neural hazard-based approaches

But these do not make classical survival analysis obsolete.

Instead, they build on the same central concerns:

  • censoring
  • time-to-event structure
  • hazard or survival estimation
  • and temporal risk prediction

That is why learning Kaplan-Meier and Cox PH still matters. They remain the conceptual foundation for many survival-oriented ML methods.


A Predicted Survival Curve Can Be More Intuitive Than a Hazard Ratio Alone

One useful feature of the Cox model is that it can be used to generate survival curves for specific covariate patterns.

newdata_df <- data.frame(
  treatment = c("Standard", "New Therapy"),
  age = c(60, 60)
)

pred_surv <- survival::survfit(fit_cox, newdata = newdata_df)

plot(
  pred_surv,
  col = c("black", "steelblue"),
  lwd = 2,
  xlab = "Follow-Up Time",
  ylab = "Predicted Survival Probability",
  main = "Predicted Survival Curves at Age 60"
)
legend(
  "bottomleft",
  legend = c("Standard", "New Therapy"),
  col = c("black", "steelblue"),
  lwd = 2,
  bty = "n"
)

This is often easier for readers to understand than hazard ratios alone, especially when communicating to non-statistical audiences.


Survival Analysis Is About More Than Significance

As with many classical methods, survival analysis can be reduced too quickly to p-values.

That misses much of what makes it useful.

Survival analysis is valuable because it provides:

  • time-aware estimation
  • use of censored data
  • interpretable risk modeling
  • and clinically or operationally meaningful curves

A significant hazard ratio is only part of the story.

The more important questions often are:

  • how large is the effect?
  • when do the curves diverge?
  • how much censoring is present?
  • and does the model fit the temporal structure credibly?

That is where good analysis lives.


A Practical Checklist for Applied Work

Before reporting a survival analysis, ask:

  • Is the event clearly defined?
  • Is censoring being handled properly?
  • Have I plotted Kaplan-Meier curves?
  • Is group comparison enough, or is covariate adjustment needed?
  • Are hazard ratios being interpreted correctly?
  • Has the proportional hazards assumption been checked?
  • Would predicted survival curves help communication?
  • Is a more flexible survival ML approach justified, or is a classical model already adequate?

These questions often matter more than whether the software output looks polished.


NoteWhere This Shows Up in AI/ML

Time-to-event modeling drives readmission prediction, post-discharge mortality surveillance, and medical device failure forecasting across deployed health systems: Epic’s readmission risk model is structurally a competing risks survival problem, since patients can be readmitted, die, or be administratively censored, and treating all non-readmission as equivalent obscures which failure mode dominates. Standard binary classifiers applied to censored survival outcomes produce biased estimates because they discard information from patients who haven’t yet experienced the event — a patient censored at 25 days is not the same as a patient who was event-free at 90 days, but a logistic model treats them identically if both are coded “0.” In DoDTR trauma cohorts, competing risks are pervasive: a service member who dies in the first 48 hours cannot experience a 30-day infectious complication, and standard Cox models that ignore this competing event will overestimate cumulative complication incidence in high-mortality subgroups. Applying a single-event Cox model in this setting inflates complication risk estimates and can lead to over-aggressive prophylaxis protocols.

Closing: Survival Analysis Keeps Time and Uncertainty in the Same Model

Survival analysis remains one of the most important areas of applied statistics because it handles two realities at once:

  • events take time,
  • and follow-up is often incomplete.

Kaplan-Meier curves offer a transparent way to estimate survival probabilities. Cox models allow covariate-adjusted hazard modeling without fully specifying the baseline hazard. Together, they provide a powerful framework for event-time data in both biostatistics and AI/ML.

Survival analysis matters because timing is data, censoring is not failure, and understanding event risk over time is central to many real decisions.


Tip📚 Go Deeper: Survival Analysis Toolkit

This post is part of the Survival Analysis Toolkit — a companion reference with Kaplan-Meier templates, Cox model diagnostics, censoring documentation standards, and time-to-event reporting scaffolds.

→ Open the Survival Analysis Toolkit


Series Callout

Note

This post is part of a broader Applied Statistics for AI and Clinical Decision-Making Series:

  • Probability fundamentals for machine learning
  • Random variables and expectation
  • Common probability distributions
  • Central Limit Theorem
  • Law of Large Numbers
  • Sampling methods for Biostats and ML
  • Hypothesis testing in the age of AI
  • Confidence intervals
  • Maximum likelihood estimation
  • Bayesian inference
  • Linear regression
  • Logistic regression
  • Generalized linear models
  • Analysis of variance
  • Principal component analysis
  • Cluster analysis
  • Time series analysis
  • Survival analysis
  • Non-parametric methods
  • Bias-variance tradeoff
  • Regularization
  • Cross-validation
  • Information theory
  • Optimization techniques
  • Linear algebra basics
  • Calculus for ML
  • Monte Carlo methods
  • Dimensionality curse and reduction techniques
  • Model evaluation metrics
  • Ensemble methods

References

Cox, D. R. 1972. “Regression Models and Life-Tables.” Journal of the Royal Statistical Society: Series B (Methodological) 34 (2): 187–220. https://doi.org/10.1111/j.2517-6161.1972.tb00899.x.
Kaplan, Edward L., and Paul Meier. 1958. “Nonparametric Estimation from Incomplete Observations.” Journal of the American Statistical Association 53 (282): 457–81. https://doi.org/10.1080/01621459.1958.10501452.
Klein, John P., and Melvin L. Moeschberger. 2003. Survival Analysis: Techniques for Censored and Truncated Data. 2nd ed. Springer.