用R做线性回归R方时,列向量被当作行向量处理,是为什么?数据读取没有出错

作为数据分析师每天都有大量嘚数据需要处理,我们会根据业务的要求做各种复杂的报表包括了分组、排序、过滤、转置、差分、填充、移动、合并、分裂、分布、詓重、找重、填充 等等的操作。

作为统计学一门语言一直在小众领域闪耀着光芒。直到的爆发R语言变成了一门炙手可热的的利器。随著越来越多的工程背景的人的加入R语言的社区在迅速扩大成长。现在已不仅仅是统计领域教育,银行电商,互联网…都在使用R语言要成为有理想的极客,我们不能停留在语法上要掌握牢固的数学,概率统计知识,同时还要有创新精神把R语言发挥到各个领域。讓我们一起动起来吧开始R的极客理想。

作为数据分析师每天都有大量的数据需要处理,我们会根据业务的要求做各种复杂的报表包括了分组、排序、过滤、转置、差分、填充、移动、合并、分裂、分布、去重、找重、填充 等等的操作。

有时为了计算一个业务指标你嘚SQL怎么写都不会少于10行时,另外你可能也会抱怨Excel功能不够强大这个时候R语言绝对是不二的选择了。用R语言可以高效地、优雅地解决数据處理的问题让R来帮你打开面向数据的思维模式。

一、为什么要用R语言做数据处理

R语言是非常适合做数据处理的编程语言,因为R语言的設计理念就是面向数据的,为了解决数据问题读完本文,相信你就能明白什么是面向数据的设计了。

一个BI工程师每天的任务都是非常繁琐的数据处理,如果用Java来做简直就是折磨但是换成R语言来做,你会找到乐趣的

当接到一个数据处理的任务后,我们可以把任务拆解为很多小的操作包括了分组、排序、过滤、转置、差分、填充、移动、合并、分裂、分布、去重、找重等等的操作。对于实际应用嘚复杂的操作来说就是把这些小的零碎的操作,拼装起来就好了

在开始之前,我们要先了解一下R语言支持的数据类型以及这些常用類型的特点。对于BI的数据处理的工作来说可能有4种类型是最常用的,分别是向量、矩阵、数据框、时间序列

我主要是用R语言来做量化投资,很多的时候都是和时间序列类型数据打交道,所以我把时间序列也定义为R语言最常用的数据处理的类型。时间序列类型使用嘚是第三方包xts中定义的类型。

2.1 创建一个数据集

 
 
创建一个数据框数据集
 
创建一个时间序列数据集,时间序列使用的第三方的xts类型关于xts类型的详细介绍,请参考文章 可扩展的时间序列xts
 

通常进行数据分析的第一步是,查看一下数据的概况信息在R语言里可以使用summary()函数来完成。
# 查看矩阵数据集的概况
# 查看数据框数据集的概况信息
 
通过查看概况可以帮助我们简单了解数据的一些统计特征。





我们经常需要对于数據集进行合并操作,让数据集满足处理的需求对于不同类型的数据集,有不同的处理方法





 
数据框类型的合并操作。


 



累计计算是很瑺用的一种计算方法,就是把每个数值型的数据累计求和或累计求积,从而反应数据的增长的一种特征


 
我们通常用累计计算,记录中間每一步的过程看到的数据处理过程的特征。





差分计算是用向量的后一项减去前一项,所获得的差值差分的结果反映了离散量之间嘚一种变化。


# 计算2阶差分迭代2次
 
下面做一个稍微复杂一点的例子,通过差分来发现数据的规律


# 对向量2次累积求和
# 计算1阶差分,迭代2次
 
差分其实是很常见数据的操作但这种操作是SQL很难表达的,所以可能会被大家所忽视





分组是SQL中,支持的一种数据变换的操作对应于group by的語法。


比如我们写一个例子。创建一个数据框有a,b,c的3列其中a,c列为数值型,b列为字符串我们以b列分组,求出a列与c的均值


 
同样的数据集,以b列分组对a列求和,对c列求均值当对不同列,进行不同的操作时我们同时也需要换其他函数来处理。



 
生成的结果就是按b列进行汾组后,a列求和c列求均值。





分裂计算是把一个向量按照一列规则,拆分成多个向量的操作


如果你想把1:10的向量,按照单双数拆分成2個向量。


 
另外可以用因子类型来控制分裂。分成2步操作第一步先分成与数据集同样长度的因子,第二步进行分裂可以把一个大的向量拆分成多个小的向量。


# 对向量以因子的规则进行拆分
 
这种操作可以非常有效地对数据集进行分类整理,比if..else的操作有本质上的提升。





排序是所有数据操作中最常见一种需求了。在R语言中你可以很方便的使用排序的功能,并不用考虑时间复杂度与空间复杂度的问题除非你自己非要用for循环来实现。






 
以数据框某一列进行排序


 
排序的操作,大多都是基于索引来完成的用order()函数来生成索引,再匹配的数据嘚数值上面





去重,是把向量中重复的元素过滤掉找重,是把向量中重复的元素找出来


 



转置是一个数学名词,把行和列进行互换一般用于对矩阵的操作。


# 创建一个3行5列的矩阵
# 转置后变成5行3列的矩阵
 



过滤,是对数据集按照某种规则进行筛选去掉不符合条件的数据,保留符合条件的数据对于NA值的操作,主要都集中在了过滤操作和填充操作中因此就不在单独介绍NA值的处理了。



 
过滤类似与SQL语句中的 WHERE 條件语句,如果你用100个以上的过滤条件那么你的程序就会比较复杂了,最好想办法用一些巧妙的函数或者设计模式来替换这些过滤条件。





填充是一个比较有意思的操作,你的原始数据有可能会有缺失值NA在做各种计算时,就会出现有问题一种方法是,你把NA值都去掉;另外一种方法是你把NA值进行填充后再计算。那么在填充值时就有一些讲究了。






 
填充时有时并不是用某个固定的值,而是需要基于某种规则去填充



 
另外,我们可以针对NA的位置进行填充比如用前值来填充或后值来填充。


 



计数是统计同一个值出现的次数。



 



 






统计分布是用来判断数据是否是满足某种统计学分布,如果能够验证了那么我们就可以用到这种分布的特性来理解我们的数据集的情况了。常見的连续型的统计分布有9种其中最常用的就是正态分布的假设。关于统计分布的详细介绍请参考文章 常用连续型分布介绍及R语言实现。

 
统计模型定义的回归模型就是基于正态分布的做的数据假设,如果残差满足正态分布模型的指标再漂亮都是假的。如果你想进一步叻解回归模型请参考文章R语言解读一元线性回归R方模型。
下面用正态分布来举例说明一下。假设我们有一组数据是人的身高信息,峩们知道平均身高是170cm然后我们算一下,这组身高数据是否满足正态分布


 



通过散点图来观察,发现数据是没有任何规律接下来,我们進行正态分布的检验Shapiro-Wilk进行正态分布检验。


 
该检验原假设为H0:数据集符合正态分布统计量W为。统计量W的最大值是1越接近1,表示样本与正態分布越匹配p值,如果p-value小于显著性水平α(0.05)则拒绝H0。检验结论: W接近1p-value>0.05,不能拒绝原假设所以数据集S符合正态分布!


同时,我们也可以鼡QQ图来做正态分布的检验。


 



图中散点均匀的分布在对角线,则说明这组数据符合正态分布


为了,更直观地对正态分布的数据进行观察我们可以用上文中计数操作时,使用的直方图进行观察


 



通过计数的方法,发现数据形状如钟型中间高两边低,中间部分的数量占叻95%这就是正态的特征。当判断出数据是符合正态分布后,那么才具备了可以使用一些的模型的基础





数值分段,就是把一个连续型的數值型数据按区间分割为因子类型的离散型数据。


 



集合操作是对2个向量的操作,处理2个向量之间的数值的关系找到包含关系、取交集、并集、差集等。



 



移动窗口是用来按时间周期观察数据的一种方法。移动平均就是一种移动窗口的最常见的应用了。


在R语言的的TTR包Φ支持多种的移动窗口的计算。

 
下面我们用移动平均来举例说明一下移动平均在股票交易使用的非常普遍,是最基础的趋势判断的根蹤指标了

# 计算周期为3的移动平均值
# 计算周期为5的移动平均值
 
当计算周期为3的移动平均值时,结果的前2个值是NA计算的算法是:


(第一个值 + 苐二个值 + 第三个值) /3 = 第三个值的移动平均值
 



 



图中黑色线是原始数据,蓝色线是周期为3的移动平均值红色线是周期为5的移动平均值。这3个线Φ周期越大的越平滑,红色线波动是最小的趋势性是越明显的。如果你想更深入的了解移动平均线在股票中的使用情况请参考文章②条均线打天下 。





时间对齐是在处理时间序列类型时常用到的操作。我们在做金融量化分析时经常遇到时间不齐的情况,比如某支股票交易很活跃每一秒都有交易,而其他不太活跃的股票可能1分钟才有一笔交易,当我们要同时分析这2只股票的时候就需要把他们的茭易时间进行对齐。


# 生成数据每秒一个值
# 生成数据,每59秒一个值
 
按分钟进行对齐把时间都对齐到分钟线上。


 
由于a1数据集每分钟有多條数据,取每分钟的最后一条代表这分钟就行


 
这样子就完成了时间对齐,把不同时间的数据放到都一个维度中了

三、个性化的数据变換需求

 
 
我们上面已经介绍了,很多种的R语言数据处理的方法大多都是基于R语言内置的函数或第三方包来完成的。在实际的工作中实际還有再多的操作,完全是各性化的
3.1 过滤数据框中,列数据全部为空的列
空值通常都会给我们做数值计算,带来很多麻烦有时候一列嘚数据都是空时,我们需要先把这一个过滤掉再进行数据处理。

用R语言程序进行实现:


 
3.2 替换数据框中某个区域的数据


我们想替换数据框Φ某个区域的数据那么应该怎么做呢?





找到第一个数据框中与第二个数据框中匹配的行的值作为条件,然后替换这一行的其他指定列嘚值


 
其实不管R语言中,各种内置的功能函数有多少自己做在数据处理的时候,都要自己构建很多DIY的函数


3.3 长表和宽表变换


长宽其实是┅种类对于标准表格形状的描述,长表变宽表是把一个行数很多的表,让其行数减少列数增加,宽表变长表是把一个表格列数减少荇数增加。





长表变宽表指定program列不动,用fun列的每一行生成新的列,再用time列的每个值进行填充



 
接下来,进行反正操作把宽表再转换为長表,还是使用reshape()函数


 
我们在宽表转换为长表时,可以指定想转换部分列而不是所有列,这样就需要增加一个参数进行控制比如,只變换time.fun2time.fun3列到长表,而不变换time.fun1列


 
这样子的转换变形,是非常有利于我们从多角度来看数据的





融化,用于把以列进行分组的数据转型为按行存储,对应数据表设计的概念为属性表设计。





我们设计一下标准的二维表结构然后按属性表的方式进行转换。



 
这个操作其实在使鼡ggplot2包画图时会被经常用到。因为ggplot2做可视化时画多条曲线时要求的输入的数据格式必须时属性表的格式。





周期分割是基于时间序列类型数据的处理。比如黄金的交易你可以用1天为周期来观察,也可以用的1小时为周期来观察也可以用1分钟为周期来看。


下面我们尝试先苼成交易数据再对交易数据进行周期的分割。本例仅为周期分割操作的示范数据为随机生成的,请不要对数据的真实性较真



 
假设我們要生成1年的交易数据,先产生1年的日期向量然后循环生成每日的数据。



 
现在有了数据那么我们可以对数据日期,按周期的分割了從而生成开盘价、最高价、最低价、收盘价。这里一样会用到xts包的函数关于xts类型的详细介绍,请参考文章 可扩展的时间序列xts


# 按日进行汾割,对应高开低收的价格
 
最后通过可视化把不同周期的收盘价,画到一个图中


 



从图中,可以看出切换为不同的周期看到的形状是唍全不一样的。黑色线表示以日为周期的红色线表示以7日为周期的,蓝色线表示以月为周期的


从本文的介绍来看,要做好数据处理是楿当不容易的你要知道数据是什么样的,业务逻辑是什么怎么写程序以及数据变形,最后怎么进行BI展示表达出正确的分析维度。试試R语言忘掉程序员的思维,换成数据的思维也许繁琐的数据处理工作会让你开心起来。


本文所介绍的数据处理的方法及个性化的功能函数,我已经发布为一个github的开源项目项目地址为: 欢迎大家试用,共同完善

作者:张丹(Conan),程序员关注Java、R、PHP、Javascript。本文原载于作鍺更多内容欢迎关注作者博客。


高尔顿被誉为现代回归的创始人"回归效应"的发现源于高尔顿的豌豆遗传试验。在这个试验中高尔顿发现,并非尺寸大的豌豆其后代尺寸也大,尺寸小的豌豆其后玳尺寸也小。而是具有一种不同的趋势即尺寸大的豌豆趋向于得到尺寸更小的子代,而尺寸小的豌豆趋向于得到尺寸更大的后代高尔頓把这一现象称为"返祖",后来又称为"向平均值回归""回归效应"的应用非常广泛,生活中随处可见这样的例子

线性回归R方分析主要用于数徝型数据之间的分析,因此要求所要分析的对象必须是数值型数据即使不是数值型数据,也要想办法变成数值型数据比如性别可以用0-1玳替,成绩的优良中差可以用1-2-3-4表示等当然这只是一种粗略的处理方法,当遇到分类型数据时可以运用其他相应的方法处理,而不必非偠使用线性回归R方

变量之间往往具有两种关系,即确定的函数关系与不确定的相关关系形如

则可以称为函数关系,这里y与x具有一一对應的关系即x每取一个值,y有一个确定的值与之对应而当x每取一个值时,y的值虽然不确定但是总在一个确定的数的周围变动,则这种鈈确定的关系可以称之为相关关系

为了对变量之间的相关性进行描述与度量,提出了相关分析的概念相关分析主要解决以下几个问题:

(1)变量之间是否存在关系?

(2)如果存在关系是什么样的关系?

(4)样本所表现的关系是否能够代表总体变量之间的关系

在进行楿关分析时,需要对总体做出如下两个假定:

(1)两个变量之间是线性关系

(2)两个变量都是随机变量

①利用散点图观察变量的关系

按照仩式计算出来的相关系数称为线性相关系数,也称为Pearson相关系数.

线性相关系数具有如下几个性质:

  1. r的取值范围在-1到1之间且包含-1和1;
  2. r的取值大小與原点和尺度无关;
  3. r仅仅是用来度量两个变量的线性关系强弱,不能用来度量非线性关系;
  4. 具有相关关系并不代表具有因果关系

注:一般认为,因果关系是现象之间的引起与被引起的关系引起一个现象的现象叫做原因,被一个现象引起的现象叫做结果而同时变化并不意味着具有因果关系。比如雷声和闪电往往同时出现,但是并不是雷声引起了闪电也不是闪电引起了雷声,而是云层之间的摩擦发出嘚声音并且形成了闪电。

③相关关系的显著性检验

对相关系数进行显著性检验往往假设r服从正态分布,因此可以应用正态分布来检驗。

第二步:计算检验统计量

第三步:进行统计决策。

t的自由度为n-2,可查t分布表如果|t|>|tα/2|,则可以拒绝原假设认为两个变量之间存在显著地线性关系。

在R语言中可以用cor.test()函数进行相关系数检验。

x,y:数值型向量或者数据框x和y必须具有相同的长度 alternative:双边检验,左单侧检验还是右單侧检验 method:计算相关系数的方法 exact:逻辑值是否计算精确的p值

有以下数据,展示的是某校研究生入学考试的初试分数、复试分数与总分现在探究初试分数与复试分数的关系,看看是否具有相关性

>#对初试分数和复试分数进行相关分析: >#从R的输出结果中可以看出,相关系数为0.21楿应的p值为0.153,由于p远大于常用的α=0.05因此,无法拒绝原假设认为初试分数与复试分数没有显著的相关性。 >#接下来探究初试分数与总分的關系

从上述结果可以看出,即使相关系数r只有0.323但是p值=0.02678,小于常用的α=0.05如果仅从p值的角度考虑,可认为初试分数与总分具有显著的相關性

回归分析与相关分析具有本质的区别,具体来说回归分析主要解决以下几个问题:

  1. 从一组样本数据出发,确定变量之间的数学表達式;
  2. 对这些关系式的可信程度进行各种统计检验并确定哪些变量的影响是显著的,哪些是不显著的;
  3. 利用所求的关系式对目标变量進行预测。

2.1 一元线性回归R方模型

其中y表示被预测的变量,即因变量x表示预测变量,即自变量和分别为模型的参数。为随机误差项表示不能被自变量与因变量之间的线性关系解释的部分。整个方程除去随机误差项则反映了自变量与因变量之间的线性关系对因变量的影响。

该模型具有几个假设条件:

  1. 因变量与自变量之间具有线性关系;
  2. 在重复抽样中自变量x的取值是固定的,即自变量x非随机变量;
  3. 随機误差项服从同方差、0期望的正态分布即

根据回归模型中的假定,的期望为0则。其中表示回归直线在y轴上的截距为直线的斜率。上述方程即为回归方程

由于与是未知的,也就是需要求的总体参数这就需要用样本统计量去估计总体参数。因此用样本统计量和来代替总体参数所得的方程即为估计的回归方程。

2.2 参数的最小二乘估计

假如给定一组样本我们可以做无数条直线去近似表示自变量与因变量嘚关系,但是到底那一条直线是最优的这就需要一个评价准则。也就是说坐标上的各点到直线的距离最近。德国数学家卡尔·高斯提出用最小化图中垂直方向的离差平方和来估计和,根据这一方法确定模型参数和的方法称为最小二乘法,它是通过使因变量的观测值与估计值之间的离差平方和达到最小来估计和的方法

在给定样本数据后,Q是和的函数且最小值总是存在的。根据微积分的极值定理对Q求相應于和的偏导数,并令其等于0便可求出和,即

由上式可知直线过样本的中心,即

利用上述数据,对总成绩与初试成绩进行回归分析在R中可求出相应的估计值。

在R中可以用lm()函数对线性回归R方方程进行拟合,该函数返回的是一个回归对象用summary()函数可以输出该对象的一些细节。

Coefficients:估计的回归系数、标准误、t值、p值以及R平方等统计量

2.3 回归直线的拟合优度

在方差分析文章中,已经介绍过R平方的计算原理这裏回归直线的拟合优度与之类似,也用R平方来衡量

记总平方和为SST,即

而每个观测点的离差可以***为:

SSE表示除了x对y的线性影响之外的其怹因素引起的误差是不能被回归直线解释的变差部分,称为误差平方和

SSR表示x对y的线性影响,是可以由回归直线解释的部分称为回归岼方和。

回归平方和占总平方和的比例称为判定系数

根据R平方,可以判断直线对数据的拟合程度

同时,R平方与在数值上是相关系数r嘚平方因此,假设即使r已经达到了0.5但是R平方仅为0.25,不能说明拟合得很好

估计标准误差是度量各实际观测点在直线周围散布状况的一個统计量,同时均方残差(MSE)的平方根,用Se来表示其计算公式为:

估计标准误差是对误差项的标准差的估计,可以看做在排除了x对y的线性影响後y随机波动大小的一个估计量。

第二步:计算检验统计量F

第三步:做出统计决策。

F服从第一自由度为1第二自由度为n-2的F分布,查F分布表若F大于Fα(1,n-2),则拒绝原假设,认为两个变量之间的线性关系是显著的

第二步:计算检验统计量t。

其中,t服从自由度为n-2的t分布。

第三步:进行统计决策

在一元线性回归R方中,线性关系的检验与回归系数的检验等价但在多元回归分析中,具有不同的意义

下面给出几個结果的计算公式:

预测是指通过自变量x的取值来预测因变量y的取值。

对于一个给定的x0求出y的一个个别值的估计值

对于一个给定的值x0求出y的平均值的一个估计值

置信区间估计就是对x的一个给定值x0,求出y的平均值的区间估计用表示的标准差的估计量,其计算公式为

E(y0)在1-α的置信水平下的置信区间为:

预测区间估计是对x的一个给定值x0求出y的一个个别值的区间估计。

y的一个个别值y0的标准差为,其计算公式为:

因此对于给定的x0,y的一个个别值y0在1-α置信水平下的预测区间可表示为:

确定有关ε的假定是否成立的方法之一就是进行残差分析。

残差图分为关于x的残差图、关于的残差图、标准化残差图等该例中,关于x的残差图如下:

发现除了一个点偏离比较严重意外其他的點都较为均匀地分布在0周围。

标准化残差是残差除以它的标准差以后得到的数值

虽然标准化残差在0两侧均匀分布,但是似乎具有某种趋勢不一定满足随机误差项的假设。

最后我们看F-statistic,也就是我们常说嘚F统计量也成为F检验,常常用于判断方程整体的显著性检验其P值为0.009227,显然是<0.05的我们可以认为方程在P=0.05的水平上还是通过显著性检验的。

这样我们可以稍微这样总结一下:

T检验是检验解释变量的显著性的;

R-squared是查看方程拟合程度的;

F检验是检验方程整体显著性的;

如果是┅元线性回归R方方程,T检验的值和F检验的检验效果是一样的对应的值也是相同的,大概就是这样吧

参考资料

 

随机推荐