簡體   English   中英

從QR分解中獲取帽子矩陣,用於加權最小二乘回歸

[英]Get hat matrix from QR decomposition for weighted least square regression

我試圖擴展McSptial軟件包的McSptial 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 )的東西。

這個老問題是我剛才回答的另一個老問題的延續: 通過QR分解,SVD(和Cholesky分解?)計算投影/帽子矩陣 該答案討論了計算普通最小二乘問題的帽子矩陣的3個選項,而這個問題是在加權最小二乘的背景下。 但是答案中的結果和方法將成為我答案的基礎。 具體來說,我只會演示QR方法。

在此輸入圖像描述

OP提到我們可以使用lm.wfit來計算QR分解,但是我們可以使用qr.defaultqr.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

我們首先通過行重新縮放到X獲得X1 (乳膠段落中的X_tilde):

X1 <- rw * X

然后我們對X1進行QR分解。 正如在我的鏈接答案中所討論的,我們可以使用或不使用列旋轉來執行此分解。 lm.fitlm.wfit因此lm沒有進行旋轉,但在這里我將使用旋轉分解作為演示。

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

注意我們沒有像鏈接的答案那樣繼續計算tcrossprod(Q) ,因為那是普通的最小二乘法。 對於加權最小二乘法,我們需要Q1Q2

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列,並且它沒有秩缺陷。

通常dedf都是我們需要的。 在極少數情況下,我們需要一個完整的帽子矩陣。 為了得到它,我們需要一個昂貴的矩陣乘法:

H <- tcrossprod(Q1, Q2)

Hat矩陣對於幫助我們了解模型是否為局部/稀疏特別有用。 讓我們繪制這個矩陣(讀取?image以獲取有關如何以正確方向繪制矩陣的詳細信息和示例):

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

在此輸入圖像描述

我們看到這個矩陣是完全密集的 這意味着,每個數據的預測取決於所有數據,即預測不是本地的。 如果我們與其他非參數預測方法比較,如核回歸,黃土,P樣條(懲罰B樣條回歸)和小波,我們將觀察稀疏的帽子矩陣。 因此,這些方法稱為局部擬合。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM