使用numpy和scipy包中的函数生成多元正态分布样本
import numpy as np
from scipy.stats import multivariate_normal
# 定义均值和协方差矩阵
mean = np.array([0,0,0])
cov = np.array([[1,0,0],[0,1,0],[0,0,1]])
# 生成样本
samples = multivariate_normal.rvs(mean=mean, cov=cov, size=300)
这将生成一个形状为(300, 3)的样本矩阵,每一行都是一个三维的正态分布样本。
使用numpy中的randint函数生成随机的0/1数字,表示该项是否被观察到。
import numpy as np
# 定义观察到的概率为4/5,即遗漏的概率为1/5
prob = 0.8
# 生成300*3的随机0/1矩阵,表示每一项是否被观察到
mask = np.random.randint(0,2,size=(300,3))
mask = (mask<prob).astype(float)
# 使用随机矩阵对样本进行遮盖
samples_missing = samples * mask
这将生成一个形状为(300, 3)的样本矩阵,表示每一项有缺失数据的情况。
使用numpy的mean和cov函数估计数学期望和协方差矩阵,仅考虑完全观察到的项目。
import numpy as np
# 获取所有完全观察到的项目
samples_observed = samples_missing[np.all(samples_missing!=0, axis=1)]
# 估计数学期望值
mean_estimated = np.mean(samples_observed, axis=0)
# 估计协方差矩阵
cov_estimated = np.cov(samples_observed, rowvar=False)
# 比较估计的数学期望值和协方差矩阵与实际的数学期望值和协方差矩阵的差距
print("Difference between estimated mean and actual mean: ", np.mean(mean_estimated - mean))
print("Difference between estimated covariance and actual covariance: ", np.mean(cov_estimated - cov))
# 计算可用的观测值数量
num_observed = np.sum(np.all(samples_missing!=0, axis=1))
上面的代码将打印出估计的数学期望值和协方差矩阵与实际数学期望值和协方差矩阵的差距,并计算可用的观测值数量。
在进行有缺失值的统计分析时,使用估计器来估计数学期望、协方差和相关矩阵的值,是一种常见的方法。首先,需要使用可用案例分析来处理缺失值,然后使用合适的方法来构建估计器。如果估计值与实际值接近,则可以认为估计器是合理的;如果所有相关性都在-1和1之间,则说明相关性是合法的;如果所有估计的矩阵都是正确定的,则说明估计是准确的。最后,使用Python和Jupyter notebook编写完成上述项目要求。