15

作者简介

okajun

个人博客:https://ask.hellobi.com/blog/okajun

往期回顾:

一元(多元)线性回归分析之Excel实现

上篇介绍了《一元(多元)线性回归分析之Excel实现》,本篇来探讨一下回归分析在R语言中的实现,我们将从更专业的角度对模型进行一些解读。

1. 一元线性回归

同样,我们仍然使用R中自带的women数据集,来看一下数据样式:

1.1 数据探索

首先做散点图查看数据的分布情况:

plot(women$height, women$weight,
    xlab = "Height (in inchs)", ylab = "Weight (in pounds)")

可以看到散点分布呈现线性规律,说明适合构建线性回归方程。

1.2 构建模型

fit <- lm(weight ~ height, data = women)

可以看到R做线性回归非常简单,只需要简单的lm函数即可。

1.3 模型解读

# 查看模型
summary(fit)

首先看R-squared:  0.991,说明模型的解释性非常好,能够解释99%的方差,且F检验的p-value: 1.091e-14远远小于0.05,说明模型通过了F检验;

再看截距项和系数,都通过了t检验,且height的系数为正,表明随着身高的增长,体重也增长,符合客观事实。

得到回归方程:weight = -87.51667 + 3.45000*height

查看一下模型拟合效果:

plot(women$height, women$weight,
    xlab = "Height (in inchs)", ylab = "Weight (in pounds)")
abline(fit)

回归诊断:

par(mfrow=c(2,2)) # 设置一个画布上输出2*2个图形
plot(fit)
par(mfrow=c(1,1)) # 恢复设置

上图缩放后可能不够清晰,我们来解读一下:

左上图:残差与拟合图,理论上散点应该散乱的分布在横线两侧,但是此图明显有一个曲线关系,说明我们的模型需要加入一个二次项(这一点从散点图亦可以看出来)。

右上图:正太Q-Q图,用于检验因变量的正太分布性,若服从正太分布,则散点应分布在一条直线上,此图满足表明满足正态性假设。

左下图:齐方差检验,若满足其方差,则散点在水平线周围随机分布,此图满足齐方差检验。

右下图:独立性检验,即一个样本是否会影响另一个样本,我们的样本数据似乎并不存在这样的问题。

1.4 模型修正

增加一个二次项进模型:

fit2 <- lm(weight ~ height + I(height^2), data = women)
summary(fit2)
plot(women$height, women$weight,
    xlab = "Height (in inchs)", ylab = "Weight (in pounds)")
lines(women$height, fitted(fit2))

得到R-squared:  0.9995,模型效果得到了提升;拟合效果也有一些改善。

2. 多元线性回归

相较于一元,多元线性回归需要考虑的问题较多,我们还是用salary数据集(数据文件见上篇)。

# 导入数据
dataset <- read.csv("C:\\Users\\huzhanpeng\\Desktop\\Regression\\salary.csv")
df <- dataset[, -1]
head(df)

2.1 数据探索

做散点图矩阵,查看各变量之间的关系

library(car)
scatterplotMatrix(df, spread = F, smoother=loessLine, main = "Scatter Plot Matrix")

可以看到salary与其余三个变量都有比较明显的正的线性相关关系,另外age和company_age也有明显的正相关。

我们来看一下各变量间的相关系数:

cor(df)

2.2 构建模型

fit <- lm(salary ~ .,data = df) # 用.表示数据框中的其余变量

2.3 模型解读

summary(fit)

可以看出模型效果显著,且通过了F检验,截距项和系数也都通过了t检验。

2.4 模型检验

我们对方程进行进一步检验,以检查回归方程是否满足模型的先验条件及模型的稳健性。

2.4.1 正态性、独立性、线性、齐方差(使用car包)

# 正态性

qqPlot(fit, labels = rownames(df), id.method = 'identify',
      simulate = TRUE, main = "Q-Q Plot")

可以看到散点都分布在直线两侧,且没有明显偏离虚线区间的点,说明方程满足正态性的先验条件。

# 独立性

p值0.636接受原假设,说明无自相关性,误差项之间独立。

# 线性

crPlots(fit)

可以看到满足此条件

# 齐方差

p>0.05,接受原假设,误差方差不变

2.4.2 多重共线性

library(car)
vif(fit)

# 一般sqrt(vif)>2就表明存在多重共线性的问题
sqrt(vif(fit)) > 2

可以看出:age和company_age都引入方程时,方程存在多重共线性(两者的相关系数为0.87,上面已得知)。

如果仅仅是做预测,那么多重共线性并不构成问题。但是如果还要对每个预测变量进行解释,那么就必须解决这个问题。最常见的方法就是删除某个存在多重共线性的变量。另外一个可用的方法便是岭回归,专门用来处理多重共线性的问题。

2.4.3 异常值

异常值检验主要是从模型的稳健性考虑,是否有离群点、强影响点、高杠杆值的影响。

library(car)
influencePlot(fit, id.method = "identify", main = "Influence Plot",
   sub = "Circle size is proportial to Cook's Distance")

# 纵坐标超过+2或小于-2的散点可被认为是离群点

# 水平轴超过0.2或0.3的散点有高杠杆值

# 圆圈大小与影响成比例,圆圈很大的点可能是对模型参数的估计造成的不成比例影响的强影响点

2.5 模型评估

2.5.1 K重交叉验证

在k 重交叉验证中,样本被分为k个子样本,轮流将k1个子样本组合作为训练集,另外1个子样本作为保留集。这样会获得k 个预测方程,记录k 个保留样本的预测表现结果,然后求其平均值。 [当n 是观测总数目, k 为n 时,该方法又称作刀切法(jackknifing)。 ]

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

# Function for k-fold cross-validated R-square
shrinkage <- function(fit, k = 10) {
   require(bootstrap)
   # define functions
   theta.fit <- function(x, y) {
       lsfit(x, y)
   }
   theta.predict <- function(fit, x) {
       cbind(1, x) %*% fit$coef
   }
   
   # matrix of predictors
   x <- fit$model[, 2:ncol(fit$model)]
   # vector of predicted values
   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")
}

shrinkage(fit)

模型的R²从0.896降到了0.876,变化不大。

2.5.2 变量的重要性

进入方程的几个变量谁起到的作用更大呢?

方法1:

zdf <- as.data.frame(scale(df))
zfit <- lm(salary ~ ., data = zdf)
coef(zfit)

可以看到三个变量之间的重要性差别不是非常明显,age最重要

方法2:

# 相对权重(relative weight)方法
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$vectors
 ev <- svd$values
 delta <- diag(sqrt(ev))
 
 # correlations between original predictors and new orthogonal variables
 lambda <- evec %*% delta %*% t(evec)
 lambdasq <- lambda^2
 
 # regression coefficients of Y on orthogonal variables
 beta <- solve(lambda) %*% rxy
 rsquare <- colSums(beta^2)
 rawwgt <- lambdasq %*% beta^2
 import <- (rawwgt/rsquare) * 100
 lbls <- names(fit$model[2:nvar])
 rownames(import) <- lbls
 colnames(import) <- "Weights"
 
 # plot results
 barplot(t(import), names.arg = lbls, ylab = "% of R-Square",
         xlab = "Predictor Variables", main = "Relative Importance of Predictor Variables",
         sub = paste("R-Square = ", round(rsquare, digits = 3)),
         ...)
 return(import)
}

# using relweights()
relweights(fit, col = "lightgrey")

可以得出同样的结论:age这个变量较company_age和education对回归方程的影响更大。

2.6 模型修正

由于存在多重共线性的问题,我们对模型进行修正处理(如前文所述,若为预测用,可以不用考虑共线性问题)。

2.6.1 剔除引起共线性的变量

根据前文,我们知道了age和company_age存在高度相关,且age对模型更重要,所以我们剔除company_age这个变量

fit2 <- lm(salary ~ age + education, data=df)
summary(fit2)

可以看到:剔除了company_age后模型效果依然不错,R²从0.896变为了现在的0.881,变化不大,效果很好;方程也通过了F检验、t检验。

2.6.2 岭回归

require(ridge)
fit.ridge<-linearRidge(salary ~ ., data=df)
summary(fit.ridge)

对于多元线性回归,当自变量较多时,可以先使用逐步回归的方法来筛选变量进入模型,R实现起来非常简单,不再赘述。

以上,不正之处还请大家指出,如有更好的建议也请不吝赐教,也欢迎大家多多推荐,谢谢。

 大家都在看 

2017年R语言发展报告(国内)

R语言中文社区历史文章整理(作者篇)

R语言中文社区历史文章整理(类型篇)

公众号后台回复关键字即可学习

回复 R                  R语言快速入门及数据挖掘 
回复 Kaggle案例  Kaggle十大案例精讲(连载中)
回复 文本挖掘      手把手教你做文本挖掘
回复 可视化          R语言可视化在商务场景中的应用 
回复 大数据         大数据系列免费视频教程 
回复 量化投资      张丹教你如何用R语言量化投资 
回复 用户画像      京东大数据,揭秘用户画像
回复 数据挖掘     常用数据挖掘算法原理解释与应用
回复 机器学习     人工智能系列之机器学习与实践
回复 爬虫            R语言爬虫实战案例分享

一元(多元)线性回归分析之R语言实现相关推荐

  1. 多元线性回归分析(R语言)

    ▼多元线性回归分析▼ 一.多元线性回归模型 设变量Y与X1,X2,--,Xp之间有线性关系 其中    , 和  是未知参数,p≥2,称上公式为多元线性回归模型. 二.参数估计 我们根据多元线性回归模 ...

  2. 一元线性回归分析的R语言实现(RStudio)

    简介 回归分析是一种应用广泛的数理统计方法,它是研究变量与变量之间的相关关系,这种关系大致分为两类:确定性关系(能用函数精确描述)和非确定性关系(不能用函数描述). 变量间的非确定性关系称为相关关系. ...

  3. R语言计量(一):一元线性回归与多元线性回归分析

    文章目录 一.数据调用与预处理 二.一元线性回归分析 三.多元线性回归分析 (一)解释变量的多重共线性检测 (二)多元回归 1. 多元最小二乘回归 2. 逐步回归 (三)回归诊断 四.模型评价-常用的 ...

  4. 用R进行多元线性回归分析建模

    概念:多元回归分析预测法,是指通过对两个或两个以上的自变量与一个因变量的相关分析,建立预测模型进行预测的方法.当自变量与因变量之间存在线性关系时,称为多元线性回归分析. 下面我就举几个例子来说明一下 ...

  5. 数学建模-7.多元线性回归分析

    多元线性回归分析 回归分析是数据分析中最基础也是最重要的分析工具,绝大多数的数据分析问题,都可以使用回归的思想解决 回归分析的任务:通过研究自变量X和因变量Y的相关关系(注意相关性≠因果性),尝试解释 ...

  6. 多元线性回归分析预测法概述

    在市场的经济活动中,经常会遇到某一市场现象的发展和变化取决于几个影响因素的情况,也就是一个因变量和几个自变量有依存关系的情况.而且有时几个影响因素主次难以区分,或者有的因素虽属次要,但也不能略去其作用 ...

  7. 【数学建模笔记】【第七讲】多元线性回归分析(一): 回归分析的定义、对于线性的理解以及内生性问题的探究

    多元线性回归分析 回归分析是数据分析中最基础也是最重要的分析工具,绝大多数的数据分析问题,都可以使用回归的思想来解决.回归分析的任务就是,通过研究自变量X和因变量Y的相关关系,尝试去解释Y的形成机制, ...

  8. 多元线性回归matlab代码_医学统计|多元线性回归分析

    回归分析的定义:回归分析是确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法.运用十分广泛.其表达形式为y = w'x+e,e为误差服从均值为0的正态分布.回归分析中,只包括一个自变量和一个 ...

  9. 数学建模暑期集训6:用SPSS对数据进行多元线性回归分析

    在本专栏的第六篇数学建模学习笔记(六)多元回归分析算法(matlab)博文中,记录了如何用matlab进行多元回归分析.本篇则将使用spss软件达到同样的效果,且使用起来比matlab更为方便. 空谈 ...

  10. 5.1 多元线性回归分析

    在本章中,我们将从线性回归模型开始,它是最简单的模型之一. 数据集来自于UIC数据集中的能效数据集,该数据及用来分析建筑的供热负荷能效和制冷负荷能效,其中自变量有8个,因变量有两个,实例主要分析8个自 ...

最新文章

  1. redis的安装和测试
  2. Redis 与 Memcached的区别
  3. 无盘服务器为什么重启还原,无盘站反复重启怎么办
  4. win8系统的计算机共享在哪里设置方法,win10系统设置与win8系统局域网文件共享的方案...
  5. bootstrap表单拖拽生成器插件_web前端常用插件、工具类库汇总,新手必收藏!!!...
  6. 牛客网编程题——字符串_空格替换
  7. AWS学习笔记(四)--CLI创建EC2时执行脚本
  8. CentOS6.4 xen4.2 虚拟机 桥接网络设置
  9. Java - HashSet源码解析
  10. [云计算]网线的标签格式
  11. Silverlight 解谜游戏 之七 放大镜(3)
  12. 计算机专业毕业论文写作指导(案例超详解)
  13. win7电脑误删鼠标键盘驱动_电脑usb驱动误删鼠标键盘怎么解决?
  14. WPF实现截图功能——WPF制作文字OCR软件(三)
  15. 利用灰色关联法确定指标权重
  16. python数据与挖掘实战学习:实战篇 第七章航空公司客户价值分析笔记
  17. 计算机仿真和vr的区别,扫盲科普:今天才知道VR和AR的区别
  18. 在mysql中,涉及到金钱的数据类型一般是什么?
  19. 搭建电信之“云”需从基础入手 业务拓展紧跟市场需求
  20. pytorch之models

热门文章

  1. 肝完这篇 TCP/IP ,我就面试去!
  2. 这几道Redis面试题都不懂,怎么拿到阿里后端offer?
  3. 当规模到亿级,MySQL是一个更好的NoSQL!
  4. java 浅堆 深堆_【深入浅出-JVM】(57):深堆、浅堆
  5. 投入工作与生活幸福,并非简单对立
  6. Redis分布式锁方案
  7. 〖Python〗-- 模块与包
  8. 关于 System.getProperty
  9. ajax 的post方法用例(带循环)
  10. C# 判断字符中是否包含中文