岭回归介绍:
岭回归分析是一种专用于共线性分析的有偏估计回归方法,实质上是一种改良的最小二乘估计法,通过放弃最小二乘法的无偏性,以损失部分信息,降低精度为代价获得回归系数更为符合实际,更可靠的回归方法。
VIF:然而很多时候,被筛选的特征在模型上线的预测效果并不理想,究其原因可能是由于特征筛选的偏差。但还有一个显著的因素,就是选取特征之间之间可能存在高度的多重共线性,导致模型对测试集预测能力不佳。为了在筛选特征之初就避免陷入这样的误区。介绍一种VIF(方差膨胀检验)方法,来对特征之间的线性相关关系进行检验,从而选取到独立性更好的特征,增强模型的解释能力。
岭回归相关R的代码:
1. MASS包-lm.ridge函数
library(MASS)
testtab <- read.table("xxx",header = TRUE)
lingr <-lm.ridge(lskn ~ Q15.1 + Q15.2 + Q15.3 + Q15.4 + Q13 + Q14.1 + Q14.2 + Q14.3 + Q9.1 + Q9.2 + Q9.3 + Q2.1 + Q2.2 + Q2.3 + Q3 + Q7.1 + Q7.2 + Q5.1 + Q5.2, data=testtab ,lambda=seq(0,3,0.1))
beta <- coef(lingr)
k <- lingr$lambda
plot(k,k,type="n",xlab="岭参数k",ylab="岭回归系数",ylim=c(-2.5,2.5))
linetype<-c(1:5)
char<-c(18:22)
for(i in 1:5)
lines(k,beta[,i],type="o",lty=linetype[i],pch=char[i],cex=0.75)
#get p value
X <- as.matrix(testtab[,1:19])#生成自变量与因变量
y <- testtab[,20]
fit.se <- sqrt(diag(solve(t(X) %*% X + lingr$lambda * diag(ncol(X)))))
lingr$se <- fit.se
fit.se[fit.se==0] <- 1e-10
t_value <- lingr$coef / lingr$se
df <- nrow(X) - ncol(X)
p_value <- 2 * pt(abs(t_value), df = df, lower.tail = FALSE)
result <- data.frame(lambda = lingr$lambda, coef = lingr$coef, se = lingr$se, p_value = p_value)
#get p value
2. ridge包-linearRidge函数
可以自动选取岭回归参数,同时也可以自己通过其他的方式选择好,再进行设置
cement <- data.frame(X1 = c(7, 1, 11, 11, 7, 11, 3, 1, 2, 21, 1, 11, 10),
X2 = c(26,29, 56, 31, 52, 55, 71, 31, 54, 47, 40, 66, 68),
X3 = c(6, 15, 8, 8, 6, 9, 17, 22, 18, 4, 23, 9, 8),
X4 = c(60, 52, 20, 47, 33, 22, 6, 44, 22, 26, 34, 12, 12),
Y = c(78.5, 74.3, 104.3, 87.6, 95.9, 109.2, 102.7, 72.5, 93.1,115.9,83.8, 113.3, 109.4))
library(ridge)
mod <- linearRidge(Y ~ ., data = cement)
summary(mod)
##
## Call:
## linearRidge(formula = Y ~ ., data = cement)
##
##
## Coefficients:
## Estimate Scaled estimate Std. Error (scaled) t value (scaled)
## (Intercept) 83.704 NA NA NA
## X1 1.292 26.332 3.672 7.17
## X2 0.298 16.046 3.988 4.02
## X3 -0.148 -3.279 3.598 0.91
## X4 -0.351 -20.329 3.996 5.09
## Pr(>|t|)
## (Intercept) NA
## X1 7.5e-13 ***
## X2 5.7e-05 ***
## X3 0.36
## X4 3.6e-07 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Ridge parameter: 0.01473, chosen automatically, computed using 2 PCs
##
## Degrees of freedom: model 3.01 , variance 2.84 , residual 3.18
参考:
知乎-数据分析中常见的七种回归分析以及R语言实现(三)---岭回归
3. 多重共线性,计算VIF值等:
library(car)
data(mtcars)
mtcars
vifvalue <- vif(lm(carb ~ mpg + cyl + hp,data=mtcars))
函数介绍:
MASS包的lm.ridge
lm.ridge(formula, data, subset, na.action, lambda = 0, model = FALSE,
x = FALSE, y = FALSE, contrasts = NULL, ...)
输出的结果包括coef,scales等,coef为
参考:
51CTO-R语言检验多重共线性VIF
网友评论