Получить матрицу шапки из разложения QR для взвешенной регрессии наименьших квадратов

Я пытаюсь продлить lwr() функция пакета McSptial, что соответствует взвешенным регрессиям как непараметрическая оценка. В основе lwr() функция, она инвертирует матрицу, используя solve() вместо разложения QR, что приводит к численной нестабильности. Я хотел бы изменить это, но не могу понять, как получить матрицу шляпы (или другие производные) из разложения QR впоследствии.

С данными:

set.seed(0); xmat <- matrix(rnorm(500), nrow=50)    ## model matrix
y <- rowSums(rep(2:11,each=50)*xmat)    ## arbitrary values to let `lm.wfit` work
w <- runif(50, 1, 2)    ## weights

lwr() Функция работает следующим образом:

xmat2 <- w * xmat
xx <- solve(crossprod(xmat, xmat2))
xmat1 <- tcrossprod(xx, xmat2)
vmat <- tcrossprod(xmat1)

Мне нужно значение, например:

sum((xmat[1,] %*% xmat1)^2)
sqrt(diag(vmat))

На данный момент я использую reg <- lm.wfit(x=xmat, y=y, w=w) но не могу вернуть то, что мне кажется шляпной матрицей (xmat1) из этого.

1 ответ

Этот старый вопрос является продолжением другого старого вопроса, на который я только что ответил: вычислить матрицу проекции / шляпы с помощью QR-факторизации, SVD (и факторизации Холецкого?). В этом ответе обсуждаются 3 варианта вычисления матрицы шляп для обычной задачи наименьших квадратов, в то время как этот вопрос находится в контексте взвешенных наименьших квадратов. Но результат и метод в этом ответе будут основой моего ответа здесь. В частности, я только продемонстрирую подход QR.

введите описание изображения здесь

ОП упомянул, что мы можем использовать lm.wfit вычислить QR-факторизацию, но мы могли бы сделать это, используя qr.default мы сами, это то, как я покажу.


Прежде чем продолжить, я должен указать, что код OP не делает то, что он думает. xmat1 это не шляпная матрица; вместо, xmat %*% xmat1 является. vmat это не шляпная матрица, хотя я не знаю, что это на самом деле. Тогда я не понимаю, что это:

sum((xmat[1,] %*% xmat1)^2)
sqrt(diag(vmat))

Второй выглядит как диагональ шляпной матрицы, но, как я уже сказал, vmat это не шляпная матрица. Ну, во всяком случае, я продолжу правильное вычисление для шляпной матрицы и покажу, как получить ее диагональ и трассировку.


Рассмотрим игрушечную модель матрицы X и некоторые однородные, положительные веса w:

set.seed(0); X <- matrix(rnorm(500), nrow = 50)
w <- runif(50, 1, 2)    ## weights must be positive
rw <- sqrt(w)    ## square root of weights

Сначала мы получаем X1 (X_tilde в латексном абзаце) путем изменения масштаба строки до X:

X1 <- rw * X

Затем мы выполняем QR-факторизацию для X1, Как обсуждалось в моем связанном ответе, мы можем выполнить эту факторизацию с поворотом столбца или без него. lm.fit или же lm.wfit следовательно lm не делает поворот, но здесь я буду использовать поворотную факторизацию в качестве демонстрации.

QR <- qr.default(X1, LAPACK = TRUE)
Q <- qr.qy(QR, diag(1, nrow = nrow(QR$qr), ncol = QR$rank))

Обратите внимание, мы не пошли на вычисления tcrossprod(Q) как в связанном ответе, потому что это для обычных наименьших квадратов. Для взвешенных наименьших квадратов мы хотим Q1 а также Q2:

Q1 <- (1 / rw) * Q
Q2 <- rw * Q

Если нам нужна только диагональ и трассировка матрицы шляп, нет необходимости выполнять матричное умножение, чтобы сначала получить полную матрицу шляп. Мы можем использовать

d <- rowSums(Q1 * Q2)  ## diagonal
# [1] 0.20597777 0.26700833 0.30503459 0.30633288 0.22246789 0.27171651
# [7] 0.06649743 0.20170817 0.16522568 0.39758645 0.17464352 0.16496177
#[13] 0.34872929 0.20523690 0.22071444 0.24328554 0.32374295 0.17190937
#[19] 0.12124379 0.18590593 0.13227048 0.10935003 0.09495233 0.08295841
#[25] 0.22041164 0.18057077 0.24191875 0.26059064 0.16263735 0.24078776
#[31] 0.29575555 0.16053372 0.11833039 0.08597747 0.14431659 0.21979791
#[37] 0.16392561 0.26856497 0.26675058 0.13254903 0.26514759 0.18343306
#[43] 0.20267675 0.12329997 0.30294287 0.18650840 0.17514183 0.21875637
#[49] 0.05702440 0.13218959

edf <- sum(d)  ## trace, sum of diagonals
# [1] 10

В линейной регрессии, d является влияние каждого элемента, и это полезно для получения доверительного интервала (используя sqrt(d)) и стандартизированные остатки (с использованием sqrt(1 - d)). След, это эффективное число параметров или эффективная степень свободы для модели (поэтому я называю это edf). Мы видим, что edf = 10, потому что мы использовали 10 параметров: X имеет 10 столбцов, и это не ранг-дефицит.

Обычно d а также edf это все, что нам нужно. В редких случаях нам нужна полная матрица шляп. Чтобы получить его, нам нужно дорогое матричное умножение:

H <- tcrossprod(Q1, Q2)

Шляпная матрица особенно полезна для того, чтобы помочь нам понять, является ли модель локальной / редкой или нет. Давайте построим эту матрицу (читать ?image подробности и примеры того, как построить матрицу в правильной ориентации):

image(t(H)[ncol(H):1,])

введите описание изображения здесь

Мы видим, что эта матрица полностью плотна. Это означает, что прогноз на каждом уровне зависит от всех данных, т. Е. Прогноз не является локальным. В то время как если мы сравним с другими непараметрическими методами прогнозирования, такими как регрессия ядра, лесс, P-сплайн (регрессия оштрафованного B-сплайна) и вейвлет, мы увидим разреженную матрицу шапки. Поэтому эти методы известны как локальная подгонка.

Другие вопросы по тегам