从协方差矩阵(3x3 COVAR)和相应的平均值(3x1 OMEGA)开始,我可以生成可信区域(1-sigma和2-sigma)的等高线图。这样做,我也会产生负值(估计值),这是我需要避免的。
换句话说,我可以从上述多变量分布中抽样
samples = mvnrnd(OMEGA,COVAR,10000);
%%将导致10000x3数据集。
现在从这个示例中,我想删除包含负值的整个行。我需要特定行中的所有条目仅为正数。我想到了摆脱这些负面价值的两种方法: 1)简单地消除包含单个否定条目OR的行 2)将所有负值替换为0.0 以下是我的代码......
这就是我的尝试......
samples = mvnrnd(OMEGA,COVAR,100000);
flag=1;
for iRow=1:length(samples)
a=samples(iRow,:);
% if (~any(a<0)&&flag==1)
% flag=0;
% data=a;
% elseif (~any(a<0)&&flag==0) %eliminating row
% data=[data;a];
% end
if flag==1
flag=0;a(a<0)=0;data=a; % replacing by 0.0
else
a(a<0)=0;data=[data;a];
end
end
执行这段代码后,我再次计算数据的均值和协方差,但只能发现它们有很多不同......
%新均值和新协方差
OMEGA = mean(data);
COVAR = cov(data);
有人能建议我采取更好的方法吗?这个想法是通过消除负值(非物理)来减小协方差矩阵(误差)的幅度。然后可以从这些新值绘制轮廓图(平均值和cov mat)并仅限制到第一象限(即参数的唯一正值)。
提前谢谢。
答案 0 :(得分:0)
更改后的数据集的均值和方差与原始值不同,因为您要删除最初属于分布的值。假设您有一系列数字,如-4,-5,2,8,9,平均值为2.现在如果完全删除负面部分,则平均值将变为19/3,如果替换负值零,平均值将变为19/5。这也是你的情况。
但是,您可以通过将第二种方法移除负值来最小化这些值之间的差异,使它们成为0.您的代码可以在两种情况下正常工作。但是,您可能希望使用下面的代码,因为它会更快,更优化:
方法1(完全删除负面行)
%Turns out there is a 1 line solution to this as well
data = samples(~any(samples < 0, 2), :);
%Define an anonymous function that finds out which rows have a negative values
%fn = @(x) any(samples(x, :) < 0);
%Now run this function over all the rows of the samples
%neg_rows = arrayfun(fn, 1:size(samples, 1));
%Change the dataset to remove the negative rows
%data = samples(~neg_rows, :);
方法2(使所有负值为0)
data = samples; % Copies all the samples to data
data(data < 0) = 0; % Makes all the negative values in data 0
现在,您可以比较新数据集的均值和协方差,看看哪种方法可以获得最佳结果。