Likelihood ratio and extra sum-of-squares tests with multiple lm or nls models nested within one common model. This function is most useful when the nested functions are all at the same level; otherwise use anova() or lrtest() which are more flexible.
Usage
lrt(sim, ..., com, sim.names = sim.name, sim.name = NULL, com.name = NULL)
extraSS(sim, ..., com, sim.names = sim.name, sim.name = NULL, com.name = NULL)
# S3 method for class 'extraTest'
print(x, ...)Arguments
- sim
The results of one
lmornlsmodel, for example, that is a nested subset of the model incom=.- ...
More model results that are nested subsets of the model in
com=.- com
The results of one
lmornlsmodel, for example, that the models insim=and...are a subset of.- sim.name, sim.names
A string vector of “names” for simple model in
sim=and....sim.namesis preferred butsim.nameis allowed to allow for a common typing mistake.- com.name
A single “name” string for the complex model in
com=.- x
An object from
lrt()orextraSS().
Value
The main function returns a matrix with as many rows as model comparisons and columns of the following types:
DfOThe error degrees-of-freedom from the subset (more simple) model.RSSO,logLikOThe residual sum-of-squares (fromextraSS) or log-likelihood (fromlrt) from the subset (more simple) model.DfAThe error degrees-of-freedom from thecom=model.RSSA,logLikAThe residual sum-of-squares (fromextraSS) or log-likelihood (fromlrt) from thecom=model.DfThe difference in error degrees-of-freedom between the two models.SS,logLikThe difference in residual sum-of-squares (fromextraSS) or log-likelihood (fromlrt) between the two models.F,ChisqThe corresponding F- (fromextraSS) or Chi-square (fromlrt) test statistic.Pr(>F),Pr(>Chisq)The corresponding p-value.
Details
anova and lrtest (from lmtest) provide simple methods for conducting extra sum-of-squares or likelihood ratio tests when one model is nested within another model or when there are several layers of simple models all sequentially nested within each other. However, to compare several models that are nested at the same level with one common more complex model, then anova() and lrtest() must be repeated for each comparison. This repetition can be eliminated with lapply() but then the output is voluminous. This function is designed to remove the repetitiveness and to provide output that is compact and easy to read.
Note
This function is experimental at this point. It seems to work fine for lm and nls models. An error will be thrown by extraSS for other model classes, but lrt will not (but it has not been thoroughly tests for other models).
Author
Derek H. Ogle, DerekOgle51@gmail.com
Examples
## Example data
df <- data.frame(x=c(1,2,3,4,5,6,7,8,9,10),
y=c(4,6,5,7,9,8,7,12,16,22),
z=as.factor(rep(c("A","B"),each=5)),
w=as.factor(rep(c("A","B"),times=5)))
df$x2 <- df$x^2
## Linear (lm()) models
# ... regression
fit.0 <- lm(y~1,data=df)
fit.1 <- lm(y~x,data=df)
fit.2 <- lm(y~x2+x,data=df)
extraSS(fit.0,fit.1,com=fit.2)
#> Model 1: y ~ 1
#> Model 2: y ~ x
#> Model A: y ~ x2 + x
#>
#> DfO RSSO DfA RSSA Df SS F Pr(>F)
#> 1vA 9 282.400 7 27.617 2 254.783 32.290 0.0002925 ***
#> 2vA 8 67.988 7 27.617 1 40.371 10.233 0.0150891 *
#> ---
#> Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
lrt(fit.0,fit.1,com=fit.2)
#> Loading required namespace: lmtest
#> Model 1: y ~ 1
#> Model 2: y ~ x
#> Model A: y ~ x2 + x
#>
#> DfO logLikO DfA logLikA Df logLik Chisq Pr(>Chisq)
#> 1vA 9 -30.8931 7 -19.2686 2 -11.6245 23.2491 8.944e-06 ***
#> 2vA 8 -23.7731 7 -19.2686 1 -4.5045 9.0091 0.002686 **
#> ---
#> Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
# ... show labels for models
extraSS(fit.0,fit.1,com=fit.2,
sim.names=c("Null Model","Linear"),com.name="Quadratic")
#> Model 1: Null Model
#> Model 2: Linear
#> Model A: Quadratic
#>
#> DfO RSSO DfA RSSA Df SS F Pr(>F)
#> 1vA 9 282.400 7 27.617 2 254.783 32.290 0.0002925 ***
#> 2vA 8 67.988 7 27.617 1 40.371 10.233 0.0150891 *
#> ---
#> Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
lrt(fit.0,fit.1,com=fit.2,
sim.names=c("Null Model","Linear"),com.name="Quadratic")
#> Model 1: Null Model
#> Model 2: Linear
#> Model A: Quadratic
#>
#> DfO logLikO DfA logLikA Df logLik Chisq Pr(>Chisq)
#> 1vA 9 -30.8931 7 -19.2686 2 -11.6245 23.2491 8.944e-06 ***
#> 2vA 8 -23.7731 7 -19.2686 1 -4.5045 9.0091 0.002686 **
#> ---
#> Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
# ... dummy variable regression
fit.2b <- lm(y~x*z,data=df)
extraSS(fit.0,fit.1,com=fit.2b)
#> Model 1: y ~ 1
#> Model 2: y ~ x
#> Model A: y ~ x * z
#>
#> DfO RSSO DfA RSSA Df SS F Pr(>F)
#> 1vA 9 282.400 6 17.800 3 264.600 29.7303 0.0005347 ***
#> 2vA 8 67.988 6 17.800 2 50.188 8.4586 0.0179459 *
#> ---
#> Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
lrt(fit.0,fit.1,com=fit.2b)
#> Model 1: y ~ 1
#> Model 2: y ~ x
#> Model A: y ~ x * z
#>
#> DfO logLikO DfA logLikA Df logLik Chisq Pr(>Chisq)
#> 1vA 9 -30.8931 6 -17.0725 3 -13.8206 27.641 4.319e-06 ***
#> 2vA 8 -23.7731 6 -17.0725 2 -6.7007 13.401 0.00123 **
#> ---
#> Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
# ... ANOVAs
fit.1 <- lm(y~w,data=df)
fit.2 <- lm(y~w*z,data=df)
extraSS(fit.0,fit.1,com=fit.2)
#> Model 1: y ~ 1
#> Model 2: y ~ w
#> Model A: y ~ w * z
#>
#> DfO RSSO DfA RSSA Df SS F Pr(>F)
#> 1vA 9 282.4 6 159.0 3 123.4 1.5522 0.2955
#> 2vA 8 262.8 6 159.0 2 103.8 1.9585 0.2215
lrt(fit.0,fit.1,com=fit.2)
#> Model 1: y ~ 1
#> Model 2: y ~ w
#> Model A: y ~ w * z
#>
#> DfO logLikO DfA logLikA Df logLik Chisq Pr(>Chisq)
#> 1vA 9 -30.8931 6 -28.0210 3 -2.8721 5.7442 0.12474
#> 2vA 8 -30.5334 6 -28.0210 2 -2.5124 5.0249 0.08107 .
#> ---
#> Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
## Non-linear (nls()) models
fit.0 = nls(y~c,data=df,start=list(c=10))
fit.1 = nls(y~a*x+c,data=df,start=list(a=1,c=1))
fit.2 = nls(y~b*x2+a*x+c,data=df,start=list(a=-1,b=0.3,c=10))
extraSS(fit.0,fit.1,com=fit.2)
#> Model 1: y ~ c
#> Model 2: y ~ a * x + c
#> Model A: y ~ b * x2 + a * x + c
#>
#> DfO RSSO DfA RSSA Df SS F Pr(>F)
#> 1vA 9 282.400 7 27.617 2 254.783 32.290 0.0002925 ***
#> 2vA 8 67.988 7 27.617 1 40.371 10.233 0.0150891 *
#> ---
#> Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
lrt(fit.0,fit.1,com=fit.2)
#> Model 1: y ~ c
#> Model 2: y ~ a * x + c
#> Model A: y ~ b * x2 + a * x + c
#>
#> DfO logLikO DfA logLikA Df logLik Chisq Pr(>Chisq)
#> 1vA 9 -30.8931 7 -19.2686 2 -11.6245 23.2491 8.944e-06 ***
#> 2vA 8 -23.7731 7 -19.2686 1 -4.5045 9.0091 0.002686 **
#> ---
#> Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
## General least-squares (gls()) models
if (FALSE) { # \dontrun{
require(nlme)
fit.0 <- gls(y~1,data=df,method="ML")
fit.1 <- gls(y~x,data=df,method="ML")
fit.2 <- gls(y~x2+x,data=df,method="ML")
lrt(fit.0,fit.1, com=fit.2)
## will return an error ... does not work with gls() models
# extraSS(fit.0,fit.1, com=fit.2)
} # }
