QR 분해를 이용한 다중 회귀 분석을위한 함수를 작성하려고합니다. 입력 : y 벡터 및 X 행렬; 출력 : b, e, R^2. 지금까지 나는 이것을 가지고 있으며 끔찍하게 붙어있다. 내가 너무 복잡한 방식으로 모든 것을 만들었 생각 :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 감사합니다. 나는 이미 그 글을 읽고있었습니다. 이 작업은 다소 모호하지만 내장 함수 중 일부를 더 잘 사용해야한다고 생각합니다. 또한 :이 오류 메시지가 계속 표시되기 때문에 우리 집주인이 꺼져 있습니다. "X [id, j]의 오류 : 범위 밖의 첨자"입니다. 어떤 도움도 진지하게 높이 평가 될 것입니다. – AGMG