`reglog` <- function(formula, data, subset, ...) { # reglog(grupo~n.edad+sexo+rcal.dia, data=Datos) # Les variables var i dep han de ser factor TNP <- function(var, dep, subset = !is.na(var)) { ta <- table(var[subset], dep[subset]) per <- round(prop.table(ta, margin=2)*100,2) colnames(per) <- rep("%", ncol(per)) tp <- cbind(ta, per)[, order(rep(1:ncol(ta), 2))] tp } `or.interval` <- function(co, se, var, dec=2) { # Funció que retorna l'OR i interval de confiança de la variable categòrica i el OR de tendència, només per la variable que s'analitza # a partir dels coeficients i se # var - Selecciona els OR's i IC a partir de la variable var # Retorna una llista amb or.ic i or.ic.c (matriu tipus caràcter) amb parèntesis els ICs coef.se <- cbind(co, se) # Selecciono els coeficients i se que vull a la taula final coef.se.sel <- matrix(nrow=length(levels(var)), ncol=2) rownames(coef.se.sel) <- levels(var) # Categoria de referència coef.se.sel[1,1] <- 0 i <- 1 for (i in 1:length(levels(var))) { if(paste("var", levels(var)[i], sep="")%in%rownames(coef.se)) { coef.se.sel[levels(var)[i],] <- coef.se[paste("var", levels(var)[i], sep=""),] } } # Afegeixo una fila i els valors de tendència per la variable seleccionada (var) coef.se.sel <- rbind(coef.se.sel, NA, coef.se["as.numeric(var)", ]) or.ci <- cbind(exp(coef.se.sel[,1]), exp(coef.se.sel[,1] - 1.96 * coef.se.sel[,2]), exp(coef.se.sel[,1] + 1.96 * coef.se.sel[,2])) colnames(or.ci) <- c(" OR", "95%", "CI") # Si hi ha algun valor molt gran a la taula final li assigno el valor Inf. or.ci[or.ci>999] <- Inf # Arrodoneixo a dos decimals, per defecte. or.ci <- round(or.ci, dec) or.ci.c <- cbind(or.ci[, 1], paste("(", or.ci[, 2], "-", or.ci[, 3], ")")) colnames(or.ci.c) <- c(" OR", " ( 95% CI ) ") or.ci.c[or.ci.c=="( NA - NA )"] <- "" list(or.ci = or.ci, or.ci.c = or.ci.c) } if(inherits(formula,"formula")){ if (missing(data)) data <- environment(var) mf <- match.call(expand.dots = FALSE) m <- match(c("formula", "data", "subset", "weights", "na.action"), names(mf), 0) mf <- mf[c(1, m)] mf[[1]] <- as.name("model.frame") mf <- eval(mf, parent.frame()) dep <- mf[,1] var <- mf[,2] var.name <- names(mf)[2] var.label <- NULL nterms <- dim(mf)[2] if (nterms>2) { adj <- mf[,3:nterms] adj.names <- names(mf)[3:nterms] } else { adj.names <- NULL adj <- NULL } } dep <- as.factor(dep) var <- as.factor(var) if (is.null(adj)) { x <- glm(dep~var, family = binomial) x.b <- glm(dep~1, family = binomial) x.t <- glm(dep~as.numeric(var), family = binomial) } else { x <- glm(dep~. + var, family = binomial, data=adj) x.b <- glm(dep~., family = binomial, data=adj) x.t <- glm(dep~. + as.numeric(var), family = binomial, data=adj) } # Guardo els coeficients i se, els del model, i el model de tendència coef.se <- rbind(summary(x)$coef[, c("Estimate", "Std. Error")], summary(x.t)$coefficients[, c("Estimate", "Std. Error")]) # Calculo els ORs i ICs, per cada una de les categories de la variable i el OR de tendència or.ci.c <- or.interval(coef.se[,1], coef.se[,2], var)$or.ci.c # Retorna una taula amb les N's i % per columnes tp <- TNP(var, dep) Trend <- c(sum(tp[,1]), NA, sum(tp[,3]), NA) # Ajunto les N's i % amb els ORs i ICs res <- cbind(rbind(tp, NA, Trend), or.ci.c, NA) # Calculo la p d'associació i la de tendència pval.as <- round(anova(x, x.b, test = "Chi")$"P(>|Chi|)"[2], 4) pval.t <- round(anova(x.t, x.b, test = "Chi")$"P(>|Chi|)"[2], 4) colnames(res)[ncol(res)] <- "P-value" res[1, ncol(res)] <- pval.as res[nrow(res), ncol(res)] <- pval.t cat("\n") cat(var.name, var.label,"\n") cat("Adjusted for", adj.names, "\n\n") print(res, quote=F, na.print="", right=T) cat("--------------------------------------------------------\n") }