R语言统计分析——回归模型深层次分析

2024-08-29 07:44

本文主要是介绍R语言统计分析——回归模型深层次分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

参考资料:R语言实战【第2版】

        本文主要讨论回归模型的泛化能力和变量相对重要性的方法。

1、交叉验证

        从定义上看,回归方法就是从一堆数据中获取最优模型参数。对于OLS(普通最小二乘)回归,通过使得预测误差(残差)平方和最小和对响应变量的解释度(R平方)最大,可获得模型参数。由于等式只是最优化已给出的数据,所以在新数据集上表现并不一定好。

        通过交叉验证法,我们可以评价回归方程的泛化能力。所谓交叉验证,就是将一定比例的数据挑选出来作为驯良样本,另外的样本作为保留样本,先在训练样本上获取回归方程,然后在保留样本上做预测。由于保留样本不涉及模型参数的选择,该样本可获得比新数据更为精确的估计。

        在k重交叉验证中,样本被分为k个子样本,轮流将k-1个子样本组合作为训练集,另外1个子样本作为保留集。这样会获得k个预测方程,记录k个保留样本的预测表现结果,然后求其平均值。

        bootstrap包中的crossval()函数可以实现k重交叉验证。如下:

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)^2r2cv<-cor(y,results$cv.fit)^2cat("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("Murder","Population","Illiteracy","Income","Frost")])
fit<-lm(Murder~Population+Income+Illiteracy+Frost,data=states)
shrinkage(fit)

        有结果可知,基于初始用样本的R平法(0.567)过于乐观,对新数据更好的方差解释率估计是交叉验证后的R平方(0.476)。(注意,由于观测被随机分配到k个群组中,因此每次运行shrinkage()函数,得到的结果都会有些许不同

2、相对重要性

        我们根据线性回归模型做出来预测方程后,还有一个问题需要关注:哪些变量对于我们的预测来说更为重要?

        若预测变量不相关,过程就像对简单得多,我们可以根据预测变量与响应变量的相关系数来进行排序。但大部分情况中,预测变量之间有一定相关性,这就使得评价变得复杂很多。

        评价预测变量的相对重要性最简单的方法就是比较标准化的回归系数,它表示当其他预测变量不变时,该预测变量一个标准差的变化可引起的响应变量的预期变化(以标准差单位度量)。在进行回归分析前,可用scale()函数将数据标准化为均值为0、标准差为1的数据集,这样用R回归即可获得标准化的回归系数。(注意,scale()函数返回的是一个矩阵,而lm()函数要求的是一个数据框,我们需要一个中间步骤来转换一下。)如下:

states<-as.data.frame(state.x77[,c("Murder","Population","Illiteracy","Income","Frost")])
# 对数据进行标准化
zstates<-as.data.frame(scale(states))
# 查看标准化后的数据
head(zstates)
# 对标准化后的数据进行拟合
zfit<-lm(Murder~Population+Income+Illiteracy+Frost,data=zstates)
# 查看回归系数
coef(zfit)

        有结果可知:当其他以因素不变时,Illiteracy一个标准差的变化将增加0.68个标准差的谋杀率。根据标准化的回归系数,我们可以认为Illiteracy是最重要的预测变量。

        还有其他方法可定量分析预测变量的相对重要性。比如,可以将相对重要性看作每个预测变量(本身或与其他预测变量组合)对R平方的贡献。相对权重是对所有可能子模型添加一个预测变量引起的R平方平均增加量的一个近似值。如下:

# 编写相对权重函数
relweights<-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$vectorsev <- svd$valuesdelta <- diag(sqrt(ev))lambda <- evec %*% delta %*% t(evec)lambdasq <- lambda^2beta <- solve(lambda) %*% rxyrsquare <- colSums(beta ^ 2)rawwgt <- lambdasq %*% beta ^ 2import <- (rawwgt / rsquare) * 100import <- as.data.frame(import)row.names(import) <- names(fit$model[2:nvar])names(import) <- "Weights"dotchart(import$Weights, labels=row.names(import),xlab="% of R-Square", pch=19,main="Relative Importance of Predictor Variables",sub=paste("Total R-Square=", round(rsquare, digits=3)),...)return(import)
}
# 应用相对权重函数
states<-as.data.frame(state.x77[,c("Murder","Population","Illiteracy","Income","Frost")])
fit<-lm(Murder~Population+Illiteracy+Income+Frost,data=states)
relweights(fit,col="blue")

        由上面结果可知:Illiteracy解释了59%的R平方,而Frost解释了20.79%,以此类推。根据相对权重法,Illiteracy有最大的相对重要性,其他变量相对重要性从大到小分别是:Frost、Population和Income。

        相对权重函数也给出来个变量相对权重的点图,可以更加直观的看到哪个变量更加重要。

这篇关于R语言统计分析——回归模型深层次分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1117268

相关文章

C语言中位操作的实际应用举例

《C语言中位操作的实际应用举例》:本文主要介绍C语言中位操作的实际应用,总结了位操作的使用场景,并指出了需要注意的问题,如可读性、平台依赖性和溢出风险,文中通过代码介绍的非常详细,需要的朋友可以参... 目录1. 嵌入式系统与硬件寄存器操作2. 网络协议解析3. 图像处理与颜色编码4. 高效处理布尔标志集合

Go语言开发实现查询IP信息的MCP服务器

《Go语言开发实现查询IP信息的MCP服务器》随着MCP的快速普及和广泛应用,MCP服务器也层出不穷,本文将详细介绍如何在Go语言中使用go-mcp库来开发一个查询IP信息的MCP... 目录前言mcp-ip-geo 服务器目录结构说明查询 IP 信息功能实现工具实现工具管理查询单个 IP 信息工具的实现服

C 语言中enum枚举的定义和使用小结

《C语言中enum枚举的定义和使用小结》在C语言里,enum(枚举)是一种用户自定义的数据类型,它能够让你创建一组具名的整数常量,下面我会从定义、使用、特性等方面详细介绍enum,感兴趣的朋友一起看... 目录1、引言2、基本定义3、定义枚举变量4、自定义枚举常量的值5、枚举与switch语句结合使用6、枚

Java程序进程起来了但是不打印日志的原因分析

《Java程序进程起来了但是不打印日志的原因分析》:本文主要介绍Java程序进程起来了但是不打印日志的原因分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java程序进程起来了但是不打印日志的原因1、日志配置问题2、日志文件权限问题3、日志文件路径问题4、程序

Java字符串操作技巧之语法、示例与应用场景分析

《Java字符串操作技巧之语法、示例与应用场景分析》在Java算法题和日常开发中,字符串处理是必备的核心技能,本文全面梳理Java中字符串的常用操作语法,结合代码示例、应用场景和避坑指南,可快速掌握字... 目录引言1. 基础操作1.1 创建字符串1.2 获取长度1.3 访问字符2. 字符串处理2.1 子字

Python 迭代器和生成器概念及场景分析

《Python迭代器和生成器概念及场景分析》yield是Python中实现惰性计算和协程的核心工具,结合send()、throw()、close()等方法,能够构建高效、灵活的数据流和控制流模型,这... 目录迭代器的介绍自定义迭代器省略的迭代器生产器的介绍yield的普通用法yield的高级用法yidle

Go 语言中的select语句详解及工作原理

《Go语言中的select语句详解及工作原理》在Go语言中,select语句是用于处理多个通道(channel)操作的一种控制结构,它类似于switch语句,本文给大家介绍Go语言中的select语... 目录Go 语言中的 select 是做什么的基本功能语法工作原理示例示例 1:监听多个通道示例 2:带

C++ Sort函数使用场景分析

《C++Sort函数使用场景分析》sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变,如果某些场景需要保持相同元素间的相对顺序,可使... 目录C++ Sort函数详解一、sort函数调用的两种方式二、sort函数使用场景三、sort函数排序

C语言函数递归实际应用举例详解

《C语言函数递归实际应用举例详解》程序调用自身的编程技巧称为递归,递归做为一种算法在程序设计语言中广泛应用,:本文主要介绍C语言函数递归实际应用举例的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录前言一、递归的概念与思想二、递归的限制条件 三、递归的实际应用举例(一)求 n 的阶乘(二)顺序打印

Spring Security基于数据库的ABAC属性权限模型实战开发教程

《SpringSecurity基于数据库的ABAC属性权限模型实战开发教程》:本文主要介绍SpringSecurity基于数据库的ABAC属性权限模型实战开发教程,本文给大家介绍的非常详细,对大... 目录1. 前言2. 权限决策依据RBACABAC综合对比3. 数据库表结构说明4. 实战开始5. MyBA