base_efron <- function(y_test, y_test_pred) { time = y_test[,1] event = y_test[,2] y_pred = y_test_pred n = length(time) sort_index = order(time, decreasing = F) time = time[sort_index] event = event[sort_index] y_pred = y_pred[sort_index] time_event = time * event unique_ftime = unique(time[event!=0]) m = length(unique_ftime) tie_count = as.numeric(table(time[event!=0])) ind_matrix = matrix(rep(time, times = length(time)), ncol = length(time)) - t(matrix(rep(time, times = length(time)), ncol = length(time))) ind_matrix = (ind_matrix == 0) ind_matrix[ind_matrix == TRUE] = 1 time_count = as.numeric(cumsum(table(time))) ind_matrix = ind_matrix[time_count,] tie_haz = exp(y_pred) * event tie_haz = ind_matrix %*% matrix(tie_haz, ncol = 1) event_index = which(tie_haz!=0) tie_haz = tie_haz[event_index,] cum_haz = (ind_matrix %*% matrix(exp(y_pred), ncol = 1)) cum_haz = rev(cumsum(rev(cum_haz))) cum_haz = cum_haz[event_index] base_haz = c() j = 1 while(j < m+1) { l = tie_count[j] J = seq(from = 0, to = l-1, length.out = l)/l Dm = cum_haz[j] - J*tie_haz[j] Dm = 1/Dm Dm = sum(Dm) base_haz = c(base_haz, Dm) j = j+1 } base_haz = cumsum(base_haz) base_haz_all = unlist( sapply(time, function(x){ if else( sum(unique_ftime <= x) == 0, 0, base_haz[ unique_ftime==max(unique_ftime[which(unique_ftime <= x)])])}), use.names = F) if (length(base_haz_all) < length(time)) { base_haz_all <- c(rep(0, length(time) - length(base_haz_all)), base_haz_all) } return(list(cumhazard = unique(data.frame(hazard=base_haz_all, time = time)), survival = unique(data.frame(surv=exp(-base_haz_all), time = time)))) }改成python代码
时间: 2024-04-19 17:26:52 浏览: 113
An Introduction to the Bootstrap_Efron
def base_efron(y_test, y_test_pred):
time = y_test[:, 0]
event = y_test[:, 1]
y_pred = y_test_pred
n = len(time)
sort_index = np.argsort(time)
time = time[sort_index]
event = event[sort_index]
y_pred = y_pred[sort_index]
time_event = time * event
unique_ftime = np.unique(time[event != 0])
m = len(unique_ftime)
tie_count = np.asarray(np.histogram(time[event != 0])[0])
ind_matrix = np.tile(time, (n, 1)) - np.tile(time, (n, 1)).T
ind_matrix = (ind_matrix == 0).astype(int)
time_count = np.cumsum(np.bincount(time.astype(int)))
ind_matrix = ind_matrix[time_count, :]
tie_haz = np.exp(y_pred) * event
tie_haz = ind_matrix @ tie_haz
event_index = np.where(tie_haz != 0)[0]
tie_haz = tie_haz[event_index]
cum_haz = ind_matrix @ np.exp(y_pred)
cum_haz = np.flip(np.cumsum(np.flip(cum_haz)))
cum_haz = cum_haz[event_index]
base_haz = []
j = 0
while j < m:
l = tie_count[j]
J = np.linspace(0, l-1, l) / l
Dm = cum_haz[j] - J * tie_haz[j]
Dm = 1 / Dm
Dm = np.sum(Dm)
base_haz.append(Dm)
j += 1
base_haz = np.cumsum(base_haz)
base_haz_all = np.zeros_like(time)
for i, x in enumerate(time):
if np.sum(unique_ftime <= x) == 0:
base_haz_all[i] = 0
else:
base_haz_all[i] = base_haz[np.max(np.where(unique_ftime <= x))]
return {'cumhazard': np.unique(np.column_stack((base_haz_all, time)), axis=0),
'survival': np.unique(np.column_stack((np.exp(-base_haz_all), time)), axis=0)}
阅读全文