前言
算法仿真需要生成多元回归的仿真数据,这里将代码简单地总结一下 |
仿真模型
y
=
X
β
+
ϵ
y = X\beta+\epsilon
y=Xβ+ϵ
y
∈
R
n
×
1
,
X
∈
R
n
×
p
,
β
∈
R
n
×
1
,
ϵ
∈
R
n
×
1
y\in \mathbb{R}^{n\times 1},X\in \mathbb{R}^{n\times p},\beta\in \mathbb{R}^{n\times 1},\epsilon \in \mathbb{R}^{n\times 1}
y∈Rn×1,X∈Rn×p,β∈Rn×1,ϵ∈Rn×1
数据构造如下
X
∼
N
p
(
0
p
,
Σ
)
y
=
X
β
+
N
(
0
,
0.1
)
X\sim {N_p}({\mathbf{0}_p},{\Sigma })\\ y = X\beta+N(0,0.1)
X∼Np(0p,Σ)y=Xβ+N(0,0.1)
参数设置
生成60个样本,维度为6,协方差为 Σ = d i a g ( 10 , 8 , 6 , 4 , 2 , 1 ) \Sigma=diag(10,8,6,4,2,1) Σ=diag(10,8,6,4,2,1),这样的得到的数据 X X X为满秩,系数可以直接用最小二乘法求解 β ^ = ( X T X ) − 1 X T y \hat{\beta}=(X^TX)^{-1}X^Ty β^=(XTX)−1XTy。
代码
代码主要调用了函数mvnrnd生成多元变量,第一个参数为均值向量,第二个参数为协方差矩阵,第三个参数是生成的样本数量。
n = 60;
p = 6;
cov = diag([10,8,6,4,2,1]);
X = mvnrnd(zeros(1,p),cov,n);
%经验协方差估计
hatcov = X'*X/(n-1)
beta = rand(p,1);
err = mvnrnd(0,0.1,n);
y = X*beta + err;
hatbeta = inv(X'*X)*X'*y;
%画图
plot([beta hatbeta],'linewidth',1.5);
h = legend(["$$\beta$$","$$\hat{\beta}$$"]);
set(h,'Interpreter','latex')
a=gca;
a.FontSize=20;
a.FontName='Helvetica';
set(gcf,'color','w');
结果
协方差估计,与实际的协方差比较接近
系数估计值与实际值基本一致
高维数据仿真
这里采用了 n ≫ p n\gg p n≫p,如果要生成 n ≪ p n\ll p n≪p要怎么弄呢?
简单的做法如下
X
∼
N
p
(
0
p
,
I
p
)
X\sim N_p(\mathbf{0}_p,I_p)
X∼Np(0p,Ip)
按照这个分布生成
n
n
n个样本,不过求
β
\beta
β就不能用上面的公式直接得到,需要用正则或偏最小二乘法等手段,得到稳健一些的
β
\beta
β