Created
March 21, 2012 19:18
-
-
Save inkhorn/2151594 to your computer and use it in GitHub Desktop.
Concordance Function for Logistic Regression Models in R
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Assuming the input is a stored binomial GLM object | |
Concordance = function(GLM.binomial) { | |
outcome_and_fitted_col = cbind(GLM.binomial$y, GLM.binomial$fitted.values) | |
# get a subset of outcomes where the event actually happened | |
ones = outcome_and_fitted_col[outcome_and_fitted_col[,1] == 1,] | |
# get a subset of outcomes where the event didn't actually happen | |
zeros = outcome_and_fitted_col[outcome_and_fitted_col[,1] == 0,] | |
# Equate the length of the event and non-event tables | |
if (length(ones[,1])>length(zeros[,1])) {ones = ones[1:length(zeros[,1]),]} | |
else {zeros = zeros[1:length(ones[,1]),]} | |
# Following will be c(ones_outcome, ones_fitted, zeros_outcome, zeros_fitted) | |
ones_and_zeros = data.frame(ones, zeros) | |
# initiate columns to store concordant, discordant, and tie pair evaluations | |
conc = rep(NA, length(ones_and_zeros[,1])) | |
disc = rep(NA, length(ones_and_zeros[,1])) | |
ties = rep(NA, length(ones_and_zeros[,1])) | |
for (i in 1:length(ones_and_zeros[,1])) { | |
# This tests for concordance | |
if (ones_and_zeros[i,2] > ones_and_zeros[i,4]) | |
{conc[i] = 1 | |
disc[i] = 0 | |
ties[i] = 0} | |
# This tests for a tie | |
else if (ones_and_zeros[i,2] == ones_and_zeros[i,4]) | |
{ | |
conc[i] = 0 | |
disc[i] = 0 | |
ties[i] = 1 | |
} | |
# This should catch discordant pairs. | |
else if (ones_and_zeros[i,2] < ones_and_zeros[i,4]) | |
{ | |
conc[i] = 0 | |
disc[i] = 1 | |
ties[i] = 0 | |
} | |
} | |
# Here we save the various rates | |
conc_rate = mean(conc, na.rm=TRUE) | |
disc_rate = mean(disc, na.rm=TRUE) | |
tie_rate = mean(ties, na.rm=TRUE) | |
return(list(concordance=conc_rate, num_concordant=sum(conc), discordance=disc_rate, num_discordant=sum(disc), tie_rate=tie_rate,num_tied=sum(ties))) | |
} |
Hi I just testify this code and find the outcome is wrong, and I check your code, it's wrong to calculate the pairs like yours. Maybe you use a different formula, but you should calculate the percentage of the pairs, which is applied in SAS. FYI
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Please tell me " Assuming the input is a stored binomial GLM object" what it mean?