QR分解を用いた重回帰解を求める関数を書こうとしています。入力:yベクトルとX行列。出力:b、e、R^2。これまでのところ私はこれを持っており、ひどく詰まっています。それはすべてあなたがこの問題を解決するために使用することが許可されているどのくらいのR内蔵の施設のに依存QR分解を用いたRの重回帰分析
QR.regression <- function(y, X) {
X <- as.matrix(X)
y <- as.vector(y)
p <- as.integer(ncol(X))
if (is.na(p)) stop("ncol(X) is invalid")
n <- as.integer(nrow(X))
if (is.na(n)) stop("nrow(X) is invalid")
nr <- length(y)
nc <- NCOL(X)
# Householder
for (j in seq_len(nc)) {
id <- seq.int(j, nr)
sigma <- sum(X[id, j]^2)
s <- sqrt(sigma)
diag_ej <- X[j, j]
gamma <- 1.0/(sigma + abs(s * diag_ej))
kappa <- if (diag_ej < 0) s else -s
X[j,j] <- X[j, j] - kappa
if (j < nc)
for (k in seq.int(j+1, nc)) {
yPrime <- sum(X[id,j] * X[id,k]) * gamma
X[id,k] <- X[id,k] - X[id,j] * yPrime
}
yPrime <- sum(X[id,j] * y[id]) * gamma
y[id] <- y[id] - X[id,j] * yPrime
X[j,j] <- kappa
} # end of Householder transformation
rss <- sum(y[seq.int(nc+1, nr)]^2) # residuals sum of squares
e <- rss/nr
e <- mean(residuals(QR.regression)^2)
beta <- solve(t(X) %*% X, t(X) %*% y)
for (i in seq_len(ncol(X))) # set zeros in the lower triangular side of X
X[seq.int(i+1, nr),i] <- 0
Rsq <- (X[1:nc,1:nc])^2
return(list(Rsq=Rsq, y = y, beta = beta, e = e))
}
UPDATE:
my.QR <- function(y, X) {
X <- as.matrix(X)
y <- as.vector(y)
p <- as.integer(ncol(X))
if (is.na(p)) stop("ncol(X) is invalid")
n <- as.integer(nrow(X))
if (is.na(n)) stop("nrow(X) is invalid")
qr.X <- qr(X)
b <- solve(t(X) %*% X, t(X) %*% y)
e <- as.vector(y - X %*% beta) #e
R2 <- (X[1:p, 1:p])^2
return(list(b = b, e= e, R2 = R2))
}
X <- matrix(c(1,2,3,4,5,6), nrow = 2, ncol = 3)
y <- c(1,2,3,4)
my.QR(X, y)
"これはあまりにも複雑に思った"と思うかもしれませんが、なぜ私は 'lm(y〜X)'を使わなかったのでしょうか? –
私は関数が正しい答えを提供したことを証明するためだけにlm(y〜X)を使うことが許されています。それまでは私は仕事をする必要があります。 – AGMG
@ ZheyuanLiありがとう、私はすでにその記事を読んでいた。タスクはむしろあいまいですが、組み込み関数のいくつかをよく使うべきだと思います。また、私はこのエラーメッセージが表示され続けるので、私のHouseholderはオフになっています: "X [id、j]のエラー:添え字が範囲外です"。どんな助けでも真剣に、非常に高く評価されるでしょう。 – AGMG