[R] lm.ridge {MASS} ridge regression calculation question
Ravi Varadhan
RVaradhan at jhmi.edu
Tue Nov 17 19:41:40 CET 2009
The difference is due to the use of "n" versus "n-1" when calculating the
standard deviation for scaling.
Try this:
Y <- matrix(c(136,144,145,169,176),byrow=F,5,1)
X1 <- matrix(c(91,105,109,130,146),byrow=F,5,1)
X2 <- matrix(c(11,13,17,19,23),byrow=F,5,1)
cY <- scale(Y, scale=FALSE)
sX1 <- scale(X1) * sqrt(5/4) # multiply by sqrt(n / (n-1))
sX2 <- scale(X2) * sqrt(5/4)
library(MASS)
ans <- lm.ridge(cY ~ sX1 + sX2, lambda = 100)
Xmat <- cbind(sX1, sX2)
Ymat <- cbind(cY)
XXI <- solve(t(Xmat)%*%Xmat + 100*diag(2))
XY <- t(Xmat)%*%Ymat
ridge.coef <- XXI%*%XY
all.equal(as.numeric(ridge.coef), as.numeric(ans$coef))
Ravi.
----------------------------------------------------------------------------
-------
Ravi Varadhan, Ph.D.
Assistant Professor, The Center on Aging and Health
Division of Geriatric Medicine and Gerontology
Johns Hopkins University
Ph: (410) 502-2619
Fax: (410) 614-9625
Email: rvaradhan at jhmi.edu
Webpage:
http://www.jhsph.edu/agingandhealth/People/Faculty_personal_pages/Varadhan.h
tml
----------------------------------------------------------------------------
--------
-----Original Message-----
From: r-help-bounces at r-project.org [mailto:r-help-bounces at r-project.org] On
Behalf Of Jimmy Purnell
Sent: Tuesday, November 17, 2009 1:21 PM
To: r-help at r-project.org
Subject: [R] lm.ridge {MASS} ridge regression calculation question
Why do I get different coefficients for each of these methods?
Y <- matrix(c(136,144,145,169,176),byrow=F,5,1)
X1 <- matrix(c(91,105,109,130,146),byrow=F,5,1)
X2 <- matrix(c(11,13,17,19,23),byrow=F,5,1)
cY <- scale(Y, scale=FALSE)
sX1 <- scale(X1)
sX2 <- scale(X2)
library(MASS)
lm.ridge(cY ~ sX1 + sX2, lambda = 100)
This yields different coefficients than what I get from this, which I
thought should be identical (if I set the lambdas to 0 rather than 100
I get identical results):
Xmat <- cbind(sX1, sX2)
Ymat <- cbind(cY)
XXI <- solve(t(Xmat)%*%Xmat + 100*diag(2))
XY <- t(Xmat)%*%Ymat
(ridge.coef <- XXI%*%XY)
Thanks,
Jim
______________________________________________
R-help at r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.
More information about the R-help
mailing list