从多元正态分布中生成3维样本

问题遇到的现象和发生背景
  1. 从多元正态分布中生成3维样本。样本的大小 T = 300。多变量正态分布的参数由你自己选择。自己选择,但它们应满足以下条件。1)数学上的
    1)数学期望值m必须为非零;2)协方差矩阵S必须为非正交且为正确定。正向确定。
    让𝑌=(𝑦𝑖𝑗),其中𝑦𝑖=(𝑦𝑖1,.,𝑦𝑖𝐾)代表单元i的K项矢量。在我们的案例中,K=3,i从1到300变化。
    1. 在样本中产生缺失数据,条件如下:每个单位的每个项目 观察到的概率为4/5,遗漏的概率为1/5。
  2. (完全案例分析)。只考虑没有遗漏项目的单位。估计模型 参数(数学期望值和协方差矩阵),只使用完全观察到的项目。观察到的项目。你的估计值与参数的实际值有多接近?有多少个
    估算器的构建有多少可用的观测值?
  3. (可用案例分析)。考虑教科书 "有缺失值的统计分析 "中的第3.4段。有缺失值的统计分析"。并构建估计器,如下数学估计器 构建以下数学期望、协方差和相关矩阵的估计值。1) 𝑦̅𝑗 (𝑗) 2) 𝑠𝑗𝑘 (𝑗𝑘) , 3) 𝑟𝑗𝑘 ∗ , 4) 𝑟𝑗𝑘 (𝑗𝑘)。 , 5) 𝑠𝑗𝑘 ∗ , 6) 𝑠𝑗𝑘̃ (𝑗𝑘) 。 , 𝑗, 𝑘∈{1,2,3}。(见课本中的符号)。从s和r构建 构建相应的协方差矩阵S和相关矩阵R的估计值。这些估计值对实际矩阵有多接近?所有的相关性都在(-1,1)范围内吗?是否所有 估计的矩阵都是正确定的吗?
我想要达到的结果

使用Python和Jupyter notebook编写,完成以上的项目要求

使用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编写完成上述项目要求。

该回答引用ChatGPT

问题1:
要生成3维样本,可以使用numpy库中的np.random.multivariate_normal函数。首先选择数学期望m和协方差矩阵S,满足题目中的条件1)数学期望值非零,2)协方差矩阵非正交且正定。然后可以生成具有300个单位的多元正态分布的样本。

为产生缺失数据,可以使用随机数,按照题目中的每个项目的概率4/5观察到,1/5遗漏的条件产生数据。

如果只考虑完全观察到的项目,则可以使用完全观察到的数据估计模型参数(数学期望值和协方差矩阵)。实际上,如果遗漏数据较少,那么估计值与实际参数应该相差不大。

对于估算器的构建,可用的观测值的数量取决于数据的遗漏情况。如果遗漏的数据较少,则可以构建较好的估算器。

python代码问题1:


mport numpy as np
from scipy.stats import multivariate_normal
from sklearn.impute import SimpleImputer

# Generate 3-dimensional samples from multivariate normal distribution
np.random.seed(0)
mean = np.array([1, 2, 3])
cov = np.array([[1, 0.5, 0.1], [0.5, 1, 0.2], [0.1, 0.2, 1]])
samples = multivariate_normal.rvs(mean=mean, cov=cov, size=300)

# Generate missing data
mask = np.random.binomial(1, 0.8, size=samples.shape).astype(bool)
missing_samples = np.ma.masked_array(samples, ~mask)

# Use mean imputation to fill missing values
imputer = SimpleImputer(strategy='mean')
imputed_samples = imputer.fit_transform(missing_samples)

# Calculate estimates of mean, covariance, and correlation
estimated_mean = np.mean(imputed_samples, axis=0)
estimated_cov = np.cov(imputed_samples, rowvar=False)
estimated_corr = np.corrcoef(imputed_samples.T)

# Compare estimated values with true values
print('True mean: ', mean)
print('Estimated mean: ', estimated_mean)
print('True covariance: ', cov)
print('Estimated covariance: ', estimated_cov)
print('True correlation: ', np.corrcoef(samples.T))
print('Estimated correlation: ', estimated_corr)

、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、

问题2:
我们不能对估计值与实际值的接近程度和相关矩阵是否在(-1,1)范围内,是否是正确定的,因为我们没有提供实际的矩阵数据。因此,这取决于你的选择的参数和生成的样本数据。

python代码问题2:



import numpy as np

# Generate sample data with missing values
T = 300
K = 3
mean = [1, 2, 3]
cov = [[2, 1, 0], [1, 3, 1], [0, 1, 4]]
sample = np.random.multivariate_normal(mean, cov, T)
mask = np.random.binomial(1, 0.8, size=(T, K))
sample_missing = sample * mask

# Calculate estimate of mean, covariance and correlation matrix
y_bar = np.mean(sample_missing, axis=0)
s_jk = np.cov(sample_missing, rowvar=False)
r_jk = np.corrcoef(sample_missing, rowvar=False)

# Check if estimate is close to actual values
print("Difference between actual mean and estimate: ", mean - y_bar)
print("Difference between actual covariance and estimate: ", cov - s_jk)
print("Difference between actual correlation and estimate: ", np.corrcoef(sample, rowvar=False) - r_jk)

# Check if all correlations are in range (-1, 1)
print("Correlation matrix is within range (-1, 1): ", np.all(-1 <= r_jk) and np.all(r_jk <= 1))

# Check if estimated matrices are positive definite
def is_pos_def(matrix):
    return np.all(np.linalg.eigvals(matrix) > 0)

print("Covariance matrix is positive definite: ", is_pos_def(s_jk))
print("Correlation matrix is positive definite: ", is_pos_def(r_jk))




提供参考实例:python - 使用numpy.random.multivariate_normal(平均值,cov [,大小])绘制多个样本,链接:https://www.coder.work/article/4918271

以下答案引用自GPT-3大模型,请合理使用:
import numpy as np

def generate_sample(size, distribution):

"""

生成样本,参数为样本大小和分布

"""

x = np.random.normal(size, distribution.mean, distribution.std)

y = np.random.normal(size, distribution.mean, distribution.std)

z = np.random.normal(size, distribution.mean, distribution.std)

return x, y, z

这个问题可以分为四个步骤:1.从多元正态分布中生成3维样本;2.在样本中引入缺失数据;3.完全案例分析,估计模型参数;4.可用案例分析,估计相关矩阵。使用Python和Jupyter notebook编写,可以选择在Python中使用scipy库的stats模块来实现。要生成正态分布的样本,可以使用numpy.random.multivariate_normal()函数,可以实现缺失数据的功能,可以使用numpy.random.binomial()函数,可以使用scipy.stats.mvn().fit()函数来估计模型参数,以及scipy.stats.pearsonr()函数来估计相关系数。