bivar_add_dic2k <- function(lista, tabla, row, var_code, suffix = "2k", digits = 3, fisher_cut = 5) { if (is.numeric(row)) { r <- tabla[row, , drop = FALSE] } else { r <- tabla[tabla$Variable == row, , drop = FALSE] } if (nrow(r) != 1L) { stop("Se esperaba una unica fila para esa variable en 'tabla'.") } if (!all(c("Min_Expected", "P_Chi", "P_Fisher") %in% names(r))) { stop("La tabla no tiene alguna de las columnas requeridas: Min_Expected, P_Chi, P_Fisher.") } min_exp <- r$Min_Expected use_fisher <- !is.na(min_exp) && min_exp < fisher_cut if (use_fisher) { test_es <- "exacta de Fisher" p_val <- prp(r$P_Fisher) } else { test_es <- "Chi cuadrada" p_val <- prp(r$P_Chi) } or <- r$Odds_Ratio ci_l <- r$CI_Lower ci_u <- r$CI_Upper result <- case_when( as.numeric(p_val) > 0.05 ~ "sin asociación estadísticamente significativa", TRUE | NA ~ "asociación estadísticamente significativa" ) if(is.nan(or)){ or <- "no calculable" }else{ if (is.numeric(or)) or <- round(or, digits) } if(is.nan(ci_l)){ ci_l <- "no calculable" } else{ if (is.numeric(ci_l)) ci_l <- round(ci_l, digits) } if(is.nan(ci_u)){ ci_u <- "no calculable" }else{ if (is.numeric(ci_u)) ci_u <- round(ci_u, digits) } lista[[paste0("test_", var_code)]] <- test_es lista[[paste0("p_", var_code, "_", suffix)]] <- p_val lista[[paste0("est_", var_code, "_", suffix)]] <- or lista[[paste0("cil_", var_code, "_", suffix)]] <- ci_l lista[[paste0("ciu_", var_code, "_", suffix)]] <- ci_u lista[[paste0("res_", var_code, "_", suffix)]] <- result lista }