2015-05-30 6 views
1

Я пытаюсь узнать о коньке регрессии, и я использую R. Из того, что я понимаю следующее должно быть таким же beta.r1 и beta.r2 в коде ниже один и тот жевычисление оценки Хребет вручную в R, просто

library(MASS) 
n=50 
v1=runif(n) 
v2=v1+2 
V=cbind(1,v1,v2) 
w=3+v1+v2 
I=diag(3) 

lambda=2 #arbitrarily chosen 

beta.r1=solve(t(V)%*%V+lambda*I)%*%t(V)%*%w 

#Using library(MASS) 
fit=lm.ridge(w~v1+v2,lambda=2, Inter=FALSE) 
beta.r2=coef(fit) 
#Shouldn't beta.r1 and beta.r2 be the same? 
+0

Выбрал п быть 50, извините забыл упомянуть, что –

+1

Это интересная один. Фактический код 'lm.ridge' можно проверить, введя' lm.ridge' в командной строке. Это не очень долго. Затем вы можете скопировать его и изменить его так, чтобы он печатал промежуточные результаты, и вы могли бы изучить различия. Я буду смотреть на это больше, потому что меня тоже интересует проблема, но сейчас я скажу, что то, что она делает, совсем не похоже на вашу формулу, и, кроме всего прочего, связано с svd входных данных. –

ответ

0

Я думаю, что масштабирование переменной выполняется в коде lm.ridge (к которому вы можете получить доступ, введя lm.ridge в свою консоль R), которые, вероятно, вызывают различия. Код весы каждый переменная ее корень среднеквадратичного значения:

Xscale <- drop(rep(1/n, n) %*% X^2)^0.5 
X <- X/rep(Xscale, rep(n, p)) 

Ваш код не выполняет переменное масштабирования.

Переменная масштабирования намекают на странице ?lm.ridge помощи в описании того, что возвращается lm.ridge:

весы: отслоения, используемых на матрице X.

Таким образом, вы можете получить доступ к масштабированию, используемое lm.ridge:

fit$scales 
#  v1  v2 
# 0.2650311 0.2650311 

 Смежные вопросы

  • Нет связанных вопросов^_^