File: residuals.ols.s

package info (click to toggle)
design 2.3-0-2
  • links: PTS
  • area: main
  • in suites: squeeze
  • size: 1,756 kB
  • ctags: 1,113
  • sloc: asm: 15,221; ansic: 5,245; fortran: 627; makefile: 1
file content (93 lines) | stat: -rw-r--r-- 2,287 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
residuals.ols <-
  function(object, 
           type=c("ordinary","score","dfbeta","dfbetas","dffit","dffits","hat",
             "hscore"), ...)
{

type <- match.arg(type)
naa <- object$na.action

if(type=="ordinary") return(naresid(naa, object$residuals))

if(!length(object$x))stop("did not specify x=T in fit")

if(type=="score") return(naresid(naa, object$x*object$residuals))

infl <- ols.influence(object)

if(type=="hscore") return(naresid(naa, object$x *
     (object$residuals/(1-infl$hat))))

if(type=="dfbeta"|type=="dfbetas")
{
   r <- t(coef(object) - t(coef(infl)))
   if(type=="dfbetas") r <- sweep(r,2,diag(object$var)^.5,"/")
}
else if(type=="dffit") r <- (infl$hat * object$residuals)/(1 - infl$hat)
else if(type=="dffits") r <- (infl$hat^.5)*object$residuals/
	      (infl$sigma*(1-infl$hat))
else if(type=="hat") r <- infl$hat

naresid(naa, r)
									}

## lm.influence used to work but now it re-computes X for unknown
## reasons  24Nov00
ols.influence <- function(lm, x) {
GET <- function(x, what)
  {
    ## eventually, x[[what, exact=TRUE]]
    if(is.na(n <- match(what, names(x)))) NULL else x[[n]]
  }
wt <- GET(lm, "weights")
## should really test for < 1/BIG if machine pars available
e <- lm$residuals
n <- length(e)
if(length(wt))
  e <- e * sqrt(wt)
beta <- lm$coef
if(is.matrix(beta)) {
  beta <- beta[, 1]
  e <- e[, 1]
  warning("multivariate response, only first y variable used")
}
na <- is.na(beta)
beta <- beta[!na]
p <- GET(lm, "rank")
if(!length(p))
    p <- sum(!na)
R <- if(.R.) lm$qr$qr else lm$R
if(p < max(dim(R)))
  R <- R[1:p, 1:p]
qr <- GET(lm, "qr")
if(!length(qr)) {
  lm.x <- GET(lm, "x")
  if(length(wt))
    lm.x <- lm.x * sqrt(wt)
  if(any(na))
    lm.x <- lm.x[, !na, drop = FALSE]
  Q <- left.solve(R, lm.x)
}
else {
  if(length(wt) && any(zero <- wt == 0)) {
    Q <- matrix(0., n, p)
    dimnames(Q) <- list(names(e), names(beta))
    Q[!zero,  ] <- qr.Q(qr)[, 1:p, drop = FALSE]
  }
  else {
    Q <- qr.Q(qr)
    if(p < ncol(Q))
      Q <- Q[, 1:p, drop = FALSE]
  }
}
h <- as.vector((Q^2 %*% array(1, c(p, 1))))
h.res <- (1 - h)
z <- e/h.res
v1 <- e^2
z <- t(Q * z)
v.res <- sum(v1)
v1 <- (v.res - v1/h.res)/(n - p - 1)
# BKW (2.8)
dbeta <- backsolve(R, z)
list(coefficients = t(beta - dbeta), sigma = sqrt(v1), hat = h)
}