Binomial logistic regression has upper and lower asymptotes of 1 and 0 respectively. However, accuracy data (just as an example) may have upper and lower asymptotes vastly different to 1 and/or 0. I can see three potential solutions to this:
- Don't worry about it if you are getting good fits within the area of interest. If you aren't getting good fits then:
- Transform the data so that the minimum and maximum number of correct responses in the sample give proportions of 0 and 1 (instead of say 0 and 0.15).
- Use non-linear regression so that you can either specify the asymptotes or have the fitter do it for you.
It seems to me that options 1 & 2 would be preferred over option 3 largely for simplicity reasons, in which case option 3 is perhaps the better option because it can yield more information?
Here's an example. Total possible correct for accuracy is 100, but the maximum accuracy in this case is ~ 15.
accuracy <- c(0,0,0,0,0,1,3,5,9,13,14,15,14,15,16,15,14,14,15) x<-1:length(accuracy) glmx<-glm(cbind(accuracy, 100-accuracy) ~ x, family=binomial) ndf<- data.frame(x=x) ndf$fit<-predict(glmx, newdata=ndf, type="response") plot(accuracy/100 ~ x) with(ndf, lines(fit ~ x))
Option 2 (as per comments and to clarify my meaning) would then be the model
glmx2<-glm(cbind(accuracy, 16-accuracy) ~ x, family=binomial)
Option 3 (for completeness) would be something akin to:
fitnls<-nls(accuracy ~ upAsym + (y0 - upAsym)/(1 + (x/midPoint)^slope), start = list("upAsym" = max(accuracy), "y0" = 0, "midPoint" = 10, "slope" = 5), lower = list("upAsym" = 0, "y0" = 0, "midPoint" = 1, "slope" = 0), upper = list("upAsym" = 100, "y0" = 0, "midPoint" = 19, hillslope = Inf), control = nls.control(warnOnly = TRUE, maxiter=1000), algorithm = "port")