1:如何创建简单线性回归、多项式回归、多元线性回归
7:深层次的分析-泛化能力和变量相对重要性
一、如何创建简单线性回归、多项式回归、多元线性回归
简单线性回归:##采用R自带的women数据集,分析体重和更改的关系
fit1 = lm(weight~height,data=women) summary(fit)
参数解释:
R方模型的整体评价是怎么样的,R方(0.991)可以解释99.1%的因变量Weight的值。 Estimate 参数的截距项和系数 Pr(>|t|)系数是否显著 H0:t检验所以是为0的原假设
多项式回归:多项式回归其实也是单个的自变量对因变量的解释,只不过对自变量做了算数如对身高^2的算数
fit2= lm(weight~height+I(height^2),data=women) summary(fit2)
七、深层次的分析
模型的泛化能力和变量相对重要性方法
泛化能力:模型对新数据表现如何就叫做模型泛化能力,方法交叉验证:
所谓的交叉验证,将数据分为训练数据和测试数据,先训练数据做回归,再保留样本做预测。
栗子:
创建函数:shrinkage可获得初始R方和交叉验证后的R方
shrinkage= function(fit,k=10){ require(bootstrap) theta.fit =function(x,y){lsfit(x,y)} theta.predict = function(fit,x){cbind(1,x)%*%fit$coef} x = fit$model[,2:ncol(fit$model)] y = fit$model[,1] results = crossval(x,y,theta.fit,theta.predict,ngroup = k) r2 = cor(y,fit$fitted.values)^2 r2cv = cor(y,results$cv.fit)^2 cat("Original R-square=",r2,"\n") cat(k,"Fold cross-Validated R-square=",r2cv,"\n") cat("change=",r2-r2cv,"\n") } states = as.data.frame(state.x77[,c("Population","Income","Illiteracy","Frost","Murder")]) fit = lm(Murder~.-Murder,data=states) shrinkage(fit)
可以看到,基于初始样本R方(0.567)过于乐观了,对新数据更好的方差解释率估计是交叉验证后的R方(0.484)
这里,我们可以选择模型变量是4个,我们可以选择具有更好的泛化能力的模型,比如说我们值采用两个变量
变量的相对性
我们一直会存在一个疑问“哪些变量对预测变量有用呢?”又或者是“哪些变量对预测最为重要”
如果预测变量之间不相关,我们直接采用相关系数就可以了,但是大部分情况预测变量之间具有一定的关系。
如此我们去分析变量的相对性就比较复杂了:我们通过以下两种办法
①将数据标准化,然后采用coef函数对回归模型做分析
states = as.data.frame(state.x77[,c("Population","Illiteracy", "Murder","Income","Frost")]) zstates = as.data.frame(scale(states)) fit = lm(Murder~.-Murder,data=zstates) coef(fit) > coef(fit) (Intercept) Population Illiteracy Income Frost -2.054026e-16 2.705095e-01 6.840496e-01 1.072372e-02 8.185407e-03 此处可以看到,当其他因数不变时,文盲率一个标准差的变化将增加0.68个标准差的谋杀率。 根据这个我们认为Frost最不重要
②相对权重:在整体的R方解释量时,各个变量对其解释的程度
构建:分析相对权重函数relweghts
relweghts <- function(fit,...){ R <-cor(fit$model) nvar <-ncol(R) rxx <-R[2:nvar,2:nvar] rxy<-R[2:nvar,1] svd<-eigen(rxx) evec<-svd$vectors ev<-svd$values delta<-diag(sqrt(ev)) lambda<-evec %*% delta %*% t(evec) lambdasq<-lambda^2 beta<-solve(lambda)%*%rxy rsquare<-colSums(beta^2) rawwgt<-lambdasq %*% beta^2 import<-(rawwgt/rsquare)*100 import<-as.data.frame(import) row.names(import)<-names(fit$model[2:nvar]) names(import)<-"Weights" import<-import[order(import),1,drop=FALSE] dotchart(import$Weights,labels = row.names(import), xlab="% of R-Square",pch=19, main="Relative Impotance of Predictor Variables", sub=paste("Total R-Square=",round(rsquare,digits = 3)),...) return(import) }
代码清单:
states = as.data.frame(state.x77[,c("Population","Illiteracy", "Murder","Income","Frost")]) fit = lm(Murder~.-Murder,data=states) relweghts(fit,col="blue")
通过图形:我们整体R方是(0.567)Illiteracy解释了59%的R方,Frost解释了20.79%,根据相对权重的重要性分别是:
"Illiteracy","Frost"Population","Income",
来源:https://www.cnblogs.com/hero799/p/12031552.html