Skip to content
Open
4 changes: 4 additions & 0 deletions NAMESPACE
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,10 @@ export(get_hierarchical_clusters)
export(get_robust_colocalization)
export(get_robust_ucos)
export(get_ucos_summary)
importFrom(Rfast,correls)
importFrom(Rfast,med)
importFrom(Rfast,standardise)
importFrom(Rfast,upper_tri)
importFrom(grDevices,adjustcolor)
importFrom(graphics,abline)
importFrom(graphics,axis)
Expand Down
154 changes: 115 additions & 39 deletions R/colocboost.R

Large diffs are not rendered by default.

12 changes: 11 additions & 1 deletion R/colocboost_assemble.R
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,8 @@ colocboost_assemble <- function(cb_obj,
median_cos_abs_corr = 0.8,
weaker_effect = TRUE,
merge_cos = TRUE,
residual_correlation = NULL,
use_entropy = FALSE,
tol = 1e-9,
output_level = 1) {
if (!inherits(cb_obj, "colocboost")) {
Expand Down Expand Up @@ -84,6 +86,7 @@ colocboost_assemble <- function(cb_obj,
cb_obj <- get_max_profile(cb_obj, check_null_max = check_null_max,
check_null_max_ucos = check_null_max_ucos,
check_null_method = check_null_method)

# --------- about colocalized confidence sets ---------------------------------
out_cos <- colocboost_assemble_cos(cb_obj,
coverage = coverage,
Expand All @@ -98,6 +101,8 @@ colocboost_assemble <- function(cb_obj,
median_abs_corr = median_abs_corr,
min_cluster_corr = min_cluster_corr,
median_cos_abs_corr = median_cos_abs_corr,
use_entropy = use_entropy,
residual_correlation = residual_correlation,
tol = tol
)

Expand Down Expand Up @@ -132,10 +137,13 @@ colocboost_assemble <- function(cb_obj,
}
}
if (!is.null(cb_obj_single$cb_data$data[[1]][["XtY"]])) {
X_dict <- cb_obj$cb_data$dict[i]
if (is.null(cb_obj_single$cb_data$data[[1]]$XtX)) {
X_dict <- cb_obj$cb_data$dict[i]
cb_obj_single$cb_data$data[[1]]$XtX <- cb_obj$cb_data$data[[X_dict]]$XtX
}
if (is.null(cb_obj_single$cb_data$data[[1]]$ref_label)) {
cb_obj_single$cb_data$data[[1]]$ref_label <- cb_obj$cb_data$data[[X_dict]]$ref_label
}
}
class(cb_obj_single) <- "colocboost"
out_ucos_each <- colocboost_assemble_ucos(cb_obj_single,
Expand Down Expand Up @@ -208,6 +216,8 @@ colocboost_assemble <- function(cb_obj,

############# - extract colocboost output - ####################
# - colocalization results
cb_obj$cb_model_para$use_entropy <- use_entropy
cb_obj$cb_model_para$residual_correlation <- residual_correlation
cb_obj$cb_model_para$weight_fudge_factor <- weight_fudge_factor
cb_obj$cb_model_para$coverage <- coverage
cb_obj$cb_model_para$min_abs_corr <- min_abs_corr
Expand Down
29 changes: 20 additions & 9 deletions R/colocboost_assemble_cos.R
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ colocboost_assemble_cos <- function(cb_obj,
median_abs_corr = NULL,
min_cluster_corr = 0.8,
median_cos_abs_corr = 0.8,
use_entropy = FALSE,
residual_correlation = NULL,
tol = 1e-9) {
if (!inherits(cb_obj, "colocboost")) {
stop("Input must from colocboost function!")
Expand Down Expand Up @@ -43,7 +45,8 @@ colocboost_assemble_cos <- function(cb_obj,
X = cb_data$data[[X_dict]]$X, Xcorr = cb_data$data[[X_dict]]$XtX,
N = cb_data$data[[coloc_outcomes[iiii]]]$N, n = n_purity, coverage = sec_coverage_thresh,
min_abs_corr = min_abs_corr, median_abs_corr = median_abs_corr,
miss_idx = cb_data$data[[coloc_outcomes[iiii]]]$variable_miss
miss_idx = cb_data$data[[coloc_outcomes[iiii]]]$variable_miss,
ref_label = cb_data$data[[X_dict]]$ref_label
)
check_purity[iiii] <- length(tmp) == 1
}
Expand All @@ -53,7 +56,8 @@ colocboost_assemble_cos <- function(cb_obj,
pos_purity <- which(check_purity)
avWeight <- avWeight[, pos_purity, drop = FALSE]
coloc_outcomes <- coloc_outcomes[pos_purity]
weights <- get_integrated_weight(avWeight, weight_fudge_factor = weight_fudge_factor)
weights <- get_integrated_weight(avWeight, weight_fudge_factor = weight_fudge_factor,
use_entropy = use_entropy, residual_correlation = residual_correlation)
coloc_cos <- get_in_cos(weights, coverage = coverage)
evidence_strength <- sum(weights[coloc_cos[[1]]])

Expand Down Expand Up @@ -83,7 +87,8 @@ colocboost_assemble_cos <- function(cb_obj,
p_tmp <- matrix(get_purity(pos,
X = cb_data$data[[X_dict]]$X,
Xcorr = cb_data$data[[X_dict]]$XtX,
N = cb_data$data[[i]]$N, n = n_purity
N = cb_data$data[[i]]$N, n = n_purity,
ref_label = cb_data$data[[X_dict]]$ref_label
), 1, 3)
purity <- c(purity, list(p_tmp))
}
Expand Down Expand Up @@ -148,7 +153,8 @@ colocboost_assemble_cos <- function(cb_obj,
X = cb_data$data[[X_dict]]$X, Xcorr = cb_data$data[[X_dict]]$XtX,
N = cb_data$data[[coloc_outcomes[iiii]]]$N, n = n_purity, coverage = sec_coverage_thresh,
min_abs_corr = min_abs_corr, median_abs_corr = median_abs_corr,
miss_idx = cb_data$data[[coloc_outcomes[iiii]]]$variable_miss
miss_idx = cb_data$data[[coloc_outcomes[iiii]]]$variable_miss,
ref_label = cb_data$data[[X_dict]]$ref_label
)
check_purity[iiii] <- length(tmp) == 1
}
Expand All @@ -158,7 +164,8 @@ colocboost_assemble_cos <- function(cb_obj,
pos_purity <- which(check_purity)
avWeight <- avWeight[, pos_purity, drop = FALSE]
coloc_outcomes <- coloc_outcomes[pos_purity]
weights <- get_integrated_weight(avWeight, weight_fudge_factor = weight_fudge_factor)
weights <- get_integrated_weight(avWeight, weight_fudge_factor = weight_fudge_factor,
use_entropy = use_entropy, residual_correlation = residual_correlation)
coloc_cos <- get_in_cos(weights, coverage = coverage)
evidence_strength <- sum(weights[coloc_cos[[1]]])

Expand Down Expand Up @@ -208,7 +215,8 @@ colocboost_assemble_cos <- function(cb_obj,
X = cb_data$data[[X_dict]]$X, Xcorr = cb_data$data[[X_dict]]$XtX,
N = cb_data$data[[coloc_outcomes[iiii]]]$N, n = n_purity, coverage = sec_coverage_thresh,
min_abs_corr = min_abs_corr, median_abs_corr = median_abs_corr,
miss_idx = cb_data$data[[coloc_outcomes[iiii]]]$variable_miss
miss_idx = cb_data$data[[coloc_outcomes[iiii]]]$variable_miss,
ref_label = cb_data$data[[X_dict]]$ref_label
)
check_purity[[iiii]] <- tmp
}
Expand Down Expand Up @@ -245,7 +253,8 @@ colocboost_assemble_cos <- function(cb_obj,
for (i.w in 1:length(avWeight_coloc)) {
w <- avWeight_coloc[[i.w]]
if (sum(w) != 0) {
weights <- get_integrated_weight(w, weight_fudge_factor = weight_fudge_factor)
weights <- get_integrated_weight(w, weight_fudge_factor = weight_fudge_factor,
use_entropy = use_entropy, residual_correlation = residual_correlation)
csets <- get_in_cos(weights, coverage = coverage)
coloc_cos[[fl]] <- unlist(csets)
evidence_strength[[fl]] <- sum(weights[coloc_cos[[fl]]])
Expand Down Expand Up @@ -351,7 +360,8 @@ colocboost_assemble_cos <- function(cb_obj,
X = cb_data$data[[X_dict]]$X,
Xcorr = cb_data$data[[X_dict]]$XtX,
miss_idx = cb_data$data[[i]]$variable_miss,
P = cb_model_para$P
P = cb_model_para$P,
ref_label = cb_data$data[[X_dict]]$ref_label
)
}
res <- Reduce(pmax, res)
Expand Down Expand Up @@ -438,7 +448,8 @@ colocboost_assemble_cos <- function(cb_obj,
tmp <- matrix(get_purity(pos,
X = cb_data$data[[X_dict]]$X,
Xcorr = cb_data$data[[X_dict]]$XtX,
N = cb_data$data[[i3]]$N, n = n_purity
N = cb_data$data[[i3]]$N, n = n_purity,
ref_label = cb_data$data[[X_dict]]$ref_label
), 1, 3)
p_tmp <- rbind(p_tmp, tmp)
}
Expand Down
12 changes: 8 additions & 4 deletions R/colocboost_assemble_ucos.R
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,8 @@ colocboost_assemble_ucos <- function(cb_obj_single,
}
purity <- matrix(get_purity(pos,
X = cb_data$data[[1]]$X, Xcorr = cb_data$data[[1]]$XtX,
N = cb_data$data[[1]]$N, n = n_purity
N = cb_data$data[[1]]$N, n = n_purity,
ref_label = cb_data$data[[1]]$ref_label
), 1, 3)
purity <- as.data.frame(purity)
colnames(purity) <- c("min_abs_corr", "mean_abs_corr", "median_abs_corr")
Expand Down Expand Up @@ -131,7 +132,8 @@ colocboost_assemble_ucos <- function(cb_obj_single,
X = cb_data$data[[1]]$X, Xcorr = cb_data$data[[1]]$XtX,
N = cb_data$data[[1]]$N, n = n_purity, coverage = coverage,
min_abs_corr = min_abs_corr, median_abs_corr = median_abs_corr,
miss_idx = cb_data$data[[1]]$variable_miss
miss_idx = cb_data$data[[1]]$variable_miss,
ref_label = cb_data$data[[1]]$ref_label
)
if (length(check_purity) != 0) {
w <- w[check_purity]
Expand Down Expand Up @@ -237,7 +239,8 @@ colocboost_assemble_ucos <- function(cb_obj_single,
X = cb_data$data[[1]]$X,
Xcorr = cb_data$data[[1]]$XtX,
miss_idx = cb_data$data[[1]]$variable_miss,
P = cb_model_para$P
P = cb_model_para$P,
ref_label = cb_data$data[[1]]$ref_label
)
min_between[i.between, j.between] <- min_between[j.between, i.between] <- res[1]
max_between[i.between, j.between] <- max_between[j.between, i.between] <- res[2]
Expand Down Expand Up @@ -301,7 +304,8 @@ colocboost_assemble_ucos <- function(cb_obj_single,
purity,
matrix(get_purity(pos,
X = cb_data$data[[1]]$X, Xcorr = cb_data$data[[1]]$XtX,
N = cb_data$data[[1]]$N, n = n_purity
N = cb_data$data[[1]]$N, n = n_purity,
ref_label = cb_data$data[[1]]$ref_label
), 1, 3)
)
}
Expand Down
67 changes: 43 additions & 24 deletions R/colocboost_check_update_jk.R
Original file line number Diff line number Diff line change
Expand Up @@ -61,13 +61,10 @@ boost_check_update_jk_nofocal <- function(cb_model, cb_model_para, cb_data) {
model_update <- cb_model[pos.update]
# data_update = cb_data$data[pos.update]
X_dict <- cb_data$dict[pos.update]
# adj_dependence
adj_dep <- sapply(pos.update, function(ii) cb_data$data[[ii]]$dependency)

# -- define jk and jk_each
cor_vals_each <- do.call(cbind, lapply(model_update, function(cc) cc$correlation))
# abs_cor_vals_each <- sweep(abs(cor_vals_each), 2, adj_dep, `*`)
abs_cor_vals_each <- abs(cor_vals_each) * rep(adj_dep, each = nrow(cor_vals_each))
abs_cor_vals_each <- abs(cor_vals_each)
abs_cor_vals <- rowSums(abs_cor_vals_each)

# jk <- which(abs_cor_vals == max(abs_cor_vals))
Expand Down Expand Up @@ -122,7 +119,9 @@ boost_check_update_jk_nofocal <- function(cb_model, cb_model_para, cb_data) {
YtY = data_update[[ii]]$YtY,
XtY = data_update[[ii]]$XtY,
beta_k = model_update[[ii]]$beta,
miss_idx = data_update[[ii]]$variable_miss
miss_idx = data_update[[ii]]$variable_miss,
ref_label = cb_data$data[[X_dict[ii]]]$ref_label,
XtX_beta_cache = model_update[[ii]]$XtX_beta_cache
)
})
change_res_each <- as.numeric(unlist(change_res_each))
Expand Down Expand Up @@ -197,7 +196,9 @@ boost_check_update_jk_nofocal <- function(cb_model, cb_model_para, cb_data) {
YtY = data_update[[ii]]$YtY,
XtY = data_update[[ii]]$XtY,
beta_k = model_update[[ii]]$beta,
miss_idx = data_update[[ii]]$variable_miss
miss_idx = data_update[[ii]]$variable_miss,
ref_label = cb_data$data[[X_dict[ii]]]$ref_label,
XtX_beta_cache = model_update[[ii]]$XtX_beta_cache
)
})
change_res_each <- as.numeric(unlist(change_res_each))
Expand Down Expand Up @@ -241,7 +242,9 @@ boost_check_update_jk_nofocal <- function(cb_model, cb_model_para, cb_data) {
YtY = data_update[[ii]]$YtY,
XtY = data_update[[ii]]$XtY,
beta_k = model_update[[ii]]$beta,
miss_idx = data_update[[ii]]$variable_miss
miss_idx = data_update[[ii]]$variable_miss,
ref_label = cb_data$data[[X_dict[ii]]]$ref_label,
XtX_beta_cache = model_update[[ii]]$XtX_beta_cache
)
})
change_res_each <- as.numeric(unlist(change_res_each))
Expand Down Expand Up @@ -346,13 +349,10 @@ boost_check_update_jk_focal <- function(cb_model, cb_model_para, cb_data,
model_update <- cb_model[pos.update]
# data_update = cb_data$data[pos.update]
X_dict <- cb_data$dict[pos.update]
# adj_dependence
adj_dep <- sapply(pos.update, function(ii) cb_data$data[[ii]]$dependency)

# -- define jk and jk_each
cor_vals_each <- do.call(cbind, lapply(model_update, function(cc) as.vector(cc$correlation)))
# abs_cor_vals_each <- sweep(abs(cor_vals_each), 2, adj_dep, `*`)
abs_cor_vals_each <- abs(cor_vals_each) * rep(adj_dep, each = nrow(cor_vals_each))
abs_cor_vals_each <- abs(cor_vals_each)
# jk_each <- apply(abs_cor_vals_each, 2, which.max)
jk_each <- sapply(1:ncol(abs_cor_vals_each), function(j) which.max(abs_cor_vals_each[, j]))
pp_focal <- which(pos.update == focal_outcome_idx)
Expand All @@ -368,7 +368,8 @@ boost_check_update_jk_focal <- function(cb_model, cb_model_para, cb_data,
X = cb_data$data[[X_dict[pp_focal]]]$X,
XtX = cb_data$data[[X_dict[pp_focal]]]$XtX,
N = cb_data$data[[X_dict[pp_focal]]]$N,
remain_jk = 1:cb_model_para$P
remain_jk = 1:cb_model_para$P,
ref_label = cb_data$data[[X_dict[pp_focal]]]$ref_label
)
})
# ----- second, if within the same LD buddies, select the following variants
Expand All @@ -379,7 +380,8 @@ boost_check_update_jk_focal <- function(cb_model, cb_model_para, cb_data,
# ----- third, if picked variant within the same LD buddies
ld_tmp <- get_LD_jk1_jk2(jk_focal, jk_focal_tmp,
XtX = cb_data$data[[X_dict[pp_focal]]]$XtX,
remain_jk = 1:cb_model_para$P
remain_jk = 1:cb_model_para$P,
ref_label = cb_data$data[[X_dict[pp_focal]]]$ref_label
)
if (ld_tmp > jk_equiv_corr) {
jk_focal <- jk_focal_tmp
Expand Down Expand Up @@ -491,20 +493,26 @@ boost_check_update_jk_focal <- function(cb_model, cb_model_para, cb_data,
#' @importFrom stats cor
get_LD_jk1_jk2 <- function(jk1, jk2,
X = NULL, XtX = NULL, N = NULL,
remain_jk = NULL) {
remain_jk = NULL, ref_label = "LD") {
if (!is.null(X)) {
LD_temp <- suppressWarnings({
get_cormat(X[, c(jk1, jk2)])
})
LD_temp[which(is.na(LD_temp))] <- 0
LD_temp <- LD_temp[1, 2]
} else if (!is.null(XtX)) {
if (length(XtX) == 1){
if (identical(ref_label, "No_ref")) {
LD_temp <- 0
} else {
jk1.remain <- match(jk1, remain_jk)
jk2.remain <- match(jk2, remain_jk)
LD_temp <- XtX[jk1.remain, jk2.remain]
if (identical(ref_label, "X_ref")) {
LD_temp <- suppressWarnings({ get_cormat(XtX[, c(jk1.remain, jk2.remain)]) })
LD_temp[which(is.na(LD_temp))] <- 0
LD_temp <- LD_temp[1, 2]
} else {
LD_temp <- XtX[jk1.remain, jk2.remain]
}
}
}
return(LD_temp)
Expand All @@ -528,7 +536,8 @@ check_jk_jkeach <- function(jk, jk_each,
X = cb_data$data[[X_dict[i]]]$X,
XtX = cb_data$data[[X_dict[i]]]$XtX,
N = data_update[[i]]$N,
remain_jk = setdiff(1:length(model_update[[i]]$res), data_update[[i]]$variable_miss)
remain_jk = setdiff(1:length(model_update[[i]]$res), data_update[[i]]$variable_miss),
ref_label = cb_data$data[[X_dict[i]]]$ref_label
)
judge[i] <- (change_each <= jk_equiv_loglik) & (abs(LD_temp) >= jk_equiv_corr)
} else {
Expand All @@ -549,19 +558,23 @@ check_pair_jkeach <- function(jk_each,
#' @importFrom stats cor
get_LD_jk_each <- function(jk_each,
X = NULL, XtX = NULL, N = NULL,
remain_jk = NULL) {
remain_jk = NULL, ref_label = "LD") {
if (!is.null(X)) {
LD_temp <- suppressWarnings({
get_cormat(X[, jk_each])
})
LD_temp[which(is.na(LD_temp))] <- 0
# LD_temp <- LD_temp[1, 2]
} else if (!is.null(XtX)) {
if (length(XtX) == 1){
if (identical(ref_label, "No_ref")) {
LD_temp <- matrix(0, length(jk_each), length(jk_each))
} else {
jk.remain <- match(jk_each, remain_jk)
LD_temp <- XtX[jk.remain, jk.remain]
if (identical(ref_label, "X_ref")) {
LD_temp <- suppressWarnings({ get_cormat(XtX[, jk.remain]) })
} else {
LD_temp <- XtX[jk.remain, jk.remain]
}
LD_temp[which(is.na(LD_temp))] <- 0
}
}
Expand All @@ -582,7 +595,8 @@ check_pair_jkeach <- function(jk_each,
X = cb_data$data[[X_dict[idx]]]$X,
XtX = cb_data$data[[X_dict[idx]]]$XtX,
N = data_update[[idx]]$N,
remain_jk = setdiff(1:length(model_update[[idx]]$res), data_update[[idx]]$variable_miss)
remain_jk = setdiff(1:length(model_update[[idx]]$res), data_update[[idx]]$variable_miss),
ref_label = cb_data$data[[X_dict[idx]]]$ref_label
)
})

Expand Down Expand Up @@ -612,7 +626,9 @@ estimate_change_profile_res <- function(jk,
X = NULL, res = NULL, N = NULL,
XtX = NULL, YtY = NULL, XtY = NULL,
beta_k = NULL,
miss_idx = NULL) {
miss_idx = NULL,
ref_label = "LD",
XtX_beta_cache = NULL) {
if (!is.null(X)) {
rtr <- sum(res^2) / (N - 1)
xtr <- t(X[, jk]) %*% res / (N - 1)
Expand All @@ -629,10 +645,13 @@ estimate_change_profile_res <- function(jk,
} else {
xty <- XtY / scaling_factor
}
if (length(xtx) == 1){
if (identical(ref_label, "No_ref")) {
rtr <- yty - 2 * sum(beta_k * xty) + sum(beta_k^2)
} else if (!is.null(XtX_beta_cache)) {
rtr <- yty - 2 * sum(beta_k * xty) + sum(XtX_beta_cache * beta_k)
} else {
rtr <- yty - 2 * sum(beta_k * xty) + sum((xtx %*% as.matrix(beta_k)) * beta_k)
XtX_beta <- compute_XtX_product(xtx, beta_k, ref_label)
rtr <- yty - 2 * sum(beta_k * xty) + sum(XtX_beta * beta_k)
}
}
numerator <- xtr^2 / (2 * rtr)
Expand Down
Loading