114 lines
3.8 KiB
R
114 lines
3.8 KiB
R
|
library(MASS)
|
||
|
|
||
|
## Based on incorrect 'bug' report
|
||
|
|
||
|
hills$ispeed <- hills$time/hills$dist
|
||
|
hills$grad <- hills$climb/hills$dist
|
||
|
|
||
|
## weighted fit
|
||
|
fit0 <- rlm(time ~ dist + climb - 1, data = hills,
|
||
|
weights = 1/dist^2, method = "MM")
|
||
|
summary(fit0, correlation = FALSE)
|
||
|
## equivalent to
|
||
|
fit1 <- rlm(ispeed ~ grad, data = hills, method = "MM")
|
||
|
summary(fit1, correlation = FALSE)
|
||
|
|
||
|
cf0 <- coef(summary(fit0))
|
||
|
cf1 <- coef(summary(fit1))
|
||
|
rownames(cf1) <- rownames(cf0)
|
||
|
stopifnot(all.equal(cf0, cf1))
|
||
|
stopifnot(all.equal(weighted.residuals(fit0), residuals(fit1)))
|
||
|
|
||
|
# test other cases
|
||
|
fit0 <- rlm(time ~ dist + climb - 1, data = hills, weights = 1/dist^2)
|
||
|
summary(fit0, correlation = FALSE)
|
||
|
## equivalent to
|
||
|
fit1 <- rlm(ispeed ~ grad, data = hills)
|
||
|
summary(fit1, correlation = FALSE)
|
||
|
|
||
|
cf0 <- coef(summary(fit0))
|
||
|
cf1 <- coef(summary(fit1))
|
||
|
rownames(cf1) <- rownames(cf0)
|
||
|
stopifnot(all.equal(cf0, cf1))
|
||
|
stopifnot(all.equal(weighted.residuals(fit0), residuals(fit1)))
|
||
|
|
||
|
fit0 <- rlm(time ~ dist + climb - 1, data = hills, weights = 1/dist^2,
|
||
|
scale.est = "Huber")
|
||
|
summary(fit0, correlation = FALSE)
|
||
|
## equivalent to
|
||
|
fit1 <- rlm(ispeed ~ grad, data = hills, scale.est = "Huber")
|
||
|
summary(fit1, correlation = FALSE)
|
||
|
|
||
|
cf0 <- coef(summary(fit0))
|
||
|
cf1 <- coef(summary(fit1))
|
||
|
rownames(cf1) <- rownames(cf0)
|
||
|
stopifnot(all.equal(cf0, cf1))
|
||
|
stopifnot(all.equal(weighted.residuals(fit0), residuals(fit1)))
|
||
|
|
||
|
|
||
|
## cf lm fits
|
||
|
|
||
|
fit2 <- lm(time ~ dist + climb - 1, data = hills, weights = 1/dist^2)
|
||
|
fit3 <- lm(ispeed ~ grad, data = hills)
|
||
|
stopifnot(all.equal(weighted.residuals(fit2), residuals(fit3)))
|
||
|
|
||
|
|
||
|
## case weights: can't do MM as no weighted lqs.
|
||
|
wts <- rep(1, 35)
|
||
|
wts[c(1,11,21)] <- 10
|
||
|
h2 <- hills[rep(1:35, times=wts), ]
|
||
|
fit4 <- lm(ispeed ~ grad, data = hills, weights = wts)
|
||
|
fit5 <- lm(ispeed ~ grad, data = h2)
|
||
|
## same coefs, different se's.
|
||
|
fit6 <- rlm(ispeed ~ grad, data = h2, acc = 1e-10)
|
||
|
fit7 <- rlm(ispeed ~ grad, data = hills,
|
||
|
weights = wts, wt.method = "case", acc = 1e-10)
|
||
|
summary(fit6)
|
||
|
summary(fit7)
|
||
|
stopifnot(all.equal(coef(summary(fit6)), coef(summary(fit7))))
|
||
|
summary(fit6, "XtWX")
|
||
|
summary(fit7, "XtWX")
|
||
|
stopifnot(all.equal(coef(summary(fit6, "XtWX")), coef(summary(fit7, "XtWX"))))
|
||
|
|
||
|
fit8 <- rlm(ispeed ~ grad, data = h2, scale.est = "Huber", acc = 1e-10)
|
||
|
fit9 <- rlm(ispeed ~ grad, data = hills, scale.est = "Huber",
|
||
|
weights = wts, wt.method = "case", acc = 1e-10)
|
||
|
summary(fit8)
|
||
|
summary(fit9)
|
||
|
stopifnot(all.equal(coef(summary(fit8)), coef(summary(fit9))))
|
||
|
summary(fit8, "XtWX")
|
||
|
summary(fit9, "XtWX")
|
||
|
stopifnot(all.equal(coef(summary(fit8, "XtWX")), coef(summary(fit9, "XtWX"))))
|
||
|
|
||
|
|
||
|
## w was a matrix under some initializations
|
||
|
x <- matrix(1:200, 100,2)
|
||
|
B <- c(2.5, -1.3)
|
||
|
y <- x %*% B + rnorm(100)
|
||
|
r1 <- rlm(x, y, init=B, psi=psi.huber)
|
||
|
r2 <- rlm(x, y, init=B, psi=psi.bisquare)
|
||
|
r3 <- rlm(x, y, init=B, psi=psi.hampel) # failed
|
||
|
r4 <- rlm(x, y, psi=psi.hampel)
|
||
|
|
||
|
## lqs with intercept lost contrasts
|
||
|
dat <- data.frame(trt = factor(rep(LETTERS[1:2], each=3)),resp = rt(6, df=3))
|
||
|
fit <- lqs(resp ~ trt, data = dat, contrasts = list(trt = "contr.sum"))
|
||
|
stopifnot(identical(predict(fit), predict(fit, newdata = dat)))
|
||
|
|
||
|
|
||
|
### Andr\'e Gillibert 2020-08-14, models with offset() term:
|
||
|
df <- data.frame(outcome=1:10, off = rep(100, 10))
|
||
|
## NB: lm(outome ~ 1, data=df, offset = off) would be different.
|
||
|
fit_lm <- lm(outcome ~ offset(off), data = df)
|
||
|
fit_rlm <- rlm(outcome ~ offset(off), data = df)
|
||
|
|
||
|
## prediction of fit_rlm and fit_lm are identical for this simple model
|
||
|
stopifnot(all.equal(predict(fit_rlm, newdata=df), predict(fit_lm, newdata=df)))
|
||
|
|
||
|
## but predict of fit_rlm was not consistent with itself
|
||
|
## when using the same dataset with newdata
|
||
|
stopifnot(all.equal(predict(fit_rlm), predict(fit_rlm, newdata=df)))
|
||
|
|
||
|
# similarly, fitted()+resid() was inconsistent for fit_rlm
|
||
|
stopifnot(all.equal(df$outcome, unname(fitted(fit_rlm)+resid(fit_rlm))))
|