R语言学习
文章目录
- R语言学习
- 数据矩阵与R语言表示
- 1.创建一个向量(随机变量、一维数组)
- 2.创建一个矩阵(二维数组)
- 3.矩阵转置
- 4.矩阵相加减
- 5.矩阵相乘
- 6.矩阵对角元素相关运算
- 7.矩阵求逆
- 8.矩阵的特征值与特征向量
- 9.矩阵的Choleskey分解
- 10.矩阵奇异值分解
- 11.矩阵QR分解
- 12.矩阵kronecker积
- 13.矩阵的维数
- 14.矩阵的行和、列和、行平均与列平均
- 总结
数据矩阵与R语言表示
1.创建一个向量(随机变量、一维数组)
在R中可以用函数c()
来创建一个向量,例如
>x1=c(171,175,159,155,152,158,154,164,168,166,159,164)
> x2=c(57,64,41,38,35,44,41,51,57,49,47,46)
这里,x1,x2分别为行向量,也可以认为是1行12列的矩阵。
函数length()
可以返回向量的长度,mode()
可以返回向量的数据类型,例如:
> length(x1)
[1] 12
> mode(x1)
[1] "numeric"
2.创建一个矩阵(二维数组)
(1)合并命令。可以用rbind()
、cbind()
将两个以上的向量或矩阵合并起来,
rbind()表示按行合并,cbind()则表示按列合并。
> rbind(x1,x2)[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12]
x1 171 175 159 155 152 158 154 164 168 166 159 164
x2 57 64 41 38 35 44 41 51 57 49 47 46
> cbind(x1,x2)x1 x2[1,] 171 57[2,] 175 64[3,] 159 41[4,] 155 38[5,] 152 35[6,] 158 44[7,] 154 41[8,] 164 51[9,] 168 57
[10,] 166 49
[11,] 159 47
[12,] 164 46
(2)生成矩阵。在R中可以用函数matrix()来创建一个矩阵,引用该函数时需要输入必要的参数值。
> matrix(data=NA,nrow=1,ncol=1,byrow=FALSE,dimnames=NULL)[,1]
[1,] NA
data项为必要的矩阵元素,nrow为行数,ncol为列数,注意nrow与ncol的乘积应为矩阵元素个数,byrow项控制排列元素时是否按行进行,dimnames给定行和列的名称,例如:
matrix(x1,nrow=3,ncol=4)[,1] [,2] [,3] [,4]
[1,] 171 155 154 166
[2,] 175 152 164 159
[3,] 159 158 168 164
matrix(x1,nrow=4,ncol=3)[,1] [,2] [,3]
[1,] 171 152 168
[2,] 175 158 166
[3,] 159 154 159
[4,] 155 164 164
matrix(x1,nrow=4,ncol=3,byrow=T)[,1] [,2] [,3]
[1,] 171 175 159
[2,] 155 152 158
[3,] 154 164 168
[4,] 166 159 164
3.矩阵转置
A为mxn矩阵,A’为其转置矩阵,求A’在R中可用函数t()
,例如:
> A=matrix(1:12,nrow=3,ncol=4)
> A[,1] [,2] [,3] [,4]
[1,] 1 4 7 10
[2,] 2 5 8 11
[3,] 3 6 9 12
> t(A)[,1] [,2] [,3]
[1,] 1 2 3
[2,] 4 5 6
[3,] 7 8 9
[4,] 10 11 12
4.矩阵相加减
在R中对同行同列矩阵相加减,可用符号“+”、“-”,例如:
> A=B=matrix(1:12,nrow=3,ncol=4)
> A+B[,1] [,2] [,3] [,4]
[1,] 2 8 14 20
[2,] 4 10 16 22
[3,] 6 12 18 24
> A-B[,1] [,2] [,3] [,4]
[1,] 0 0 0 0
[2,] 0 0 0 0
[3,] 0 0 0 0
5.矩阵相乘
A为mxn矩阵,B为nxk矩阵,在R中求AB可用符号“%*%
",例如:
> A=matrix(1:12,nrow=3,ncol=4)
> B=matrix(1:12,nrow=4,ncol=3)
> A%*%B[,1] [,2] [,3]
[1,] 70 158 246
[2,] 80 184 288
[3,] 90 210 330
6.矩阵对角元素相关运算
若要取一个方阵的对角元素,对一个向量应用diag()函数将产生以这个向量为对角元素的对角矩阵,对一个正整数k应用
diag()
函数将产生k维单位矩阵,例如:
> A=matrix(1:16,nrow=4,ncol=4)
> diag(A)
[1] 1 6 11 16
> diag(diag(A))[,1] [,2] [,3] [,4]
[1,] 1 0 0 0
[2,] 0 6 0 0
[3,] 0 0 11 0
[4,] 0 0 0 16
> diag(4)[,1] [,2] [,3] [,4]
[1,] 1 0 0 0
[2,] 0 1 0 0
[3,] 0 0 1 0
[4,] 0 0 0 1
7.矩阵求逆
矩阵求逆可用
solve()
,应用solve(A,b)运算结果可解线性方程组Ax=b,若b缺省,则系统默认为单位矩阵,由此可用其进行矩阵求逆,例如:
> A=matrix(rnorm(16),4,4);
> A[,1] [,2] [,3] [,4]
[1,] -0.2930984 -1.7887997 -0.13792868 0.8021037
[2,] -1.3322062 0.3419297 1.18732716 -1.8372907
[3,] 1.0203442 -2.4283146 0.03727872 -2.4674615
[4,] -0.9507527 0.6046697 -0.79238198 -0.1241637
> solve(A)[,1] [,2] [,3] [,4]
[1,] -0.35916036 -0.30123211 0.1268138 -0.38288995
[2,] -0.39760300 -0.02206908 -0.1143649 0.03076075
[3,] 0.08927873 0.35986115 -0.2013035 -0.74780287
[4,] 0.24412384 -0.09740967 -0.2433257 -0.19990320
8.矩阵的特征值与特征向量
矩阵A的谱分解为A=UΛU’,其中Λ是由A的特征值组成的对角矩阵,U的列为A的特征值对应的特征向量,在R中可以用函数
eigen()
得到U和Λ。
eigen(x,symmetric,only.values=FALSE,EISPACK=FALSE)
其中,x为矩阵,symmetric项指定矩阵x是否为对称矩阵,若不指定,系统将自动检测x是否为对称矩阵,例如:
> A=diag(4)+1;A;[,1] [,2] [,3] [,4]
[1,] 2 1 1 1
[2,] 1 2 1 1
[3,] 1 1 2 1
[4,] 1 1 1 2
> A.e=eigen(A,symmetric=T)
> A.e
eigen() decomposition
$values
[1] 5 1 1 1$vectors[,1] [,2] [,3] [,4]
[1,] -0.5 0.8660254 0.0000000 0.0000000
[2,] -0.5 -0.2886751 -0.5773503 -0.5773503
[3,] -0.5 -0.2886751 -0.2113249 0.7886751
[4,] -0.5 -0.2886751 0.7886751 -0.2113249> A.e$vector%*%diag(A.e$values)%*%t(A.e$vectors)[,1] [,2] [,3] [,4]
[1,] 2 1 1 1
[2,] 1 2 1 1
[3,] 1 1 2 1
[4,] 1 1 1 2
上面最后的语句作用是重构原始矩阵,其中
A.e$vector
是原始矩阵的特征向量,diag(A.e$values)
是一个以特征值为对角线元素的对角矩阵,t(A.e$vectors)
是特征向量的转置矩阵。
9.矩阵的Choleskey分解
对于正定矩阵A,可对其进行Choleskey分解,即A=P’P,其中,P为上三角矩阵,在R中可以用函数
chol()
进行Choleskey分解,例如:
> A.c=chol(A)
> A.c[,1] [,2] [,3] [,4]
[1,] 1.414214 0.7071068 0.7071068 0.7071068
[2,] 0.000000 1.2247449 0.4082483 0.4082483
[3,] 0.000000 0.0000000 1.1547005 0.2886751
[4,] 0.000000 0.0000000 0.0000000 1.1180340
> t(A.c)%*%A.c[,1] [,2] [,3] [,4]
[1,] 2 1 1 1
[2,] 1 2 1 1
[3,] 1 1 2 1
[4,] 1 1 1 2
10.矩阵奇异值分解
A为mxn矩阵,rank(A)=r,可以分解为A=UDV’,其中,U’U=V’V=I。在R中可以用函数
svd()
进行奇异值分解,例如:
> A=matrix(1:18,3,6);A;[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 1 4 7 10 13 16
[2,] 2 5 8 11 14 17
[3,] 3 6 9 12 15 18
> A.s=svd(A)
> A.s
$d
[1] 4.589453e+01 1.640705e+00 1.366522e-15$u[,1] [,2] [,3]
[1,] -0.5290354 0.74394551 0.4082483
[2,] -0.5760715 0.03840487 -0.8164966
[3,] -0.6231077 -0.66713577 0.4082483$v[,1] [,2] [,3]
[1,] -0.07736219 -0.71960032 -0.4076688
[2,] -0.19033085 -0.50893247 0.5745647
[3,] -0.30329950 -0.29826463 -0.0280114
[4,] -0.41626816 -0.08759679 0.2226621
[5,] -0.52923682 0.12307105 -0.6212052
[6,] -0.64220548 0.33373889 0.2596585> A.s$u%*%diag(A.s$d)%*%t(A.s$v)[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 1 4 7 10 13 16
[2,] 2 5 8 11 14 17
[3,] 3 6 9 12 15 18
11.矩阵QR分解
A为mxn矩阵时可以进行QR分解,A=QR,其中,Q’Q=I,在R中可以用函数
qr()
进行QR分解,例如:
> A=matrix(1:16,4,4)
> qr(A)
$qr[,1] [,2] [,3] [,4]
[1,] -5.4772256 -12.7801930 -2.008316e+01 -2.738613e+01
[2,] 0.3651484 -3.2659863 -6.531973e+00 -9.797959e+00
[3,] 0.5477226 -0.3781696 1.601186e-15 2.217027e-15
[4,] 0.7302967 -0.9124744 -5.547002e-01 -1.478018e-15$rank
[1] 2$qraux
[1] 1.182574e+00 1.156135e+00 1.832050e+00 1.478018e-15$pivot
[1] 1 2 3 4attr(,"class")
[1] "qr"
12.矩阵kronecker积
nxm矩阵A与hxk矩阵B的kronecker积为一个nhxmk维矩阵,在R中,kronecker积可以用函数kronecker()来计算,例如:
> A=matrix(1:4,2,2)
> A[,1] [,2]
[1,] 1 3
[2,] 2 4
> B=matrix(rep(1,4),2,2);B;[,1] [,2]
[1,] 1 1
[2,] 1 1
> kronecker(A,B)[,1] [,2] [,3] [,4]
[1,] 1 1 3 3
[2,] 1 1 3 3
[3,] 2 2 4 4
[4,] 2 2 4 4
13.矩阵的维数
在R中很容易得到一个矩阵的维数,函数
dim()
将返回一个矩阵的维数,nrow()
返回行数,ncol()
返回列数,例如:
> A=matrix(1:12,3,4)
> dim(A)
[1] 3 4
> nrow(A)
[1] 3
> ncol(A)
[1] 4
14.矩阵的行和、列和、行平均与列平均
一个矩阵的和、平均数以及列的和、平均数,例如:
rowSums()
rowMeans()
colSums()
colMeans()
> rowSums(A)
[1] 22 26 30
> rowMeans(A)
[1] 5.5 6.5 7.5
> colSums(A)
[1] 6 15 24 33
> colMeans(A)
[1] 2 5 8 11
> A[,1] [,2] [,3] [,4]
[1,] 1 4 7 10
[2,] 2 5 8 11
[3,] 3 6 9 12
上述关于矩阵行和列的操作,还可以使用apply()
函数实现:
apply(X,MARGIN,FUN,…)
其中,X为矩阵,MARGIN用来指定是对行运算还是对列运算,MARGIN=1表示对行运算,MARGIN=2表示对列运算,
FUN用来指定运算函数,”…"用来给定FUN中需要的其他参数,例如:
> apply(A,1,sum)
[1] 22 26 30
> apply(A,1,mean)
[1] 5.5 6.5 7.5
> apply(A,2,sum)
[1] 6 15 24 33
> apply(A,2,mean)
[1] 2 5 8 11
apply()函数还可以对矩阵的行或列进行其他运算,例如计算每一列的方差:
> A=matrix(rnorm(10),2,5)
> apply(A,2,var)
[1] 0.06233338 1.72555863 0.45365134 0.83043694 0.37709323
> apply(A,2,function(x,a)x*a,a=2)[,1] [,2] [,3] [,4] [,5]
[1,] -2.437330 -1.090969 -1.5564223 1.9951652 0.3086047
[2,] -1.731167 2.624468 0.3486265 -0.5823327 -1.4282735
注:最后一式与A*2效果一致,旨在说明如何应用apply函数
总结
主要运用的是线性代数里面所涉及到的知识,不得不说,R语言所包含的函数着实比较丰富,所学知识取自王斌会老师的《多元统计分析及R语言建模》,上述内容均本人手敲,创作不易,收获不浅,继续加油!