回归分析

南楼画角 提交于 2019-12-12 21:01:55

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",


 

 

 

 

  

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!