[R] Comparing nonlinear, non-nested models
Ben Bolker
bbolker at gmail.com
Thu Nov 8 15:22:00 CET 2012
Tom Shatwell <shatwell <at> igb-berlin.de> writes:
>
> Dear R users,
> Could somebody please help me to find a way of comparing nonlinear,
> non-nested models in R, where the number of parameters is not
> necessarily different? Here is a sample (growth rates, y, as a
> function of internal substrate concentration, x):
> x <- c(0.52, 1.21, 1.45, 1.64, 1.89, 2.14, 2.47, 3.20, 4.47, 5.31, 6.48)
> y <- c(0.00, 0.35, 0.41, 0.49, 0.58, 0.61, 0.71, 0.83, 0.98, 1.03, 1.06)
>
> model1 <- function(x, xo, ym) ym * (x-xo)/x
> model2 <- function(x, xo, ym, k) ym * (x-xo)/(k+x-xo)
> model3 <- function(x, xo, ym) ym * (1-exp(-log(2)*(x-xo)/xo))
> model4 <- function(x, xo, ym, k) ym * (1-exp(-log(2)*(x-xo)/k))
>
> fit1 <- nls(y~model1(x, xo, ym), start=list(xo=0.5, ym=1))
> fit2 <- nls(y~model2(x, xo, ym, k), start=list(xo=0.5, ym=1, k=1))
> fit3 <- nls(y~model3(x, xo, ym), start=list(xo=0.5, ym=1))
> fit4 <- nls(y~model4(x, xo, ym, k), start=list(xo=0.5, ym=1, k=1))
>
> anova(fit1, fit2)
> anova(fit3, fit4)
> Models 1 and 2 are nested, as are models 3 and 4 (set k=xo), so they
> can be compared using anova. I am looking for a way to compare the
> non-nested models (ie models 1 and 3, and models 2 and 4), or better
> still, I would like to compare all 4 at once. A significance test
> would be ideal, but I am beginning to think that this may not make
> statistical sense. In that case, is there an appropriate measure of
> goodness of fit? I’d be very grateful if someone could put me on the
> right track.
It is surely not a panacea, and some statisticians (primarily
Brian Ripley) argue that they are inappropriate for non-nested
models, but sensibly used information criteria such as AIC are
good for this situation. The AIC gives an (asymptotic) approximation
of the expected predictive accuracy of a given model, taking into
account the goodness of fit and the number of parameters.
>From base R:
> AIC(fit1,fit2,fit3,fit4)
df AIC
fit1 3 -8.08637
fit2 4 -50.35842
fit3 3 -15.62821
fit4 4 -59.71780
I prefer this representation (by default it
sorts the models and presents the delta-AIC
rather than the raw value):
> library(bbmle)
Loading required package: stats4
AIC> AICtab(fit1,fit2,fit3,fit4)
dAIC df
fit4 0.0 4
fit2 9.4 4
fit3 44.1 3
fit1 51.6 3
You may want to use a finite-size correction:
> AICctab(fit1,fit2,fit3,fit4,nobs=length(x))
dAICc df
fit4 0.0 4
fit2 9.4 4
fit3 40.9 3
fit1 48.4 3
The Vuong test is another alternative for non-nested
models.
More information about the R-help
mailing list