<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>时间序列 on 格物堂</title><link>https://gewutang.cn/tags/%E6%97%B6%E9%97%B4%E5%BA%8F%E5%88%97/</link><description>Recent content in 时间序列 on 格物堂</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Wed, 04 Jun 2014 00:00:00 +0000</lastBuildDate><atom:link href="https://gewutang.cn/tags/%E6%97%B6%E9%97%B4%E5%BA%8F%E5%88%97/index.xml" rel="self" type="application/rss+xml"/><item><title>R时间序列笔记：zoo包</title><link>https://gewutang.cn/2014/06/04/notes-on-zoo/</link><pubDate>Wed, 04 Jun 2014 00:00:00 +0000</pubDate><guid>https://gewutang.cn/2014/06/04/notes-on-zoo/</guid><description>&lt;p&gt;R软件是处理时间序列的利器。之所以这么说主要是基于两点：一是R软件中的时间序列模型异常丰富，已经将从计量经济学的良心arma到garch族模型到VAR模型以及时间序列结构变异点诊断等一网打尽；二是R软件中的时间序列对象的类型也足够丰富，可以让我们随心所欲地处理规则时间序列和不规则时间序列，以及让不规则时间序列拥有规则的时间属性。以上种种方便都让我们在处理经济和金融时间序列时更加得心应手。&lt;/p&gt;&#10;&lt;p&gt;目前，R中已有的时间序列相关包如下。&lt;/p&gt;&#10;&lt;table&gt;&#10;&lt;tr&gt;&#10;&lt;td&gt;时序类型&lt;/td&gt;&lt;td&gt;对象类型&lt;/td&gt;&lt;td&gt;索引类型&lt;/td&gt;&lt;td&gt;R包&lt;/td&gt;&#10;&lt;/tr&gt;&#10;&lt;tr&gt;&#10;&lt;td&gt;规则时间序列&lt;/td&gt;&lt;td&gt;ts&lt;/td&gt;&lt;td&gt;Date&lt;/td&gt;&lt;td&gt;stat包&lt;/td&gt;&#10;&lt;/tr&gt;&#10;&lt;tr&gt;&#10;&lt;td&gt;不规则时间序列&lt;/td&gt;&lt;td&gt;timeSeries&lt;/td&gt;&lt;td&gt;timeDate&lt;/td&gt;&lt;td&gt;timeSeries(fSeries)&lt;/td&gt;&#10;&lt;/tr&gt;&#10;&lt;tr&gt;&#10;&lt;td&gt;不规则时间序列&lt;/td&gt;&lt;td&gt;its&lt;/td&gt;&lt;td&gt;POSIXct&lt;/td&gt;&lt;td&gt;its包&lt;/td&gt;&#10;&lt;/tr&gt;&#10;&lt;tr&gt;&#10;&lt;td&gt;不规则时间序列&lt;/td&gt;&lt;td&gt;irts&lt;/td&gt;&lt;td&gt;POSIXct&lt;/td&gt;&lt;td&gt;tseries包&lt;/td&gt;&#10;&lt;/tr&gt;&#10;&lt;tr&gt;&#10;&lt;td&gt;各种&lt;/td&gt;&lt;td&gt;zoo&lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt;zoo包&lt;/td&gt;&#10;&lt;/tr&gt;&#10;&lt;tr&gt;&#10;&lt;td&gt;各种&lt;/td&gt;&lt;td&gt;xts&lt;/td&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt;xts包&lt;/td&gt;&#10;&lt;/tr&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;第一个是stat包。RCore们在stat包中定义了R语言中最古典的时间序列对象类型，即ts类型。想必用R处理过时间序列的同学们都不陌生，这货的用法很简单，下面是从帮助文档中摘的例子：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;require(graphics)&#10;## Generate a timeseries as a sample&#10;ts(1:10, frequency = 4, start = c(1959, 2)) # 2nd Quarter of 1959&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## Qtr1 Qtr2 Qtr3 Qtr4&#10;## 1959 1 2 3&#10;## 1960 4 5 6 7&#10;## 1961 8 9 10&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;## Using July 1954 as start date:&#10;gnp &amp;lt;- ts(cumsum(1 + round(rnorm(100), 2)),&#10; start = c(1954, 7), frequency = 12)&#10;plot(gnp) # using 'plot.ts' for time-series plot&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;img src="https://gewutang.cn/2014/06/04/notes-on-zoo/index_files/figure-html/unnamed-chunk-1-1.png" width="672" /&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;acf(gnp)&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;img src="https://gewutang.cn/2014/06/04/notes-on-zoo/index_files/figure-html/unnamed-chunk-1-2.png" width="672" /&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;pacf(gnp)&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;img src="https://gewutang.cn/2014/06/04/notes-on-zoo/index_files/figure-html/unnamed-chunk-1-3.png" width="672" /&gt;&#10;&lt;p&gt;ts类型的对象的缺点显而易见：只适宜处理规则时间序列、没有独立的索引属性等等。基于种种缺点，能人纷们纷出手开发了另外几个R包，包括专门处理不规则时间序列的its包，能同时处理规则时间序列和不规则时间序列的tseries包，能从网络获取金融数据并具有独立时间属性的tseries包，还有本文标题中提到的zoo包。&lt;/p&gt;&#10;&lt;p&gt;zoo包出现在stat包、its包、tseries包和timeSeries包之后、在xts之前。那么，很多人会疑问，根据前面说的，its包、tseries包和timeSeries包已经很好的填补了stat包的诸多不足，为什么还要开发zoo包，这不是重复造轮子吗？还是它拥有独道的优点？这得回顾一下Zeileis开发zoo包的初衷。&lt;/p&gt;&#10;&lt;p&gt;话说，时间序列分析领域有一个很重要的方向是诊断时间序列的结构性变异。比如，研究某个时间序列是否在某个时点之后出现显著的结构性变化之类的。Zeileis原本想开发这么一个诊断时间序列结构性变异的R包，也就是后来的strucchange。但在开发strucchange包时需要用到一种能不依赖索引类型并严格排序的时序对象，注意“不依赖索引类型”、“严格排序”这些特性是以上所有时间序列对象类型没有满足的，于是，他只好自己着手构建满足自己需求的zoo对象和zoo包。这个包的名字就源自于Z&amp;rsquo;s ordered observations的首字母。&lt;/p&gt;&#10;&lt;p&gt;本篇笔记系统地说说zoo包的一些用法和特性。本文的结构如下：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;1.zoo简介&#10;&lt;ul&gt;&#10;&lt;li&gt;1.1 zoo对象简介及创建&lt;/li&gt;&#10;&lt;li&gt;1.2 创建zooreg对象&lt;/li&gt;&#10;&lt;li&gt;1.3 基本运算&lt;/li&gt;&#10;&lt;li&gt;1.4 滚动计算&lt;/li&gt;&#10;&lt;li&gt;1.5 数据及索引的提取和替换&lt;/li&gt;&#10;&lt;li&gt;1.6 汇总描述&lt;/li&gt;&#10;&lt;li&gt;1.7 数据合并&lt;/li&gt;&#10;&lt;li&gt;1.8 缺失值处理&lt;/li&gt;&#10;&lt;li&gt;1.9 类型转化&lt;/li&gt;&#10;&lt;li&gt;1.10 zoo对象的绘图&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;2.实际案例&#10;&lt;ul&gt;&#10;&lt;li&gt;2.1 协同tseries包处理金融数据&lt;/li&gt;&#10;&lt;li&gt;2.2 使用timeDate类索引&lt;/li&gt;&#10;&lt;li&gt;2.3 创建yearmon和yearqtr类型&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;3.总结&lt;/li&gt;&#10;&lt;li&gt;4.资料推荐&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="1zoo简介"&gt;&lt;a href="#1zoo%e7%ae%80%e4%bb%8b" class="header-anchor"&gt;&lt;/a&gt;1.zoo简介&#10;&lt;/h3&gt;&lt;h4 id="11-zoo对象简介及创建"&gt;&lt;a href="#11-zoo%e5%af%b9%e8%b1%a1%e7%ae%80%e4%bb%8b%e5%8f%8a%e5%88%9b%e5%bb%ba" class="header-anchor"&gt;&lt;/a&gt;1.1 zoo对象简介及创建&#10;&lt;/h4&gt;&lt;p&gt;zoo包里面有两种基本的对象类型，一种是zoo，一种是zooreg。我们先创建一个zoo对象看看，创建zoo对象的基本命令是；&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;zoo(x,order.by)&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;其中，x是一个包含观测值的向量或者矩阵，order.by是x对应的排序后的索引。索引的长度必须跟x的长度或者行数一致。上述命令得到的zoo对象跟x看起来一样，不同的地方在于多了一个index属性，这个属性保存了zoo对象的索引信息。&lt;/p&gt;&#10;&lt;p&gt;理论上，x和order.by可以是任意类型，但x是数值型的情况比较常见，因为数值型情况下便于进行数学运算、建模及可视化。实际创建一些zoo对象：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;library(zoo)&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## &#10;## 载入程序包：'zoo'&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## The following objects are masked from 'package:base':&#10;## &#10;## as.Date, as.Date.numeric&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;set.seed(1071)&#10;&#10;z1.index&amp;lt;-ISOdatetime(2014,rep(1:2,5),sample(28,10),0,0,0);&#10;z1.data&amp;lt;-rnorm(10)&#10;z1&amp;lt;-zoo(z1.data,z1.index)&#10;&#10;&#10;z2.index&amp;lt;-as.POSIXct(paste(2014,rep(1:2,5),sample(1:28,10),sep=&amp;quot;-&amp;quot;))&#10;z2.data&amp;lt;-sin(2*1:10/pi)&#10;z2&amp;lt;-zoo(z2.data,z2.index)&#10;&#10;Z.index&amp;lt;-as.Date(sample(12450:12500,10)); &#10;Z.data&amp;lt;-matrix(rnorm(30),ncol=3);&#10;colnames(Z.data)&amp;lt;-c(&amp;quot;Aa&amp;quot;,&amp;quot;Bb&amp;quot;,&amp;quot;Cc&amp;quot;);&#10;Z&amp;lt;-zoo(Z.data,Z.index);&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;上面的这个as.Date是zoo包中的，等同于base包中的as.Date(origin=&amp;ldquo;1970-01-01&amp;rdquo;)。&lt;/p&gt;&#10;&lt;p&gt;真正操作数据时，通常要处理的数据已经包含了索引，用不着单独创建。&lt;/p&gt;&#10;&lt;p&gt;R中的很多函数比如print，summary，str，head，tail以及[ 能够对zoo对象进行操作。&lt;/p&gt;&#10;&lt;p&gt;要注意的是：向量型的zoo对象默认显示为行向量，而矩阵型的zoo对象默认为上下排列。&lt;/p&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;summary(z1)&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## Index z1 &#10;## Min. :2014-01-05 00:00:00 Min. :-2.07608 &#10;## 1st Qu.:2014-01-14 18:00:00 1st Qu.:-1.04698 &#10;## Median :2014-01-25 00:00:00 Median : 0.24573 &#10;## Mean :2014-01-29 21:36:00 Mean :-0.01033 &#10;## 3rd Qu.:2014-02-17 12:00:00 3rd Qu.: 0.73163 &#10;## Max. :2014-02-26 00:00:00 Max. : 1.94079&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;summary(Z)&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## Index Aa Bb Cc &#10;## Min. :2004-02-10 Min. :-2.7384 Min. :-1.518622 Min. :-0.83789 &#10;## 1st Qu.:2004-02-19 1st Qu.:-0.1366 1st Qu.:-0.554268 1st Qu.:-0.61149 &#10;## Median :2004-03-04 Median : 0.3307 Median : 0.274825 Median :-0.07863 &#10;## Mean :2004-03-01 Mean : 0.2004 Mean : 0.006083 Mean : 0.12034 &#10;## 3rd Qu.:2004-03-09 3rd Qu.: 1.2433 3rd Qu.: 0.583592 3rd Qu.: 0.72902 &#10;## Max. :2004-03-22 Max. : 1.4238 Max. : 1.347743 Max. : 2.00417&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;h4 id="12-创建zooreg对象"&gt;&lt;a href="#12-%e5%88%9b%e5%bb%bazooreg%e5%af%b9%e8%b1%a1" class="header-anchor"&gt;&lt;/a&gt;1.2 创建zooreg对象&#10;&lt;/h4&gt;&lt;p&gt;zoo对象本身就可以存储规则时间序列，而且stat包中本身也有存储规则时间序列的ts对象。为什么还要创建一个zooreg类型呢？有两个原因：一个是在将zoo对象转为ts对象时需要存储规则时间序列的频率，有了zooreg，可以在zoo对象和ts对象之间自由转换。再一个是因为对于ts对象，一旦出现缺失值，则其不再为规则时间序列，而zooreg可以存储有缺失值的规则时间序列。因此，我们可以把zooreg对象视为zoo的子对象，它继承了zoo对象的所有特性，并增加了frequency特性。&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;zoo(x,order.by,frequency)&#10;zooreg(data,start,end,frequency,deltat,ts.eps,order.by)&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;在zoo中使用frequency参数时，函数会自动检查frequency跟order.by是否匹配，如果匹配，就返回一个zooreg对象。zooreg()函数的参数跟ts()函数的参数完全一致。zooreg(order.by)相当于是zoo(x,order.by,frequency)。&lt;/p&gt;&#10;&lt;p&gt;要注意的是：zooreg对象的索引类型有相对严格的要求，其必须能转化为numeric，因为函数要靠转化后的numeric对象来判断索引的规则与否。而且索引必须是1/frequency的整数倍。&lt;/p&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;zr1 &amp;lt;- zooreg(sin(1:9),start=2000,frequency=4)&#10;zr2 &amp;lt;- zoo(sin(1:9),seq(2000,2002,by=1/4),4)&#10;zr1&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## 2000 Q1 2000 Q2 2000 Q3 2000 Q4 2001 Q1 2001 Q2 2001 Q3 &#10;## 0.8414710 0.9092974 0.1411200 -0.7568025 -0.9589243 -0.2794155 0.6569866 &#10;## 2001 Q4 2002 Q1 &#10;## 0.9893582 0.4121185&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;zr2&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## 2000 Q1 2000 Q2 2000 Q3 2000 Q4 2001 Q1 2001 Q2 2001 Q3 &#10;## 0.8414710 0.9092974 0.1411200 -0.7568025 -0.9589243 -0.2794155 0.6569866 &#10;## 2001 Q4 2002 Q1 &#10;## 0.9893582 0.4121185&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;zooreg对象也能处理非数值型的索引，当然你得保证后续增加的观测值对应的索引类型也是非numerec，否则，索引类型将被强制转换。&lt;/p&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;zooreg(1:5,start=as.Date(&amp;quot;2005-01-01&amp;quot;))&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## 2005-01-01 2005-01-02 2005-01-03 2005-01-04 2005-01-05 &#10;## 1 2 3 4 5&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;可以用frequency，deltat，cycle，is.regular(x,stric=FALSE)函数来查看zooreg对象的信息。&lt;/p&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;frequency(zr1)&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## [1] 4&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;deltat(zr1)&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## [1] 0.25&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;cycle(zr1)&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## 2000 Q1 2000 Q2 2000 Q3 2000 Q4 2001 Q1 2001 Q2 2001 Q3 2001 Q4 2002 Q1 &#10;## 1 2 3 4 1 2 3 4 1&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;is.regular(zr1)&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## [1] TRUE&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;is.regular(zr1,strict=TRUE)&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## [1] TRUE&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;这些函数对规则的zoo对象也适用。&lt;/p&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;zr1&amp;lt;- as.zoo(zr1)&#10;zr1&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## 2000 Q1 2000 Q2 2000 Q3 2000 Q4 2001 Q1 2001 Q2 2001 Q3 &#10;## 0.8414710 0.9092974 0.1411200 -0.7568025 -0.9589243 -0.2794155 0.6569866 &#10;## 2001 Q4 2002 Q1 &#10;## 0.9893582 0.4121185&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;class(zr1)&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## [1] &amp;quot;zoo&amp;quot;&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;frequency(zr1)&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## [1] 4&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;这种时间序列虽然看起来规则，但使用的时候难保不会出现差错儿。所以，能保存为zooreg就不要保存为zoo，时刻谨记座右铭：不作死就不会死。&lt;/p&gt;&#10;&lt;p&gt;上面说过，zooreg对象的优点是即使删除一个缺失值，仍然保持规则时间序列的性质。比如：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;zr1 &amp;lt;- zr1[-c(3,5)]&#10;zr1&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## 2000 Q1 2000 Q2 2000 Q4 2001 Q2 2001 Q3 2001 Q4 2002 Q1 &#10;## 0.8414710 0.9092974 -0.7568025 -0.2794155 0.6569866 0.9893582 0.4121185&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;class(zr1)&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## [1] &amp;quot;zoo&amp;quot;&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;frequency(zr1)&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## [1] 4&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;与ts对象相比，zooreg在处理缺失值或者时间序列回归方面更胜一筹。像这种有缺失的规则时间序列叫弱规则时间序列，我们将这种时间序列强制转化为ts对象时，缺失值将表示为NA。而对于规则的时间序列，如果索引刚好是数值型，那么，我们可以在zoo和ts两者之间进行自由转换。&lt;/p&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;as.ts(zr1)&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## Qtr1 Qtr2 Qtr3 Qtr4&#10;## 2000 0.8414710 0.9092974 NA -0.7568025&#10;## 2001 NA -0.2794155 0.6569866 0.9893582&#10;## 2002 0.4121185&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;identical(zr2,as.zoo(as.ts(zr2)))&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## [1] TRUE&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;因而，我们可以直接对zooreg对象使用acf，arima，stl等函数。&lt;/p&gt;&#10;&lt;h4 id="13-基本运算"&gt;&lt;a href="#13-%e5%9f%ba%e6%9c%ac%e8%bf%90%e7%ae%97" class="header-anchor"&gt;&lt;/a&gt;1.3 基本运算&#10;&lt;/h4&gt;&lt;p&gt;对于维度一样的对象，直接计算即可。对于维度不一样的对象，会先计算对象索引的交集，在根据交集进行相关运算。&lt;/p&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;z1+z2&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## 2014-01-14 2014-02-01 2014-02-26 &#10;## 0.2282647 -1.1200202 -0.7067490&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;z1&amp;lt;z2&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## 2014-01-14 2014-02-01 2014-02-26 &#10;## FALSE TRUE FALSE&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;cumsum、cumprod、cummin、cummax等都是对列进行操作。&lt;/p&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;cumsum(Z)&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## Aa Bb Cc&#10;## 2004-02-10 1.255434 0.68157316 -0.63292049&#10;## 2004-02-11 2.679232 -0.13457166 -1.18011092&#10;## 2004-02-18 2.802320 -1.65319323 -1.95318901&#10;## 2004-02-22 3.340710 -1.42183190 0.05098188&#10;## 2004-03-04 4.547665 -1.10368968 0.03968985&#10;## 2004-03-05 1.809245 -0.87218273 -0.79819889&#10;## 2004-03-08 1.663859 -0.41983370 -0.94417290&#10;## 2004-03-10 2.987271 -1.91425639 -0.89375702&#10;## 2004-03-21 2.113978 -1.28691668 0.24816234&#10;## 2004-03-22 2.003582 0.06082586 1.20338703&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;也可以计算zoo对象的滞后和差分。&lt;/p&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;lag(z2,k=-1)&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## 2014-01-13 2014-01-14 2014-01-19 2014-01-20 2014-02-01 2014-02-08 &#10;## 0.94306673 -0.52575918 -0.04149429 0.59448077 -0.96739776 0.95605566 &#10;## 2014-02-10 2014-02-22 2014-02-26 &#10;## 0.56060280 0.08291711 -0.62733473&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;merge(z1,lag(z1,k=1))&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## z1 lag(z1, k = 1)&#10;## 2014-01-05 0.02107873 0.7467599&#10;## 2014-01-07 0.74675994 0.2697590&#10;## 2014-01-14 0.26975895 0.6862577&#10;## 2014-01-17 0.68625772 1.9407885&#10;## 2014-01-18 1.94078850 -2.0760758&#10;## 2014-02-01 -2.07607585 -1.7843924&#10;## 2014-02-13 -1.78439244 -1.4029994&#10;## 2014-02-19 -1.40299938 1.2738445&#10;## 2014-02-24 1.27384445 0.2217044&#10;## 2014-02-26 0.22170438 NA&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;diff(z1)&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## 2014-01-07 2014-01-14 2014-01-17 2014-01-18 2014-02-01 2014-02-13 2014-02-19 &#10;## 0.7256812 -0.4770010 0.4164988 1.2545308 -4.0168643 0.2916834 0.3813931 &#10;## 2014-02-24 2014-02-26 &#10;## 2.6768438 -1.0521401&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;h4 id="14-滚动计算"&gt;&lt;a href="#14-%e6%bb%9a%e5%8a%a8%e8%ae%a1%e7%ae%97" class="header-anchor"&gt;&lt;/a&gt;1.4 滚动计算&#10;&lt;/h4&gt;&lt;p&gt;处理时间序列是经常用到滚动计算，比如，要滚动计算任意n天的均值、方差等等。zoo包里面提供了rollapply函数来完成这个操作。基本用法是；&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;rollapply(data, width, FUN)&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;这里的data是操作对象，width是滚动的窗口宽度，FUN是对每一个窗口的数据执行的具体函数。比如：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;rollapply(Z,5,sd)&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## Aa Bb Cc&#10;## 2004-02-18 0.5542603 0.9148719 1.1526241&#10;## 2004-02-22 1.6753029 0.8212506 1.1843236&#10;## 2004-03-04 1.5062902 0.8220241 1.1539834&#10;## 2004-03-05 1.6591613 0.8112685 1.0628096&#10;## 2004-03-08 1.6725661 0.8635166 0.7110273&#10;## 2004-03-10 1.4791770 1.0524092 0.8172367&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;有些观测值被删除了，因为那些观测值没法占满窗口。我们可以通过设置fill=TRUE用NA来填充这些位置。&lt;/p&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;rollapply(Z,5,sd,align=&amp;quot;left&amp;quot;,fill=TRUE)&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## Aa Bb Cc&#10;## 2004-02-10 0.5542603 0.9148719 1.1526241&#10;## 2004-02-11 1.6753029 0.8212506 1.1843236&#10;## 2004-02-18 1.5062902 0.8220241 1.1539834&#10;## 2004-02-22 1.6591613 0.8112685 1.0628096&#10;## 2004-03-04 1.6725661 0.8635166 0.7110273&#10;## 2004-03-05 1.4791770 1.0524092 0.8172367&#10;## 2004-03-08 1.0000000 1.0000000 1.0000000&#10;## 2004-03-10 1.0000000 1.0000000 1.0000000&#10;## 2004-03-21 1.0000000 1.0000000 1.0000000&#10;## 2004-03-22 1.0000000 1.0000000 1.0000000&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;填补方式分为左填补、右填补和居中填补。&lt;/p&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;rollapply(Z,5,sd,align=&amp;quot;left&amp;quot;,fill = TRUE)&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## Aa Bb Cc&#10;## 2004-02-10 0.5542603 0.9148719 1.1526241&#10;## 2004-02-11 1.6753029 0.8212506 1.1843236&#10;## 2004-02-18 1.5062902 0.8220241 1.1539834&#10;## 2004-02-22 1.6591613 0.8112685 1.0628096&#10;## 2004-03-04 1.6725661 0.8635166 0.7110273&#10;## 2004-03-05 1.4791770 1.0524092 0.8172367&#10;## 2004-03-08 1.0000000 1.0000000 1.0000000&#10;## 2004-03-10 1.0000000 1.0000000 1.0000000&#10;## 2004-03-21 1.0000000 1.0000000 1.0000000&#10;## 2004-03-22 1.0000000 1.0000000 1.0000000&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;对于一些常用的滚动计算，比如，rollapply(data,width,mean)，rollapply(data,width,max)等，zoo提供了rollmean(x,k)、rollmax(x,k)，rollmedian(x,k)等函数。&lt;/p&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;rollmean(z2,5,fill=TRUE)&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## 2014-01-06 2014-01-13 2014-01-14 2014-01-19 2014-01-20 2014-02-01 &#10;## 1.0000000000 1.0000000000 0.0005792538 0.0031770388 0.2204494347 0.2453317148 &#10;## 2014-02-08 2014-02-10 2014-02-22 2014-02-26 &#10;## 0.0009686142 0.0087574946 1.0000000000 1.0000000000&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;h4 id="15-数据及索引的提取和替换"&gt;&lt;a href="#15-%e6%95%b0%e6%8d%ae%e5%8f%8a%e7%b4%a2%e5%bc%95%e7%9a%84%e6%8f%90%e5%8f%96%e5%92%8c%e6%9b%bf%e6%8d%a2" class="header-anchor"&gt;&lt;/a&gt;1.5 数据及索引的提取和替换&#10;&lt;/h4&gt;&lt;p&gt;coredata函数可以提取zoo对象的数据。类似于its包中的core函数及tseries包中的value函数。&lt;/p&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;library(xts)&#10;&#10;coredata(z1)&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## [1] 0.02107873 0.74675994 0.26975895 0.68625772 1.94078850 -2.07607585&#10;## [7] -1.78439244 -1.40299938 1.27384445 0.22170438&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;index函数可以提取zoo对象的索引。&lt;/p&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;index(z2)&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## [1] &amp;quot;2014-01-06 CST&amp;quot; &amp;quot;2014-01-13 CST&amp;quot; &amp;quot;2014-01-14 CST&amp;quot; &amp;quot;2014-01-19 CST&amp;quot;&#10;## [5] &amp;quot;2014-01-20 CST&amp;quot; &amp;quot;2014-02-01 CST&amp;quot; &amp;quot;2014-02-08 CST&amp;quot; &amp;quot;2014-02-10 CST&amp;quot;&#10;## [9] &amp;quot;2014-02-22 CST&amp;quot; &amp;quot;2014-02-26 CST&amp;quot;&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;index(z2) &amp;lt;- index(z1)&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;time函数与index函数类似。&lt;/p&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;time(z1)&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## [1] &amp;quot;2014-01-05 CST&amp;quot; &amp;quot;2014-01-07 CST&amp;quot; &amp;quot;2014-01-14 CST&amp;quot; &amp;quot;2014-01-17 CST&amp;quot;&#10;## [5] &amp;quot;2014-01-18 CST&amp;quot; &amp;quot;2014-02-01 CST&amp;quot; &amp;quot;2014-02-13 CST&amp;quot; &amp;quot;2014-02-19 CST&amp;quot;&#10;## [9] &amp;quot;2014-02-24 CST&amp;quot; &amp;quot;2014-02-26 CST&amp;quot;&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;start和end函数可以提取第一个和最后一个索引。&lt;/p&gt;&#10;&lt;p&gt;抽取zoo对象的子集可以通过[或者window来进行。&lt;/p&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;Z[1:3,2:3]&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## Bb Cc&#10;## 2004-02-10 0.6815732 -0.6329205&#10;## 2004-02-11 -0.8161448 -0.5471904&#10;## 2004-02-18 -1.5186216 -0.7730781&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;也可以用[加索引来选取Z的子集。&lt;/p&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;z1[ISOdatetime(2004,1,c(14,25),0,0,0)]&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## Data:&#10;## numeric(0)&#10;## &#10;## Index:&#10;## POSIXct of length 0&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;如果索引的类型是numeric的话，在代码用需要用I来保护，此时相应的代码为Z[I(i)]。或者用window。&lt;/p&gt;&#10;&lt;p&gt;window函数的用法如下：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;window(x,index,start,end)&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;x是zoo对象，index是索引的子集，end和start用来进一步约束索引的子集。&lt;/p&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;window(Z,start=as.Date(&amp;quot;2004-03-01&amp;quot;)) # 选出2004-3-1以来的所有观测值&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## Aa Bb Cc&#10;## 2004-03-04 1.2069552 0.3181422 -0.01129202&#10;## 2004-03-05 -2.7384202 0.2315069 -0.83788874&#10;## 2004-03-08 -0.1453861 0.4523490 -0.14597401&#10;## 2004-03-10 1.3234122 -1.4944227 0.05041588&#10;## 2004-03-21 -0.8732929 0.6273397 1.14191937&#10;## 2004-03-22 -0.1103956 1.3477425 0.95522468&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;window(Z,index=index(Z)[5:8],end=as.Date(&amp;quot;2004-03-01&amp;quot;)) # 选出第5至第8个观测值中，不晚于2004-3-1的观测值&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## Aa Bb Cc&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;也可以用来替换观测值。&lt;/p&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;window(z1,end=as.POSIXct(&amp;quot;2004-02-01&amp;quot;))&amp;lt;-9:5&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;h4 id="16-汇总描述"&gt;&lt;a href="#16-%e6%b1%87%e6%80%bb%e6%8f%8f%e8%bf%b0" class="header-anchor"&gt;&lt;/a&gt;1.6 汇总描述&#10;&lt;/h4&gt;&lt;p&gt;aggregate可以对zoo对象进行汇总。说人话就是zoo会根据某一列的取值将zoo对象切割为几个独立的子集。再对每个子集执行指定的函数。&lt;/p&gt;&#10;&lt;p&gt;对于Z来说，我们可以按月份对其其均值。这个过程需要两步，第一步是将Z的索引划分为月份，第二步是分组汇总。&lt;/p&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;firstofmonth &amp;lt;- function(x){as.Date(sub(&amp;quot;..$&amp;quot;,&amp;quot;01&amp;quot;,format(x)))} &#10;index(Z)&amp;lt;-firstofmonth(index(Z)) # 将日期统一为当月首日日期&#10;aggregate(Z,index(Z),mean)&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## Aa Bb Cc&#10;## 2004-02-01 0.8351775 -0.3554580 0.01274547&#10;## 2004-03-01 -0.2228546 0.2471096 0.19206753&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;aggregate(Z,firstofmonth,head,1)&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## Aa Bb Cc&#10;## 2004-02-01 1.255434 0.6815732 -0.63292049&#10;## 2004-03-01 1.206955 0.3181422 -0.01129202&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;与汇总相反的是数据还原，通常是借助插值来实现的。比如，Nile是ts类型的年度数据，我们可以将其转换为zoo类型的季度数据，并用na.approx，na.locf和na.spline来进行差值。&lt;/p&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;Nile.na&amp;lt;-merge(as.zoo(Nile),zoo(,seq(start(Nile)[1],end(Nile)[1],1/4)))&#10;head(as.zoo(Nile))&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## 1871 1872 1873 1874 1875 1876 &#10;## 1120 1160 963 1210 1160 1160&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;head(na.approx(Nile.na))&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## 1871(1) 1871(2) 1871(3) 1871(4) 1872(1) 1872(2) &#10;## 1120.00 1130.00 1140.00 1150.00 1160.00 1110.75&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;head(na.locf(Nile.na))&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## 1871(1) 1871(2) 1871(3) 1871(4) 1872(1) 1872(2) &#10;## 1120 1120 1120 1120 1160 1160&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;head(na.spline(Nile.na))&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## 1871(1) 1871(2) 1871(3) 1871(4) 1872(1) 1872(2) &#10;## 1120.000 1199.059 1224.985 1208.419 1160.000 1091.970&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;h4 id="17-数据合并"&gt;&lt;a href="#17-%e6%95%b0%e6%8d%ae%e5%90%88%e5%b9%b6" class="header-anchor"&gt;&lt;/a&gt;1.7 数据合并&#10;&lt;/h4&gt;&lt;p&gt;可用rbind函数来对zoo对象进行行合并，此时，合并前的对象必须有相同的列数，并且索引不能有重合。&lt;/p&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;rbind(z1[2:3],z1[5:10]) # 正常行合并&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## 2014-01-07 2014-01-14 2014-01-18 2014-02-01 2014-02-13 2014-02-19 2014-02-24 &#10;## 0.7467599 0.2697590 1.9407885 -2.0760758 -1.7843924 -1.4029994 1.2738445 &#10;## 2014-02-26 &#10;## 0.2217044&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;# rbind(z1[2:5],z1[5:10]) # 索引重合会报错&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;c函数跟rbind函数的作用相同。&lt;/p&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;c(z1[2:3],z1[5:10])&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## 2014-01-07 2014-01-14 2014-01-18 2014-02-01 2014-02-13 2014-02-19 2014-02-24 &#10;## 0.7467599 0.2697590 1.9407885 -2.0760758 -1.7843924 -1.4029994 1.2738445 &#10;## 2014-02-26 &#10;## 0.2217044&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;cbind函数可以对zoo对象进行列合并。&lt;/p&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;cbind(z1,z2)&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## z1 z2&#10;## 2014-01-05 0.02107873 0.94306673&#10;## 2014-01-07 0.74675994 -0.52575918&#10;## 2014-01-14 0.26975895 -0.04149429&#10;## 2014-01-17 0.68625772 0.59448077&#10;## 2014-01-18 1.94078850 -0.96739776&#10;## 2014-02-01 -2.07607585 0.95605566&#10;## 2014-02-13 -1.78439244 0.56060280&#10;## 2014-02-19 -1.40299938 0.08291711&#10;## 2014-02-24 1.27384445 -0.62733473&#10;## 2014-02-26 0.22170438 -0.92845336&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;这个函数实质上是以两个对象的索引的并集作为结果对象的索引，这样一来会出现缺失值，当然它们的位置会填充为NA。下面的命令与上面的命令结果相同；&lt;/p&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;merge(z1,z2,all=TRUE)&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## z1 z2&#10;## 2014-01-05 0.02107873 0.94306673&#10;## 2014-01-07 0.74675994 -0.52575918&#10;## 2014-01-14 0.26975895 -0.04149429&#10;## 2014-01-17 0.68625772 0.59448077&#10;## 2014-01-18 1.94078850 -0.96739776&#10;## 2014-02-01 -2.07607585 0.95605566&#10;## 2014-02-13 -1.78439244 0.56060280&#10;## 2014-02-19 -1.40299938 0.08291711&#10;## 2014-02-24 1.27384445 -0.62733473&#10;## 2014-02-26 0.22170438 -0.92845336&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;但merge可以提供更多的可用参数。比如，可以指定缺失值的填充方式，可以调整合并对象的列名，也可以指定返回结果的类型。&lt;/p&gt;&#10;&lt;p&gt;如果merge的对象中有zooreg对象，则merge的结果将是zooreg对象。在这个过程中，merge会在幕后默默的判断时间序列的频率，并检查时间序列规则与否。如果merge的对象中有非zoo对象，那么，merge会毫不犹豫地把zoo对象的索引加到其它对象身上。&lt;/p&gt;&#10;&lt;p&gt;如果merge的对象中，索引的类型不一样，R一般会给出警告，并尝试将索引强制转换为一致。我们不鼓励用merge合并索引类型不同的对象，否则，后果自负。&lt;/p&gt;&#10;&lt;h4 id="18-缺失值处理"&gt;&lt;a href="#18-%e7%bc%ba%e5%a4%b1%e5%80%bc%e5%a4%84%e7%90%86" class="header-anchor"&gt;&lt;/a&gt;1.8 缺失值处理&#10;&lt;/h4&gt;&lt;p&gt;na.omit，na.contiguous，na.approx，na.locf，na.omit和na.spline都能来处理缺失值。na.omit的作用是剔除缺失值。&lt;/p&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;z1[sample(1:10,3)] &amp;lt;- NA&#10;z1&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## 2014-01-05 2014-01-07 2014-01-14 2014-01-17 2014-01-18 2014-02-01 2014-02-13 &#10;## NA 0.7467599 0.2697590 0.6862577 1.9407885 -2.0760758 NA &#10;## 2014-02-19 2014-02-24 2014-02-26 &#10;## -1.4029994 NA 0.2217044&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;na.omit(z1)&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## 2014-01-07 2014-01-14 2014-01-17 2014-01-18 2014-02-01 2014-02-19 2014-02-26 &#10;## 0.7467599 0.2697590 0.6862577 1.9407885 -2.0760758 -1.4029994 0.2217044&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;na.contiguous函数是返回对象中没有不包含缺失值的最长片段。&lt;/p&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;na.contiguous(z1)&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## 2014-01-07 2014-01-14 2014-01-17 2014-01-18 2014-02-01 &#10;## 0.7467599 0.2697590 0.6862577 1.9407885 -2.0760758&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;na.approx函数是用approx函数对缺失值进行线性差值&lt;/p&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;na.approx(z1)&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## 2014-01-07 2014-01-14 2014-01-17 2014-01-18 2014-02-01 2014-02-13 2014-02-19 &#10;## 0.7467599 0.2697590 0.6862577 1.9407885 -2.0760758 -1.6273582 -1.4029994 &#10;## 2014-02-24 2014-02-26 &#10;## -0.2424967 0.2217044&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;默认情况下na.approx函数基于时间序列的时间跨度进行插值。它跟下面的情况有所不同。&lt;/p&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;na.approx(z1,1:NROW(z1))&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## 2014-01-07 2014-01-14 2014-01-17 2014-01-18 2014-02-01 2014-02-13 2014-02-19 &#10;## 0.7467599 0.2697590 0.6862577 1.9407885 -2.0760758 -1.7395376 -1.4029994 &#10;## 2014-02-24 2014-02-26 &#10;## -0.5906475 0.2217044&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;设置na.approx的第二个参数，可以按照需要对缺失值进行插值。&lt;/p&gt;&#10;&lt;p&gt;na.lcof是用前值替代法进行插值。&lt;/p&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;na.locf(z1)&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## 2014-01-07 2014-01-14 2014-01-17 2014-01-18 2014-02-01 2014-02-13 2014-02-19 &#10;## 0.7467599 0.2697590 0.6862577 1.9407885 -2.0760758 -2.0760758 -1.4029994 &#10;## 2014-02-24 2014-02-26 &#10;## -1.4029994 0.2217044&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;h4 id="19-类型转化"&gt;&lt;a href="#19-%e7%b1%bb%e5%9e%8b%e8%bd%ac%e5%8c%96" class="header-anchor"&gt;&lt;/a&gt;1.9 类型转化&#10;&lt;/h4&gt;&lt;p&gt;R中的很多对象都可以跟zoo进行自由转换。尤其是ts，irts，its等对象，很容易就可以转化为zoo对象。如果索引正确，还可以将zoo对象转化回去。zoo对象和zooreg对象之间的转化更方便，无非是增加或者删除frequency属性。除此之外，zoo对象还可以转化为向量、矩阵、列表和数据框，要注意的是转为数据框时索引属性会丢掉，但实质内容还是保留完整的。&lt;/p&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;as.data.frame(Z)&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## Aa Bb Cc&#10;## 1 1.2554339 0.6815732 -0.63292049&#10;## 2 1.4237978 -0.8161448 -0.54719043&#10;## 3 0.1230887 -1.5186216 -0.77307809&#10;## 4 0.5383894 0.2313613 2.00417089&#10;## 5 1.2069552 0.3181422 -0.01129202&#10;## 6 -2.7384202 0.2315069 -0.83788874&#10;## 7 -0.1453861 0.4523490 -0.14597401&#10;## 8 1.3234122 -1.4944227 0.05041588&#10;## 9 -0.8732929 0.6273397 1.14191937&#10;## 10 -0.1103956 1.3477425 0.95522468&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;h4 id="110-zoo对象的绘图"&gt;&lt;a href="#110-zoo%e5%af%b9%e8%b1%a1%e7%9a%84%e7%bb%98%e5%9b%be" class="header-anchor"&gt;&lt;/a&gt;1.10 zoo对象的绘图&#10;&lt;/h4&gt;&lt;p&gt;zoo对象的绘图要依赖于plot和lines函数。&lt;/p&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;plot(Z)&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## Warning in zoo(rval, index(x)[i]): some methods for &amp;quot;zoo&amp;quot; objects do not work&#10;## if the index entries in 'order.by' are not unique&#10;## Warning in zoo(rval, index(x)[i]): some methods for &amp;quot;zoo&amp;quot; objects do not work&#10;## if the index entries in 'order.by' are not unique&#10;## Warning in zoo(rval, index(x)[i]): some methods for &amp;quot;zoo&amp;quot; objects do not work&#10;## if the index entries in 'order.by' are not unique&#10;## Warning in zoo(rval, index(x)[i]): some methods for &amp;quot;zoo&amp;quot; objects do not work&#10;## if the index entries in 'order.by' are not unique&#10;## Warning in zoo(rval, index(x)[i]): some methods for &amp;quot;zoo&amp;quot; objects do not work&#10;## if the index entries in 'order.by' are not unique&#10;## Warning in zoo(rval, index(x)[i]): some methods for &amp;quot;zoo&amp;quot; objects do not work&#10;## if the index entries in 'order.by' are not unique&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;img src="https://gewutang.cn/2014/06/04/notes-on-zoo/index_files/figure-html/unnamed-chunk-36-1.png" width="672" /&gt;&#10;&lt;p&gt;图中，横轴是索引，纵轴是时间序列对应的取值。也可以将多条时间序列画到同一个面板上。&lt;/p&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;plot(Z,plot.type=&amp;quot;single&amp;quot;,col=2:4)&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;img src="https://gewutang.cn/2014/06/04/notes-on-zoo/index_files/figure-html/unnamed-chunk-37-1.png" width="672" /&gt;&#10;&lt;p&gt;我们可以指定col，pch等参数。这儿有一个不同之处，即zoo允许我们通过list指定这些参数，并且提供了自动补全功能。比如：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;plot(Z,type=&amp;quot;b&amp;quot;,lty=1:3,pch=list(Aa=1,Bb=2,Cc=4),col=list(Bb=2,4),plot.type=&amp;quot;single&amp;quot;)&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;img src="https://gewutang.cn/2014/06/04/notes-on-zoo/index_files/figure-html/unnamed-chunk-38-1.png" width="672" /&gt;&#10;&lt;h3 id="zoo与其它包的协同"&gt;&lt;a href="#zoo%e4%b8%8e%e5%85%b6%e5%ae%83%e5%8c%85%e7%9a%84%e5%8d%8f%e5%90%8c" class="header-anchor"&gt;&lt;/a&gt;zoo与其它包的协同&#10;&lt;/h3&gt;&lt;h4 id="strucchange实证波动过程"&gt;&lt;a href="#strucchange%e5%ae%9e%e8%af%81%e6%b3%a2%e5%8a%a8%e8%bf%87%e7%a8%8b" class="header-anchor"&gt;&lt;/a&gt;strucchange:实证波动过程&#10;&lt;/h4&gt;&lt;p&gt;strucchange包是用来检验、计量数据或者模型尤其是线性回归模型中的结构变异点的一个包。在检验过程中通常要看模型参数是否随着某个排序变量（通常是时间）的变化而有所改变。在这个过程中，需要用到严格排序的带索引的时间序列。正是这一需求促使作者开发了zoo包。&lt;/p&gt;&#10;&lt;p&gt;下面以strucchange包为例演示一下zoo包的用法。这里用到的数据fruitohms在DAAG包中。该数据包含的是奇异果的果汁含量数据和奇异果本身电阻大小的测量值。要研究的问题则是，奇异果的电阻大小是否随着奇异果果汁含量的多寡有显著改变。我们可以用基于最小二乘的累加检验来验证这个问题，但在检验过程中要对按照果汁含量的多寡对数据进行严格排序，而这是其它类型的时序对象无法实现的。相应的代码如下：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;library(strucchange)&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## 载入需要的程序包：sandwich&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;library(DAAG)&#10;data(&amp;quot;fruitohms&amp;quot;)&#10;ocus &amp;lt;- gefp(ohms ~ 1,order.by=~juice,data=fruitohms)&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;使用plot函数绘制ocus的图形，得到图3。&lt;/p&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;plot(ocus)&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;img src="https://gewutang.cn/2014/06/04/notes-on-zoo/index_files/figure-html/unnamed-chunk-40-1.png" width="672" /&gt;&#10;&lt;p&gt;从图上可以看出，检验结果超出了5%的临界值，这意味着随着果汁含量多寡的不同，奇异果的平均电阻值发生了显著的变化。&lt;/p&gt;&#10;&lt;p&gt;上述代码中得到的ocus对象本身是基于zoo对象进行构建的，并且绘图过程实际上是调用了针对gefp对象的专属绘图方法。&lt;/p&gt;&#10;&lt;h3 id="2-实际案例"&gt;&lt;a href="#2-%e5%ae%9e%e9%99%85%e6%a1%88%e4%be%8b" class="header-anchor"&gt;&lt;/a&gt;2. 实际案例&#10;&lt;/h3&gt;&lt;h4 id="21-协同tseries包处理金融数据"&gt;&lt;a href="#21-%e5%8d%8f%e5%90%8ctseries%e5%8c%85%e5%a4%84%e7%90%86%e9%87%91%e8%9e%8d%e6%95%b0%e6%8d%ae" class="header-anchor"&gt;&lt;/a&gt;2.1 协同tseries包处理金融数据&#10;&lt;/h4&gt;&lt;p&gt;tseries包中的get.hist.quote函数可以通过访问Yahoo!的在线金融数据库来获取路透社提供的金融数据。比如，用下面的代码可以获得微软公司在2011-01-01到2014-04-30日期间的日交易数据：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;library(&amp;quot;tseries&amp;quot;)&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## Registered S3 method overwritten by 'quantmod':&#10;## method from&#10;## as.zoo.data.frame zoo&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;MSFT &amp;lt;- get.hist.quote(instrument=&amp;quot;MSFT&amp;quot;,start=&amp;quot;2011-01-01&amp;quot;,end=&amp;quot;2014-04-30&amp;quot;,origin=&amp;quot;1970-01-01&amp;quot;)&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## time series starts 2011-01-03&#10;## time series ends 2014-04-29&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;在返回的MSFT中，带缺失值的时间序列被填充为规则时间序列，并用NA对缺失位置进行填充。这里的索引类型是Date，其存储形式为数值型，该数值等于距离某个origin的天数。上例中origin=&amp;ldquo;1970-01-01&amp;rdquo;。&lt;/p&gt;&#10;&lt;p&gt;也可以令结果返回为ts格式。&lt;/p&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;MSFT &amp;lt;- get.hist.quote(instrument=&amp;quot;MSFT&amp;quot;,start=&amp;quot;2011-01-01&amp;quot;,end=&amp;quot;2014-04-30&amp;quot;,origin=&amp;quot;1970-01-01&amp;quot;,retclass=&amp;quot;ts&amp;quot;)&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## time series starts 2011-01-03&#10;## time series ends 2014-04-29&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;我们可以将ts对象转化为索引类型为Date的zoo对象。&lt;/p&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;MSFT &amp;lt;- as.zoo(MSFT)&#10;index(MSFT) &amp;lt;- as.Date(index(MSFT))&#10;MSFT &amp;lt;- na.omit(MSFT)&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;这里的交易数据是日交易数据，因此隐含的是规则时间序列。所以，第一次as.zoo的对象返回的是zooreg对象，要想将其转换为彻底的zoo对象，需要再次执行as.zoo()。&lt;/p&gt;&#10;&lt;p&gt;图4显示了zoo对象的绘图结果。&lt;/p&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;plot(diff(log(MSFT)))&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;img src="https://gewutang.cn/2014/06/04/notes-on-zoo/index_files/figure-html/unnamed-chunk-44-1.png" width="672" /&gt;&#10;&lt;p&gt;图4：微软公司集合收益率序列图&lt;/p&gt;&#10;&lt;h4 id="22-使用timedate类索引"&gt;&lt;a href="#22-%e4%bd%bf%e7%94%a8timedate%e7%b1%bb%e7%b4%a2%e5%bc%95" class="header-anchor"&gt;&lt;/a&gt;2.2 使用timeDate类索引&#10;&lt;/h4&gt;&lt;p&gt;zoo对象可以引用timeDate的日期对象作为索引。虽然zoo包的方法可以针对多种索引类型进行操作。但一些特殊的索引类型仍然有必要提供c()、length()、[、ORDER()和MATCH()等方法来确保zoo类方法的正常执行。像timeDate就是其中之一。事实上，timeDate对象天然支持c()、length()和[；而zoo则天然支持ORDER()和MATCH()。两者相加可谓珠联璧合。要说的是，ORDER()和MATCH()在执行过程中会现将对象强制转换为POSIXct，再调用相应的方法进行操作。&lt;/p&gt;&#10;&lt;p&gt;下面的代码演示了如何将Z2的索引转换为timeDate类型。&lt;/p&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;library(timeDate)&#10;z2td &amp;lt;- zoo(coredata(z2),timeDate(index(z2),FinCenter = &amp;quot;GMT&amp;quot;))&#10;z2td&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## 2014-01-04 16:00:00 2014-01-06 16:00:00 2014-01-13 16:00:00 2014-01-16 16:00:00 &#10;## 0.94306673 -0.52575918 -0.04149429 0.59448077 &#10;## 2014-01-17 16:00:00 2014-01-31 16:00:00 2014-02-12 16:00:00 2014-02-18 16:00:00 &#10;## -0.96739776 0.95605566 0.56060280 0.08291711 &#10;## 2014-02-23 16:00:00 2014-02-25 16:00:00 &#10;## -0.62733473 -0.92845336&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;h4 id="23-创建yearmon和yearqtr类型"&gt;&lt;a href="#23-%e5%88%9b%e5%bb%bayearmon%e5%92%8cyearqtr%e7%b1%bb%e5%9e%8b" class="header-anchor"&gt;&lt;/a&gt;2.3 创建yearmon和yearqtr类型&#10;&lt;/h4&gt;&lt;p&gt;zoo包最强大的功能之一是能够对间序列对象的索引类型进行自定义。前面介绍了如何将一种已经存在的时间对象，比如，timeDate对象作为zoo对象的索引。下面介绍一下如何根据需要创建新的索引类型，比如可以创建yearmon和yearqtr等，很明显，这两个货分别针对月度和季度时间序列对象的专有索引。事实上，我们可以利用ts对象将月度时序数据的索引存储为数值型。但这么做的问题在于，该操作得到的结果并未包括时序数据本身为月度型数据的任何信息。而以yearmon类日期作为索引，由于yearmon类日期多了一个yearmon的属性，因而，可以明白的看出来这一点。创建yearmon对象的代码如下：&lt;/p&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;yearmon &amp;lt;- function(x) structure(floor(12*x + .0001)/12,class=&amp;quot;yearmon&amp;quot;)&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;与as.yearmon类似。&lt;/p&gt;&#10;&lt;p&gt;我们可以将yearmon对象转换为其它尺度的日期对象，比如，yearqtr代表的季度数据或者Date、POSIXlt和POSIXct等更小尺度的数据。这几个数据通常与yearmon数据的首日具有对应关系。format和as.character函数则可以将日期类函数迅速转化为文本格式。Ops和MATCH函数则可以则进一步完善了zoo包对月度日期对象的操作。&lt;/p&gt;&#10;&lt;p&gt;这些函数看起来并不起眼，但作用大大的。我们先创建一个叫zr3的规则时序对象，让其以yearmon对象作为索引，并与前面的zr1和zr2进行比较，显示结果更为简洁。&lt;/p&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;zr3 &amp;lt;- zooreg(rnorm(9),start=as.yearmon(2000),frequency=12)&#10;zr3&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## 1 2000 2 2000 3 2000 4 2000 5 2000 6 2000 7 2000 &#10;## -1.4221193 -0.8232956 0.1711008 1.0191386 0.3027276 -0.4975404 -2.0038764 &#10;## 8 2000 9 2000 &#10;## -1.1892796 -0.3388062&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;下面的代码可以将其汇总为季度数据。&lt;/p&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;aggregate(zr3,as.yearqtr,mean)&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## 2000 Q1 2000 Q2 2000 Q3 &#10;## -0.6914380 0.2747753 -1.1773207&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;也可以将索引转化为Date类型的日期变量。默认情况下，会将月份转换为月份对应的第一天。&lt;/p&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;as.Date(index(zr3))&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## [1] &amp;quot;2000-01-01&amp;quot; &amp;quot;2000-02-01&amp;quot; &amp;quot;2000-03-01&amp;quot; &amp;quot;2000-04-01&amp;quot; &amp;quot;2000-05-01&amp;quot;&#10;## [6] &amp;quot;2000-06-01&amp;quot; &amp;quot;2000-07-01&amp;quot; &amp;quot;2000-08-01&amp;quot; &amp;quot;2000-09-01&amp;quot;&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;也可以修改参数转换为月度的最后一天。&lt;/p&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;as.Date(index(zr3),frac=1)&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## [1] &amp;quot;2000-01-31&amp;quot; &amp;quot;2000-02-29&amp;quot; &amp;quot;2000-03-31&amp;quot; &amp;quot;2000-04-30&amp;quot; &amp;quot;2000-05-31&amp;quot;&#10;## [6] &amp;quot;2000-06-30&amp;quot; &amp;quot;2000-07-31&amp;quot; &amp;quot;2000-08-31&amp;quot; &amp;quot;2000-09-30&amp;quot;&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;除此之外，可以将yearmon强制转化为POSIXct，以方便我们将时序对象导出为its或者irts。&lt;/p&gt;&#10;&lt;pre&gt;&lt;code class="language-r"&gt;index(zr3)&amp;lt;-as.POSIXct(index(zr3))&#10;as.irts(zr3)&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;pre&gt;&lt;code&gt;## 2000-01-01 00:00:00 GMT -1.422&#10;## 2000-02-01 00:00:00 GMT -0.8233&#10;## 2000-03-01 00:00:00 GMT 0.1711&#10;## 2000-04-01 00:00:00 GMT 1.019&#10;## 2000-05-01 00:00:00 GMT 0.3027&#10;## 2000-06-01 00:00:00 GMT -0.4975&#10;## 2000-07-01 00:00:00 GMT -2.004&#10;## 2000-08-01 00:00:00 GMT -1.189&#10;## 2000-09-01 00:00:00 GMT -0.3388&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;可以看出，在zoo中对时序对象的索引尺度和类型进行转换方便至极。&lt;/p&gt;&#10;&lt;h3 id="3-总结"&gt;&lt;a href="#3-%e6%80%bb%e7%bb%93" class="header-anchor"&gt;&lt;/a&gt;3. 总结&#10;&lt;/h3&gt;&lt;p&gt;zoo包是一个基于R中的S3类构建的一个R包，用来处理严格排序且带索引的时间序列，包括规则时间序列和不规则时间序列。zoo包的设计宗旨是构造一个独立于索引类型的时序对象，并比照古典的ts对象开发相应的泛型方法。&lt;/p&gt;&#10;&lt;p&gt;上面的笔记我们简单的概括了zoo包的技术细节，并举例演示了zoo对象的绘图、合并、数学运算、数据提取、索引提取、缺失值处理等内容。事实上，我们可以简单地把zoo对象视为一个数据加索引的对象，其中，数据可以是向量或者矩阵，而索引则可以是任意类型的向量。对于特殊的zooreg对象，则还包括了frequency属性。zoo对象与其它时序对象比如ts、its、irts和timeSeries等可以自由转换，其填补了规则时间序列和不规则时间序列之间的隔膜。与经典的ts对象比较，可以更方便地处理缺失值。以上所说种种优点，使得我们可以进一步基于zoo对象构建新的时序类型或者应用。比如，quantmod中使用的xts类型就是基于zoo对象所构建的。但zoo包也有自身的缺点，即目前zoo对象的数据部分只能很好地支持数值型的向量或者矩阵，部分地支持带索引的因子型变量，对数据框、列表则支持的不够，但这些对象显然也能被索引化，这些应该是未来值得改进的地方。&lt;/p&gt;&#10;&lt;h3 id="4-推荐文献"&gt;&lt;a href="#4-%e6%8e%a8%e8%8d%90%e6%96%87%e7%8c%ae" class="header-anchor"&gt;&lt;/a&gt;4. 推荐文献&#10;&lt;/h3&gt;&lt;p&gt;zoo：An S3 Class and Methods for Indexed Totally Ordered Observations&lt;/p&gt;&#10;</description></item><item><title>R与金融时间序列分析常见问题集</title><link>https://gewutang.cn/2012/02/03/r-and-questions-in-financial-timeseries-analysing/</link><pubDate>Fri, 03 Feb 2012 00:00:00 +0000</pubDate><guid>https://gewutang.cn/2012/02/03/r-and-questions-in-financial-timeseries-analysing/</guid><description>&lt;p&gt;大概四、五个月前，心血来潮打算总结一下COS论坛上关于金融时间序列分析上的常见问题，期许能够形一个集子以方便有需求者查询使用。因先前从未写过书籍，一时难以把握集子的结构便犹豫了很久。后来，无意中发现了《A Discussion of Time Series Objects for R in Finance》这本册子，读罢便决定以该册子的结构为蓝本来总结金融时间序列分析的常见问题集。问题集结构如下:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;基础篇&#10;&lt;ul&gt;&#10;&lt;li&gt;时间序列对象创建&lt;/li&gt;&#10;&lt;li&gt;时间戳操作&lt;/li&gt;&#10;&lt;li&gt;取子集操作&lt;/li&gt;&#10;&lt;li&gt;缺失值处理&lt;/li&gt;&#10;&lt;li&gt;操作效率度量等&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;技术篇&#10;&lt;ul&gt;&#10;&lt;li&gt;R与ARIMA模型&lt;/li&gt;&#10;&lt;li&gt;GARCH族模型&lt;/li&gt;&#10;&lt;li&gt;VaR（Value at Risk）模型&lt;/li&gt;&#10;&lt;li&gt;极值理论模型等&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;目前，基础篇大致完成，技术篇尚未完善，而已完成部分中定有不少错漏之处，希望发现错误的童鞋们能够及时批评指正。此外，本问题集由王晓伟、熊熹、刘剑锋、杨羽提供初稿，由我最终润色完成。感兴趣的人可以在点击&lt;a class="link" href="https://github.com/dengyishuo/dengyishuo.github.com/blob/master/RFinance/FAQ.pdf" target="_blank" rel="noopener"&#10; &gt;FAQ&lt;/a&gt;下载。&lt;/p&gt;&#10;</description></item><item><title>R语言书籍的学习路线图</title><link>https://gewutang.cn/2012/01/19/how-to-learn-r-by-reading-books/</link><pubDate>Thu, 19 Jan 2012 00:00:00 +0000</pubDate><guid>https://gewutang.cn/2012/01/19/how-to-learn-r-by-reading-books/</guid><description>&lt;p&gt;现在对R感兴趣的人越来越多，很多人都想快速地掌握R。然而，由于目前大部分高校都没有开设R课程，这就导致很多人不知道如何着手学习R。&lt;/p&gt;&#10;&lt;p&gt;对于初学R，最常见的方式是看看百度上的简介。遇到不会的地方，就跑到论坛上吼一嗓子，然后欣欣然（得到解答）或者悲伤（未得到解答）地离去。一直到遇到下一个问题再回来。当然，这不是最好的学习方式。最好的方式是看书。&lt;/p&gt;&#10;&lt;p&gt;目前，市面上介绍R语言的书籍已经很多，中英文都有。那么，众多书籍中，一个菜鸟应该从哪一本入门呢？入门之后如何才能把自己练就成某个方面的高手呢？相信这是很多人心中的疑问。有这种疑问的人有福了，因为笔者将根据自己的经历总结一下R书籍的学习路线图以使大家少走些弯路。&lt;/p&gt;&#10;&lt;p&gt;本文分为6个部分，分别介绍初级入门、高级入门、绘图与可视化、计量经济学、时间序列分析和金融等。&lt;/p&gt;&#10;&lt;h4 id="1初级入门"&gt;&lt;a href="#1%e5%88%9d%e7%ba%a7%e5%85%a5%e9%97%a8" class="header-anchor"&gt;&lt;/a&gt;1.初级入门&#10;&lt;/h4&gt;&lt;p&gt;&lt;a class="link" href="http://cran.r-project.org/doc/manuals/R-intro.pdf" target="_blank" rel="noopener"&#10; &gt;《An Introduction to R》&lt;/a&gt;，这是R官网公布的入门小册子，其有中文版，由丁国徽翻译的，译名是&lt;a class="link" href="http://cran.r-project.org/doc/contrib/Ding-R-intro_cn.pdf" target="_blank" rel="noopener"&#10; &gt;《R导论》&lt;/a&gt;。&lt;a class="link" href="http://cran.r-project.org/doc/contrib/Paradis-rdebuts_en.pdf" target="_blank" rel="noopener"&#10; &gt;《R4Beginners》&lt;/a&gt;，这本小册子有中文版应该叫&lt;a class="link" href="http://www.biosino.org/R/R-doc/files/R4beg_cn_2.0.pdf" target="_blank" rel="noopener"&#10; &gt;《R入门》&lt;/a&gt;。除此之外，还可以去读&lt;a class="link" href="http://www.bjt.name/" target="_blank" rel="noopener"&#10; &gt;刘思喆&lt;/a&gt;的&lt;a class="link" href="http://cos.name/cn/topic/7673" target="_blank" rel="noopener"&#10; &gt;《153分钟学会R》&lt;/a&gt;，对R有一个感性的认识，这个册子收集了R初学者提问频率最高的153个问题。为什么叫153分钟呢？因为最初作者写了153个问题，阅读一个问题花费1分钟时间，全局下来也就是153分钟了。有了这些基础之后，要去读一些经典书籍比较全面的入门书籍，比如《统计建模与R软件》，国外还有《R Cookbook》和《R in action》（中文翻译为《R实战》）等。&lt;/p&gt;&#10;&lt;p&gt;最后隆重推荐《R in a Nutshell》，直译是“果壳里面的R”。当然，这是开玩笑的，”in a Nutshell“是英文俚语，意思是“简单的说”。很多技术类书籍都有Nutshell版本，这类书籍一般翻译为”**核心技术手册“，目前，我们已经译好这本书的中文版，预计今年会面世。这本书很不错，深度和广度都超越同类书籍，大家可以从现在开始期待，并广而告知一下！&lt;/p&gt;&#10;&lt;h4 id="2高级入门"&gt;&lt;a href="#2%e9%ab%98%e7%ba%a7%e5%85%a5%e9%97%a8" class="header-anchor"&gt;&lt;/a&gt;2.高级入门&#10;&lt;/h4&gt;&lt;p&gt;读了上述书籍之后，你就可以去高级入门阶段了。这时候要读的书有两本很经典的。《Statistics with R》和《The R book》以及《Modern Statistics with S》。之所以说这三本书高级，是因为这三本书已经不再限于R了，而是结合了数据分析的各种常见方法来写就的，比较系统的介绍了R在线性回归、方差分析、多元统计、R绘图、时间序列分析、数据挖掘等各方面的内容。看完之后你会发现，哇，原来R能做的事情这么多，而且做起来是那么简洁。&lt;/p&gt;&#10;&lt;p&gt;读到这里已经差不多了，剩下的估计就是你要专门攻读的某个方面内容了。下面大致说一说。&lt;/p&gt;&#10;&lt;h4 id="3绘图与可视化"&gt;&lt;a href="#3%e7%bb%98%e5%9b%be%e4%b8%8e%e5%8f%af%e8%a7%86%e5%8c%96" class="header-anchor"&gt;&lt;/a&gt;3.绘图与可视化&#10;&lt;/h4&gt;&lt;p&gt;亚里斯多德说，“较其他感觉而言，人类更喜欢观看”。因此，绘图和可视化得到很多人的关注和重视。那么，如何学习R画图和数据可视化呢？再简单些，如何画直方图？如何往直方图上添加密度曲线呢？我想读完下面这几本书你就大致会明白了。&lt;/p&gt;&#10;&lt;p&gt;首先，画图入门可以读《R Graphics》，个人认为这本是比较经典的，全面介绍了R中绘图系统。该书对应的有一个网站，google之就可以了。更深入的可以读《Lattice：Multivariate Data Visualization with R》，Lattice是R中针对多元数据可视化而开发的一套绘图系统。上面这些都是比较普通的。对应的有比较文艺和优雅的ggplot2系统，看《ggplot2：Elegant Graphics for Data Analysis》，中文版是《ggplot2:数据分析与图形艺术》。这本书理论性较强，实战比较弱。与之互补的要推荐《The R Graphics cookbook》，中文对应的是《R图形可视化手册》，译者是邓一硕、魏太云和肖楠，这本书详细列举了所有常见数据分析图形的绘制方法，适合做工具书。再有就是交互式图形的书了，著名的交互系统是ggobi，这个我已经喜欢多年，关于ggobi的书有《Interactive and Dynamic Graphics for Data Analysis With R and GGobi》，不过，也只是适宜入门，更多更全面的还是去ggobi的主页吧，上面有各种资料以及包的更新信息。&lt;/p&gt;&#10;&lt;p&gt;此外，R还推出了shiny和rChart以及rechart等包，可以将图形绘制到网页上，这个可以说是未来的主流，不得不关注。&lt;/p&gt;&#10;&lt;p&gt;特别推荐一下，中文版绘图书籍中谢益辉的《现代统计图形》和我们翻译的《R图形可视化手册》。&lt;/p&gt;&#10;&lt;h4 id="4计量经济学"&gt;&lt;a href="#4%e8%ae%a1%e9%87%8f%e7%bb%8f%e6%b5%8e%e5%ad%a6" class="header-anchor"&gt;&lt;/a&gt;4.计量经济学&#10;&lt;/h4&gt;&lt;p&gt;关于计量经济学，首先推荐一本很薄的小册子:《Econometrics In R》，做入门用。然后，是《Applied Econometrics with R》，该书对应的R包是AER包，可以安装之后配合使用，效果甚佳。计量经济学中很大一部分是关于时间序列分析的，这一块内容在下面的地方说。&lt;/p&gt;&#10;&lt;h4 id="5时间序列分析"&gt;&lt;a href="#5%e6%97%b6%e9%97%b4%e5%ba%8f%e5%88%97%e5%88%86%e6%9e%90" class="header-anchor"&gt;&lt;/a&gt;5.时间序列分析&#10;&lt;/h4&gt;&lt;p&gt;时间序列书籍的书籍分两类，一种是比较普适的书籍，典型的代表是：《Time Series Analysis and Its Applications ：with R examples》。该书介绍了各种时间序列分析的经典方法及实现各种经典方法的R代码，该书有中文版。如果不想买的话，建议去作者主页直接下载，英文版读起来很简单。时间序列分析中有一大块儿是关于金融时间序列分析的。这方面比较流行的书有两本《Analysis of financial time series》，这本书的最初是用的S-plus代码，不过新版已经以R代码为主了。这本书适合有时间序列分析基础和金融基础的人来看，因为书中关于时间序列分析的理论以及各种金融知识讲解的不是特别清楚，将极值理论计算VaR的部分就比较难看懂。另外一个比较有意思的是Rmetrics推出的《TimeSeries FAQ》，这本书是金融时间序列入门的东西，讲的很基础，但是很难懂。对应的中文版有《金融时间序列分析常见问题集》。经济领域的时间序列有一种特殊的情况叫协整，很多人很关注这方面的理论，关心这个的可以看《Analysis of Integrated and Cointegrated Time Series with R》。最后，比较高级的一本书是关于小波分析的，看《Wavelet Methods in Statistics with R》。附加一点，关于时间序列聚类的书籍目前比较少见，是一个处女地，有志之士可以开垦。&lt;/p&gt;&#10;&lt;h4 id="6金融"&gt;&lt;a href="#6%e9%87%91%e8%9e%8d" class="header-anchor"&gt;&lt;/a&gt;6.金融&#10;&lt;/h4&gt;&lt;p&gt;金融的领域很广泛，如果是大金融的话，保险也要被纳入此间。用R做金融更多地需要掌握的是金融知识，只会数据分析技术意义寥寥。我觉得这些书对于懂金融、不同数据分析技术的人比较有用，只懂数据分析技术而不动金融知识的人看起来肯定如雾里看花，甚至有人会觉得金融分析比较低级。这方面比较经典的书籍有：《Advanced Topics in Analysis of Economic and Financial Data Using R》以及《Modelling Financial Time Series With S-plus》。金融产品定价之类的常常要用到随机微分方程，有一本叫《Simulation Inference Stochastic Differential Equations：with R examples》的书是关于这方面的内容的，有实例，内容详实。此外，风险度量与管理类比较经典的有《Simulation Techniques in Financial Risk Management》、《Modern Actuarial Risk Theory Using R》和《Quantitative Risk Management：Concepts, Techniques and Tools》。投资组合分析类和期权定价类可以分别看《Portfolio Optimization with R》和《Option Pricing and Estimation of Financial Models with R》。&lt;/p&gt;&#10;&lt;h4 id="7数据挖掘"&gt;&lt;a href="#7%e6%95%b0%e6%8d%ae%e6%8c%96%e6%8e%98" class="header-anchor"&gt;&lt;/a&gt;7.数据挖掘&#10;&lt;/h4&gt;&lt;p&gt;这方面的书有《Data Mining with R:learing with case studies》，《Machine learning for hacks》以及不过《Data Mining with Rattle and R》，书中主要讲了基于Rattle包进行数据挖掘的操作方法，这本书是罕有的全流程数据挖掘工具书，书中详细讲解了从导入数据、清洗数据、数据重整、数据可视化、模型构建、变量选择、模型评价等各个数据挖掘环节，是学习数据挖掘的不二之选。当然，个人比较喜欢Rattle，这本书对应的中文版是《Rattle:R中的数据挖掘GUI》，是由邓一硕、郝智恒、谭丽等翻译的。除了Rattle，Rweka做数据挖掘也很棒。R中数据挖掘方面的包已经足够多了，参考包中的帮助文档就足够了。&lt;/p&gt;&#10;</description></item><item><title>在时间序列的线图上添加垂线</title><link>https://gewutang.cn/2011/05/08/add-vertical-lines-to-timeseries-plot/</link><pubDate>Sun, 08 May 2011 00:00:00 +0000</pubDate><guid>https://gewutang.cn/2011/05/08/add-vertical-lines-to-timeseries-plot/</guid><description>&lt;pre&gt;&lt;code class="language-r"&gt;library(xts)&#10;v &amp;lt;- vector()&#10;v[1] &amp;lt;- 10&#10;for(i in 2:100){&#10; v[i] &amp;lt;- v[i-1]+rnorm(1, 0, 0.01)&#10;}&#10;X &amp;lt;- xts(v, seq(as.Date(&amp;quot;2009-01-01&amp;quot;), by=&amp;quot;day&amp;quot;, length.out=100))&#10;plot.xts(X)&#10;# abline(v=X[50,]) #不行&#10;# abline(v=50) #不行&#10;# abline(v=index(X)[50]) #不行&#10;abline(v =.index(X)[50],col=&amp;quot;red&amp;quot;) #不行&#10;abline(v = (.index(X)[30]), col = &amp;quot;blue&amp;quot;)&#10;&lt;/code&gt;&lt;/pre&gt;&#10;</description></item></channel></rss>