如何使用MATLAB从数据中删除负估计

时间:2017-05-02 11:58:45

标签: matlab

从协方差矩阵(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)并仅限制到第一象限(即参数的唯一正值)。

提前谢谢。

1 个答案:

答案 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

现在,您可以比较新数据集的均值和协方差,看看哪种方法可以获得最佳结果。