Introduction to R package survivalisttoo

library(survivalisttoo) # this package
library(glmnet)
library(survival)

data(pbc)
pbc2       <- pbc[!is.na(pbc$trt), ]
pbc2$event <- as.integer(pbc$status[!is.na(pbc$trt)] == 2)
pbc2$sex_n <- as.integer(pbc2$sex == "f")

feat_cols <- c("trt","age","sex_n","ascites","hepato","spiders","edema",
               "bili","chol","albumin","copper","alk.phos","ast",
               "trig","platelet","protime","stage")

df <- pbc2[, c("time", "event", feat_cols)]
for (col in feat_cols)
  if (any(is.na(df[[col]])))
    df[[col]][is.na(df[[col]])] <- median(df[[col]], na.rm = TRUE)

set.seed(42)
idx_train <- sample(nrow(df), floor(0.75 * nrow(df)))
train <- df[idx_train, ]; test <- df[-idx_train, ]
X_tr  <- as.matrix(train[, feat_cols])
X_te  <- as.matrix(test[,  feat_cols])

regr_lm <- function(X, y, ...) lm(y ~ ., data = data.frame(X, y = y))

fit_boost_lm <- survivalisttoo::cox_gradient_boost(X_tr, train$time, train$event, 
                                                   regr_lm, show_progress = FALSE)
fit_cox      <- coxph(Surv(time, event) ~ .,
                      data = train[, c("time","event",feat_cols)], x = TRUE)

y_te   <- Surv(test$time, test$event)
ci_blm <- glmnet::Cindex(predict(fit_boost_lm, X_te), y_te)
ci_cox <- glmnet::Cindex(predict(fit_cox, newdata = test),  y_te)

cat("\n=== Test-set C-index ===\n")
## 
## === Test-set C-index ===
cat(sprintf("  CoxBoost (LM, M=100): %.4f\n", ci_blm))
##   CoxBoost (LM, M=100): 0.8063
cat(sprintf("  Classical Cox PH    : %.4f\n", ci_cox))
##   Classical Cox PH    : 0.8069
library(survivalisttoo) # this package
library(glmnet)
library(survival)

data(pbc)
pbc2       <- pbc[!is.na(pbc$trt), ]
pbc2$event <- as.integer(pbc$status[!is.na(pbc$trt)] == 2)
pbc2$sex_n <- as.integer(pbc2$sex == "f")

feat_cols <- c("trt","age","sex_n","ascites","hepato","spiders","edema",
               "bili","chol","albumin","copper","alk.phos","ast",
               "trig","platelet","protime","stage")

df <- pbc2[, c("time", "event", feat_cols)]
for (col in feat_cols)
  if (any(is.na(df[[col]])))
    df[[col]][is.na(df[[col]])] <- median(df[[col]], na.rm = TRUE)

set.seed(42)
idx_train <- sample(nrow(df), floor(0.75 * nrow(df)))
train <- df[idx_train, ]; test <- df[-idx_train, ]
X_tr  <- as.matrix(train[, feat_cols])
X_te  <- as.matrix(test[,  feat_cols])

fit_boost_lm <- survivalisttoo::cox_gradient_boost(X=X_tr, time=train$time, event=train$event, 
                                                   regr_fun=glmnet::glmnet, 
                                                   alpha=0.1, lambda=0.01,
                                                   M=1, nu=1)
## Iter 1/1 [==================================================] 100% ETA 0s
y_te   <- Surv(test$time, test$event)
ci_blm <- glmnet::Cindex(predict(fit_boost_lm, X_te), y_te)

cat("\n=== Test-set C-index ===\n")
## 
## === Test-set C-index ===
cat(sprintf("  CoxBoost (LM, M=100): %.4f\n", ci_blm))
##   CoxBoost (LM, M=100): 0.8027