这里只提及到了R语言的最皮毛的应用,其实ts是重点提及的,因为他是专门为了时间序列设计的内置class,但ts还是太浅显了,故一定要看以下链接。
zoo的使用
xts的使用
以上链接涉及到了zoo与xts,也是时间序列分析时的重要工具,有着极其强悍的作用。此外以上链接并未主要针对时间序列分析,还涉及到了数据清洗,数据处理等细节性处理,读者若想真正掌握,以上链接可仔细研读。
R 语言基础
R语言是一门常用于数据分析、统计建模的计算机语言,它与主流的C/C++、Java、Python等语言相比,支持更多的数据类型,例如向量、矩阵,同时提供了多种统计和数学计算方法。
可以前往 https://www.r-project.org/ 下载R语言解释器,并且推荐使用 RStudio 这个R语言的集成开发环境。RStudio 可以在 https://www.rstudio.com/ 下载。
四则运算
R语言的四则运算与大部分语言相同,使用 +
, -
, *
, /
, ^
来表示加、减、乘、除和乘方。数值可以写成 123
, -123
, 123.45
, 1.23E-5
这样的形式。其中1.23E-5
表示 1.23 × 1 0 − 5 1.23 \times 10^{-5} 1.23×10−5 。
字符串
用单引号 '
或双引号"
包裹起来的文字内容为字符串,如 'hello, world'
或 '123456'
。
向量
R 语言中可以通过 c(...)
来声明一个向量,例如 x = ( 1 , 2 , 3 , 4 , 5 ) \boldsymbol{x} = (1, 2, 3, 4, 5) x=(1,2,3,4,5) 可以通过 x <- c(1, 2, 3, 4, 5)
来声明。
对两个长度相等的向量进行四则运算的效果是向量中的每一个元素都与另一个向量中的每一个元素进行四则运算。而一个向量与一个数进行四则运算的效果是该向量中的所有元素都与这个数进行四则运算。如:
> x <- c(1, 2, 3, 4, 5)
> y <- c(1, 2, 3, 4, 5)
> x + y # 输出: [1] 2 4 6 8 10
> x + 1 # 输出: [1] 2 3 4 5 6
矩阵
R 语言中可以通过 matrix()
函数来创建矩阵。matrix()
的原型为 matrix(data=NA, nrow=1, ncol=1, byrow=FALSE, dinames=NULL)
其中:
data
: 矩阵的元素,通常为向量。nrow
和ncol
: 设定矩阵的行数和列数,一般只需设定其一,另一个会根据数据长度算出。byrow
: 设定矩阵的填充方式,值为TRUE
时按行填充。默认为FALSE
,即按列填充。
通过 matrix()
创建矩阵的例子如下:
> mat1 <- matrix(1:6, nrow=2) # 元素为1到6, 两行,按列填充
> mat1[,1] [,2] [,3]
[1,] 1 3 5
[2,] 2 4 6> mat2 <- matrix(1:6, nrow=2, byrow=TRUE)
> mat2[,1] [,2] [,3]
[1,] 1 2 3
[2,] 4 5 6
此外还可以使用 dim()
通过向量来创建矩阵,例如:
> mat3 <- 1:6
> dim(mat3) <- c(3, 2) # 将元素为1到6变为3行2列的矩阵
> mat3[,1] [,2]
[1,] 1 4
[2,] 2 5
[3,] 3 6
生成时间序列
通过 ts()
函数可以将一个向量或矩阵转成一个一元或多元的时间序列(ts)对象,ts()
函数的原型为:ts(data = NA, start = 1, end = numeric(0), frequency = 1, deltat = 1, ts.eps = getOption("ts.eps"), class, names)
。其中:
data
要生成时间序列的向量或矩阵。start
第一个观测值的时间。end
最后一个观测值的时间。frequency
单位时间内观测值的频数。deltat
两个观测值之间的时间间隔。ts.eps
序列之间的误差限。若序列之间的频率差异小于ts.eps
则认为这些序列的频率相等。class
对象的类型。一元序列默认为ts
,多元序列默认为c("mts", "ts")
。names
给出多元序列中每个一元序列的名称,默认为Series 1, Series 2, ...
。
下面是一个例子:
> ts(1:26, start = 1986)
Time Series:
Start = 1986
End = 2011
Frequency = 1 [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
[18] 18 19 20 21 22 23 24 25 26
画图
R 语言中可以直接使用 plot()
函数来绘制图像,例如:
> x <- rnorm(10)
> plot(x)
> x[1] -0.3329234 1.3631137 -0.4691473 0.8428756[5] -1.4579937 -0.4003059 -0.7764173 -0.3692965[9] 1.2401015 -0.1074338
还可以直接绘制时间序列的图像:
> plot(ts(x))
为了将多幅图画在一起,可以使用 par()
函数:
> op <- par(mfrow=c(2, 1), mar=c(5, 4, 2, 2) + .1) # mfrow 指定了图像矩阵为两行一列,即画两幅图,每行一幅;mar 指定了图像的边界,分别是下、左、上、右,可以根据喜好指定
> plot(ts(x))
> acf(z, main = "") # 计算 acf 函数
mfrow 指定了图像矩阵为两行一列,即画两幅图,每行一幅;mar 指定了图像的边界,分别是下、左、上、右,可以根据喜好指定
plot(ts(x))
acf(z, main = “”) # 计算 acf 函数
统计与时间序列分析基础
平均值
> y = array(1:20, dim=c(4, 5))
> y[,1] [,2] [,3] [,4] [,5]
[1,] 1 5 9 13 17
[2,] 2 6 10 14 18
[3,] 3 7 11 15 19
[4,] 4 8 12 16 20
> mean(y) # 对矩阵中的所有元素求平均值
[1] 10.5
> colMeans(y) # 计算每行的均值
[1] 2.5 6.5 10.5 14.5 18.5
> rowMeans(y) # 列均值
[1] 9 10 11 12
方差和标准差
> x = exp(seq(-1, 3, by=0.1)) # 从-1到3,步长为0.1
> x[1] 0.3678794 0.4065697 0.4493290 0.4965853[5] 0.5488116 0.6065307 0.6703200 0.7408182[9] 0.8187308 0.9048374 1.0000000 1.1051709
[13] 1.2214028 1.3498588 1.4918247 1.6487213
[17] 1.8221188 2.0137527 2.2255409 2.4596031
[21] 2.7182818 3.0041660 3.3201169 3.6692967
[25] 4.0552000 4.4816891 4.9530324 5.4739474
[29] 6.0496475 6.6858944 7.3890561 8.1661699
[33] 9.0250135 9.9741825 11.0231764 12.1824940
[37] 13.4637380 14.8797317 16.4446468 18.1741454
> var(x) # 计算方差
[1] 29.35325
> sd(x) # 计算标准差
[1] 5.417864
偏度和峰度
可以通过自己编写函数来计算偏度和峰度:
> skewness <- function(x) { sum(((x-mean(x)) ^ 3)) / length(x) } # 计算偏度
> skewnexx(x)
[1] 197.8397
> kurtosis <- function(x) {
+ a = mean(x)
+ n = length(x)
+ m4 = sum((x-a)^4)/n
+ m2 = sum((x-a)^2)/n
+ kurt = m4/m2^2-3
+ kurt
+ } # 计算峰度
> kurtosis(x)
[1] 0.6260693
也可以通过 moments 包中的 skewness 和 kurtosis 函数来计算偏度和峰度。
首先通过 > install.packages(moments)
来安装 moments 包,然后通过 > library(moments)
来使用这个包。之后就可以直接通过 skewness()
和 kurtosis()
来计算偏度和峰度。
重要的概率分布
正态分布
通过 rnorm()
函数可以产生服从正态分布的随机数,rnorm()
函数的原型为 rnorm(n, mean=0, sd=1)
,其中 n
为生成数据个数,mean
为生成数据的均值,sd
为生成数据的标准差。例如:
> norm = rnorm(1000, 0, 1)
> mean(norm)
[1] 0.001165962
> sd(norm)
[1] 1.000664
> hist(norm, prob=TRUE, 30) # 绘制频率分布直方图
> curve(dnorm, add=TRUE) # 为直方图添加正态分布曲线
χ 2 \chi^2 χ2 分布
可以通过 rchisq(n, df)
来产生 n 个 服从自由度为 df 的 χ 2 \chi^2 χ2 分布的随机数
> rchisq(n=1000, df=20)
> hist(chi, prob=TRUE, 30)
t t t 分布
> t = rt(n=1000, df=5)
> hist(t, prob=TRUE, 30)
F F F 分布
> f = rf(n=1000, df1=10, df2=50)
> hist(f, prob=TRUE, 30)