1## Obtain fitted values from ssanova objects
2fitted.ssanova <- function(object,...)
3{
4    mf <- object$mf
5    if (!is.null(object$random)) mf$random <- I(object$random$z)
6    predict(object,mf)
7}
8
9## Obtain residuals from ssanova objects
10residuals.ssanova <- function(object,...)
11{
12    y <- model.response(object$mf,"numeric")
13    as.numeric(y-fitted.ssanova(object))
14}
15
16## Obtain fitted values in working scale from gssanova objects
17fitted.gssanova <- function(object,...)
18{
19    as.numeric(object$eta)
20}
21
22## Obtain residuals from gssanova objects
23residuals.gssanova <- function(object,type="working",...)
24{
25    if (object$family=="polr") {
26        y <- model.response(object$mf)
27        if (!is.factor(y))
28            stop("gss error in gssanova1: need factor response for polr family")
29        lvls <- levels(y)
30        if (nlvl <- length(lvls)<3)
31            stop("gss error in gssanova1: need at least 3 levels to fit polr family")
32        y <- outer(y,lvls,"==")
33    }
34    else y <- model.response(object$mf,"numeric")
35    wt <- model.weights(object$mf)
36    offset <- NULL
37    if ((object$family=="nbinomial")&(!is.null(object$nu))) y <- cbind(y,object$nu)
38    dat <- switch(object$family,
39                  binomial=mkdata.binomial(y,object$eta,wt,offset),
40                  nbinomial=mkdata.nbinomial(y,object$eta,wt,offset,object$nu),
41                  polr=mkdata.polr(y,object$eta,wt,offset,object$nu),
42                  poisson=mkdata.poisson(y,object$eta,wt,offset),
43                  inverse.gaussian=mkdata.inverse.gaussian(y,object$eta,wt,offset),
44                  Gamma=mkdata.Gamma(y,object$eta,wt,offset),
45                  weibull=mkdata.weibull(y,object$eta,wt,offset,list(object$nu,FALSE)),
46                  lognorm=mkdata.lognorm(y,object$eta,wt,offset,list(object$nu,FALSE)),
47                  loglogis=mkdata.loglogis(y,object$eta,wt,offset,list(object$nu,FALSE)))
48    res <- as.numeric(dat$ywk - object$eta)
49    if (!is.na(charmatch(type,"deviance"))) {
50        dev.resid <- switch(object$family,
51                            binomial=dev.resid.binomial(y,object$eta,wt),
52                            nbinomial=dev.resid.nbinomial(y,object$eta,wt),
53                            polr=dev.resid.polr(y,object$eta,wt,object$nu),
54                            poisson=dev.resid.poisson(y,object$eta,wt),
55                            inverse.gaussian=dev.resid.inverse.gaussian(y,object$eta,wt),
56                            Gamma=dev.resid.Gamma(y,object$eta,wt),
57                            weibull=dev.resid.weibull(y,object$eta,wt,object$nu),
58                            lognorm=dev.resid.lognorm(y,object$eta,wt,object$nu),
59                            loglogis=dev.resid.loglogis(y,object$eta,wt,object$nu))
60        res <- sqrt(dev.resid)*sign(res)
61    }
62    res
63}
64