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).
or - 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?
edit
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")
cbind(accuracy, 16-accuracy)
), but I'm concerned about whether it's mathematically justified. $\endgroup$