2016-10-18 6 views
1

lm 및 일반 행렬 대수를 사용하여 간단한 회귀를 계산하고 싶습니다. 그러나 행렬 대수에서 얻은 회귀 계수는 lm을 사용하여 얻은 결과의 절반에 불과하므로 실마리가 없습니다.정상 방정식을 풀면`lm '을 사용하면 다른 계수를 얻을 수 있습니까?

여기에 코드를입니다

boot_example <- data.frame(
    x1 = c(1L, 1L, 1L, 0L, 0L, 0L, 0L, 0L, 0L), 
    x2 = c(0L, 0L, 0L, 1L, 1L, 1L, 0L, 0L, 0L), 
    x3 = c(1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L), 
    x4 = c(0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L), 
    x5 = c(1L, 0L, 0L, 0L, 0L, 1L, 0L, 1L, 0L), 
    x6 = c(0L, 1L, 0L, 1L, 0L, 0L, 0L, 0L, 1L), 
    preference_rating = c(9L, 7L, 5L, 6L, 5L, 6L, 5L, 7L, 6L) 
) 
dummy_regression <- lm("preference_rating ~ x1+x2+x3+x4+x5+x6", data = boot_example) 
dummy_regression 

Call: 
lm(formula = "preference_rating ~ x1+x2+x3+x4+x5+x6", data = boot_example) 

Coefficients: 
(Intercept)   x1   x2   x3   x4   x5   x6 
    4.2222  1.0000  -0.3333  1.0000  0.6667  2.3333  1.3333 

###The same by matrix algebra 
X <- matrix(c(
c(1L, 1L, 1L, 0L, 0L, 0L, 0L, 0L, 0L), #upper var 
c(0L, 0L, 0L, 1L, 1L, 1L, 0L, 0L, 0L), #upper var 
c(1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L), #country var 
c(0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L), #country var 
c(1L, 0L, 0L, 0L, 0L, 1L, 0L, 1L, 0L), #price var 
c(0L, 1L, 0L, 1L, 0L, 0L, 0L, 0L, 1L) #price var 
), 
nrow = 9, ncol=6) 

Y <- c(9L, 7L, 5L, 6L, 5L, 6L, 5L, 7L, 6L) 

#Using standardized (mean=0, std=1) "z" -transformation Z = (X-mean(X))/sd(X) for all predictors 
X_std <- apply(X, MARGIN = 2, FUN = function(x){(x-mean(x))/sd(x)}) 

##If constant shall be computed as well, uncomment next line 
#X_std <- cbind(c(rep(1,9)),X_std) 

#using matrix algebra formula 
solve(t(X_std) %*% X_std) %*% (t(X_std) %*% Y) 

      [,1] 
[1,] 0.5000000 
[2,] -0.1666667 
[3,] 0.5000000 
[4,] 0.3333333 
[5,] 1.1666667 
[6,] 0.6666667 

사람이 내 행렬 계산에서 오류가 있습니까?

미리 감사드립니다.

답변

3

lm은 표준화를 수행하지 않습니다. 당신이 lm하여 동일한 결과를 얻을하려는 경우, 당신은 필요 : 나는 우리가 crossprod를 사용하는 것을 반복하지 않으

X1 <- cbind(1, X) ## include intercept 

solve(crossprod(X1), crossprod(X1,Y)) 

#   [,1] 
#[1,] 4.2222222 
#[2,] 1.0000000 
#[3,] -0.3333333 
#[4,] 1.0000000 
#[5,] 0.6666667 
#[6,] 2.3333333 
#[7,] 1.3333333 

. "후속 조치"부분은 Ridge regression with glmnet gives different coefficients than what I compute by “textbook definition”?

입니다.