Skip to content

Instantly share code, notes, and snippets.

@gaballench

gaballench/odds.R

Last active Nov 17, 2015
Embed
What would you like to do?
Odds ratio, distance and relative chance in contingency tables
# Written by Gustavo A. Ballen (gaballench at gmail.com)
# https://github.com/gaballench
# The input for this function is a contingency table of class 'xtabs' or 'table' with exposure in rows and cases in columns.
# Internally it uses the 'pi' notation, or for those using ABCD notation there is an equivalence below:
## Model table is as follows
# illness
# exp NO YES
# NO D(1-pi0) C(1-pi1)
# YES B(pi0) A(pi1)
# The function presents two arguments. 'data' for the object to be analized, and outcome, a string with three posibilities:
# 'distance', 'relative' (default), and 'ratio'.
# For 'distance' the formula d = pi1 - pi0 is returned
# For 'relative' the quotient (i.e., relative risk) r = pi1/pi0 is returned
# For 'ratio' the odds ratio is returned
# For further details consult Szumilas, M (2010) available below:
# http://www.ncbi.nlm.nih.gov/pmc/articles/PMC2938757/
odds <- function(data, outcome = "relative") {
margins = apply(data, 1, FUN = sum)
#marginsCol = apply(data, 2, FUN = sum)
pi0 = data[2, 1]/margins[2]
pi1 = data[2, 2]/margins[2]
minuspi0 = data[1, 1]/margins[1] # 1 - pi0
minuspi1 = data[1, 2]/margins[1] # 1 - pi1
d = pi1 - pi0
r = pi1/pi0
omega0 = pi0/minuspi0
omega1 = pi1/minuspi1
omega = omega1/omega0
prevalence = marginsCol[2]/sum(marginsCol)
sensitivity = pi1/(pi1+minuspi1)
specificity = minuspi0/(minuspi1+pi0)
pos_pred_val = pi1/(pi1+pi0)
neg_pred_val = minuspi0/(minuspi0+minuspi1)
if(outcome == "ratio") {
return(omega)
}
if(outcome == "distance"){
return(d)
}
if(outcome == "relative") {
return(r)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment