diff --git a/DESCRIPTION b/DESCRIPTION index b534adf..96e5692 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -9,7 +9,8 @@ Description: Tools for Danish health research. A collection of Depends: R (>= 3.4.4) Imports: broom, dplyr, - epiR + epiR, + ggplot2 License: GPL (>= 2) Encoding: UTF-8 LazyData: true diff --git a/NAMESPACE b/NAMESPACE index 90fefed..ff0d9ca 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -10,10 +10,12 @@ export(dob_extract_cpr) export(hwe_allele) export(hwe_geno) export(hwe_sum) +export(plot_ord_odds) export(rep_biv) export(rep_epi_tests) export(rep_glm) export(rep_lm) +export(rep_olr) export(rep_reg_cie) export(strobe_diff_bygroup) export(strobe_diff_byvar) diff --git a/R/plot_ord_odds.R b/R/plot_ord_odds.R new file mode 100644 index 0000000..32f3bd7 --- /dev/null +++ b/R/plot_ord_odds.R @@ -0,0 +1,39 @@ +#' Forrest plot from ordinal logistic regression +#' +#' Heavily inspired by https://www.r-bloggers.com/plotting-odds-ratios-aka-a-forrestplot-with-ggplot2/ +#' @param x ordinal logistic regression model. +#' @param title plot title +#' @param dec decimals for labels +#' @param lbls labels for variable names. Carefull, as the right order is not checked automatically! +#' @keywords forestplot +#' @export +#' @examples +#' plot_ord_odds() + +plot_ord_odds<-function(x, title = NULL,dec=3,lbls=NULL){ + + require(ggplot2) + + odds<-data.frame(cbind(exp(coef(x)), exp(confint(x)))) + names(odds)<-c("or", "lo", "up") + rodds<-round(odds,digits = dec) + + if (!is.null(lbls)){ + odds$vars<-paste0(v.names," \n",paste0(rodds$or," [",rodds$lo,":",rodds$up,"]")) + } + else { + odds$vars<-paste0(row.names(odds)," \n",paste0(rodds$or," [",rodds$lo,":",rodds$up,"]")) + } + + ticks<-c(seq(.1, 1, by =.1), seq(0, 10, by =1), seq(10, 100, by =10)) + odds$ord<-c(nrow(odds):1) + + ggplot(odds, aes(y= or, x = reorder(vars,ord))) + + geom_point() + + geom_errorbar(aes(ymin=lo, ymax=up), width=.2) + + scale_y_log10(breaks=ticks, labels = ticks) + + geom_hline(yintercept = 1, linetype=2) + + coord_flip() + + labs(title = title, x = "Variables", y = "OR (95 % CI)") + + theme_bw() +} diff --git a/R/rep_glm.R b/R/rep_glm.R index f8e3ab7..f712fff 100644 --- a/R/rep_glm.R +++ b/R/rep_glm.R @@ -81,11 +81,10 @@ rep_glm<-function(meas,vars,string,ci=FALSE,data){ }} - pa<-as.numeric(df[,3]) + pa<-as.numeric(df[,"pv"]) + t <- ifelse(pa<=0.1,"include","drop") + pa<-ifelse(pa<0.001,"<0.001",pa) - - t <- ifelse(pa<=0.1|pa=="<0.001","include","drop") - pa <- ifelse(pa<=0.05|pa=="<0.001",paste0("*",pa), ifelse(pa>0.05&pa<=0.1,paste0(".",pa),pa)) diff --git a/R/rep_olr.R b/R/rep_olr.R new file mode 100644 index 0000000..50f540d --- /dev/null +++ b/R/rep_olr.R @@ -0,0 +1,99 @@ +#' A repeated ordinal logistic regression function +#' +#' @description For bivariate analyses. The confint() function is rather slow, causing the whole function to hang when including many predictors and calculating the ORs with CI. +#' @param meas Effect meassure. Input as c() of columnnames, use dput(). +#' @param vars variables in model. Input as c() of columnnames, use dput(). +#' @param str variables to test. Input as c() of columnnames, use dput(). +#' @param ci flag to get results as OR with 95% confidence interval. +#' @param dta data frame to pull variables from. +#' @keywords olr ordinal logistic regression +#' @export +#' @examples +#' rep_olr() + + +rep_olr<-function(meas,vars,string,ci=FALSE,data){ + + require(broom) + require(MASS) + + d<-data + x<-data.frame(d[,c(string)]) + v<-data.frame(d[,c(vars)]) + names(v)<-c(vars) + y<-d[,c(meas)] + dt<-cbind(y,v) + m1<-length(coef(polr(y~.,data = dt,Hess=TRUE))) + + if (!is.factor(y)){stop("y should be a factor!")} + + if (ci==TRUE){ + + df<-data.frame(matrix(ncol = 3)) + names(df)<-c("pred","or_ci","pv") + + for(i in 1:ncol(x)){ + dat<-cbind(dt,x[,i]) + m<-polr(y~.,data=dat,Hess=TRUE) + + ctable <- coef(summary(m)) + + l<-suppressMessages(round(exp(confint(m))[-c(1:m1),1],2)) + u<-suppressMessages(round(exp(confint(m))[-c(1:m1),2],2)) + or<-round(exp(coef(m))[-c(1:m1)],2) + or_ci<-paste0(or," (",l," to ",u,")") + + p <- (pnorm(abs(ctable[, "t value"]), lower.tail = FALSE) * 2)[1:length(coef(m))] + pv<-round(p[-c(1:m1)],3) + + + x1<-x[,i] + + if (is.factor(x1)){ + pred<-paste(names(x)[i],levels(x1)[-1],sep = "_")} + + else {pred<-names(x)[i]} + + df<-rbind(df,cbind(pred,or_ci,pv)) + }} + + if (ci==FALSE){ + + df<-data.frame(matrix(ncol = 3)) + names(df)<-c("pred","b","pv") + + for(i in 1:ncol(x)){ + dat<-cbind(dt,x[,i]) + m<-polr(y~.,data=dat,Hess=TRUE) + + b<-round(coef(m)[-c(1:m1)],2) + + p <- (pnorm(abs(ctable[, "t value"]), lower.tail = FALSE) * 2)[1:length(coef(m))] + pv<-round(p[-c(1:m1)],3) + + x1<-x[,i] + + if (is.factor(x1)){ + pred<-paste(names(x)[i],levels(x1)[-1],sep = "_") + } + + else {pred<-names(x)[i]} + + df<-rbind(df,cbind(pred,b,pv)) + + }} + + pa<-as.numeric(df[,c("pv")]) + t <- ifelse(pa<=0.1,"include","drop") + pa<-ifelse(pa<0.001,"<0.001",pa) + pa <- ifelse(pa<=0.05|pa=="<0.001",paste0("*",pa), + ifelse(pa>0.05&pa<=0.1,paste0(".",pa),pa)) + + r<-data.frame(df[,1:2],pa,t)[-1,] + + return(r) +} + + + + diff --git a/man/plot_ord_odds.Rd b/man/plot_ord_odds.Rd new file mode 100644 index 0000000..fbe20aa --- /dev/null +++ b/man/plot_ord_odds.Rd @@ -0,0 +1,24 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/plot_ord_odds.R +\name{plot_ord_odds} +\alias{plot_ord_odds} +\title{Forrest plot from ordinal logistic regression} +\usage{ +plot_ord_odds(x, title = NULL, dec = 3, lbls = NULL) +} +\arguments{ +\item{x}{ordinal logistic regression model.} + +\item{title}{plot title} + +\item{dec}{decimals for labels} + +\item{lbls}{labels for variable names. Carefull, as the right order is not checked automatically!} +} +\description{ +Heavily inspired by https://www.r-bloggers.com/plotting-odds-ratios-aka-a-forrestplot-with-ggplot2/ +} +\examples{ +plot_ord_odds() +} +\keyword{forestplot} diff --git a/man/rep_olr.Rd b/man/rep_olr.Rd new file mode 100644 index 0000000..7cec8e1 --- /dev/null +++ b/man/rep_olr.Rd @@ -0,0 +1,29 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/rep_olr.R +\name{rep_olr} +\alias{rep_olr} +\title{A repeated ordinal logistic regression function} +\usage{ +rep_olr(meas, vars, string, ci = FALSE, data) +} +\arguments{ +\item{meas}{Effect meassure. Input as c() of columnnames, use dput().} + +\item{vars}{variables in model. Input as c() of columnnames, use dput().} + +\item{ci}{flag to get results as OR with 95% confidence interval.} + +\item{str}{variables to test. Input as c() of columnnames, use dput().} + +\item{dta}{data frame to pull variables from.} +} +\description{ +For bivariate analyses. The confint() function is rather slow, causing the whole function to hang when including many predictors and calculating the ORs with CI. +} +\examples{ + rep_olr() +} +\keyword{logistic} +\keyword{olr} +\keyword{ordinal} +\keyword{regression}