用 MATA 可以完成除绘图以外的所有 STATA 数据处理和分析功能。这里介绍的仍然是传统的 STATA 矩阵命令。
1 生成矩阵
1 输入新矩阵
\ 表示换行,其它运算正常使用。
可以直接录入一个新的矩阵
matrix A= (1,0,1\2,1,0\-3,2,-5) //录入矩阵 Amatrix list A //显示录入的矩阵 Amatlist A //显示录入的矩阵 A,该命令只能在 stata9 以上版本使用matrx B=(1+1,2*3/4 \ 5/2, 3^2)matrix list Bmatrix C=(2,3,4)matrix E=(1\2\3)matrix F=(4)matrix rownames A= sex edu marriagematrix colnames A=obs1 obs2 obs3matrix list
2 生成特定格式矩阵
生成一个 5 行 3 列的矩阵 A,矩阵中的元素均为 0
matrix A=J(5,3,0)
生成一个 6 阶单位阵 I
matrix I=I(6)
生成一个 3 行 5 列的随机矩阵 R,每个随机元素均服从(0,1)均匀分布
matrix R=matuniform(3,5)matrix d=(1,4,9)matrix D=diag(d) //以d中元素为对角元素生成对角矩阵Dmatrix list D
3 数据与矩阵之间的相互转化
将矩阵 R 转换为数据文件
mkmat varlist [if exp] [in range] [matrix(matname) nomissing ]
svmat [type] A [names(col|eqcol|matcol|string) ]
matname A namelist [rows(range) columns(range) explicit ]
sysuse auto, clear*将 foreign weight displ 这三个变量的前 5 个观察数据转换为矩阵 Xmkmat foreign weight displ in 1/5, matrix(X)matrix list X *将带条件的数据转换为矩阵 Ymkmat foreign weight displ if fore==1, matrix(Y)matrix list Ymatrix A= (1,0,1\2,1,0\-3,2,-5) //录入矩阵 Asvmat A //将矩阵 A 中的数据转化为数据,变量为 A1,A2,A3listsvmat A, name(ccb) //将矩阵 A 中的数据转化为新的变量 ccb1,ccb2,ccb3
2 矩阵四则运算
1 矩阵扩展
matrix A= (1,0,1\2,1,0\-3,2,-5)matrix B=(4\3\7)matrix C=(A,B)matrix list Cmatrix D= (10,9,25)matrix E= (A\D)matrix list E
2 矩阵加、减、数乘、除法
mat e=(3,5\2,0)mat t=(1,3\2,1)mat r1=e+t //加mat list r1mat r2=e-t //减mat list r2mat e2=2*e //数乘(每个元素均乘标量)mat list e2mat e3=e/10 //除法(每个元素均除以一个标量)mat list e3
3 矩阵乘法、直乘及 Kronecker 乘积运算
mat w=e*t //乘,数学种的矩阵相乘mat list w*矩阵乘法不满足交换律,一般来说 a*b~=b*amat a=(2,3\1,-2\3,1)mat b=(1,-2,-3\2,-1,0)mat ab=a*bmat list abmat ba=b*amat list ba/*两个矩阵对应元素直接相乘,要求两个矩阵结构相同。*/mat A=(1,2\3,4\5,6)mat B=(7,8\9,0\1,9)matrix H=hadamard(A,B)mat list H
/矩阵的 Kronecker 乘积运算定义如下:
Kronecker 乘积运算对 A 和 B 没有任何要求。/
mat ab2=a#bmat list ab2mat ba2=b#amat list ba2
3 矩阵函数

以上表格引用自arlion《Estimation with STATA-Matrix》
1 转置、求迹
mat b=(1,-2,-3\2,-1,0)mat list bmat b2=b` //b2 为 b 的转置矩阵mat list b2/*迹的表达式为,它只能对方阵求,其结果是一个数 */matrix A= (1,0,1\2,1,0\-3,2,-5)scalar a=trace(A) //求 A 的主对角线上的元素之和并赋予该值给 bscalar list
2 求逆、求行列式的值
matrix B=inv(A) //B 为 A 的逆矩阵mat list B/*任务:解线性方程 Ax=b,其中:A=(1,-1,1,-2\2,0,-1,4\3,2,1,0\-1,2,-1,2)b=(2\4\-1\-4) */mat A1=(1,-1,1,-2\2,0,-1,4\3,2,1,0\-1,2,-1,2)mat b=(2\4\-1\-4)matrix B1=inv(A1) //B 为 A 的逆矩阵mat X=B1*bmat list Xmat a=(1,0,1\2,1,0\-3,2,-5)scalar aa=det(a) //det()计算行列式的值mat d=(1,-1,1,-2,2\2,0,-1,4,4\3,2,1,0,-1\-1,2,-1,2,-4)mat dd=det(d)scalar list
3 返回或者修改矩阵中某个元素的值
el(A,i,j)=A[i,j]mat d=(1,-1,1,-2,2\2,100,-1,4,4\3,2,1,0,-1\-1,2,-1,2,-4)mat list dscalar dd=d[2,2]scalar ddd=el(d,2,2)scalar listmat d[1,3]=1000mat list d
4 Nullmat 命令
该命令在编程时特别有用,有点类似于数据管理中的 mereg 命令
mat A=I(3)mat B=J(3,3,9)mat list C //矩阵C不存在mat C=(nullmat(C),A) //当C矩阵不存在时,将得到C=Amat list C //C=Amat C=(nullmat(B),A) //C变成由B和A两个矩阵横向对接mat list C //C=(B,A)mat A=A/10mat C=(nullmat(C),A) //C在原来的基础上对接了A变成新的矩阵mat list C //C=(C,A)
5 其他矩阵函数
matrix A= (1,0,1\2,1,0\-3,2,-5)matrix e=vec(A) //将矩阵A转化为一维列矩阵emat list ematrix d=vecdiag(A) //返回矩阵A的对角元素为一行向量dmatrix list dmat J=J(10,2,.)scalar a=rowsof(J) //求矩阵的行数scalar b=colsof(J) //求矩阵的列数scalar list
