如何从 Matlab 中的数据集中删除数据点

How to remove data points from a data set in Matlab

在 Matlab 中,我有一个 1x204 双精度向量。它代表了一段时间内的生物信号,随着时间的推移,信号会发生变化——有时它会达到峰值并上升,有时它仍然相对较小,接近基线值 0。我需要绘制这个数据的倒数(在 x 轴上)与另一组数据(在 y 轴上)进行对比,以便进行一些统计分析。

问题是由于那些点接近于 0,例如我拥有的最小点是 = -0.00497,1/0.00497 产生 -201 的值并变成 "outlier",而其余数据非常不同并且值没有那么大。所以我试图从数据集中删除接近 0 的非常小的值,这样它就不会影响 1/value。

我知道我可以使用 cftool 从图中删除这些点,但是我如何获得删除了这些点的向量?有没有办法实际删除点?从 cftool 并删除原始点上的那些点,我能够生成代码并找出它们的确切点,但我不知道如何创建一个删除这些点的向量。

有人能帮忙吗?

我确实尝试使用以下 for 循环让它删除值,'total_BOLD_time_course' 是我的信号,'1/total_BOLD_time_course' 是我想要绘制的,但问题是这是在我的 if 语句 total_BOLD_time_course(i) = 1 中,这并不完全正确——所以通过这样做,向量中的点仍然存在,但现在取值 1。但我只是希望它们成为从向量中消失。

for i = 1:204 
  if total_BOLD_time_course(i) < 0 && total_BOLD_time_course(i) < -0.01
   total_BOLD_time_course(i) = 1;

  else if total_BOLD_time_course(i) > 0 && total_BOLD_time_course(i) < 0.01
     total_BOLD_time_course(i) = 1 ;
  end
 end
end

是的,你可以。您可能想要定义一个阈值,例如 e = 0.01,并截断所有绝对值低于 e 的向量元素。 示例:

# assuming v is your initial vector
e = 0.01
new_vector = v(abs(v) > e);

或者,您可以使用曲线拟合工具箱中的 excludedata 工具,因为您知道要排除的矢量元素的索引。

要从数组中删除点,请使用语法

total_BOLD_time_course( abs(total_BOLD_time_course<0.01) ) = nan

这使得它们在图表上 'blank',并被进一步计算忽略,但不会破坏数据点的时间序列。

如果实际上破坏时间点不是问题,那么

total_BOLD_time_course( abs(total_BOLD_time_course<0.01) ) = []

然后会有更少的数据点,它们不会映射到您拥有的任何其他 time_course。但优点是它会 "close up" 图形中的间隙。

-- PS

请注意,在您的代码中,短语

x<0 && x<-0.01

是多余的,因为如果任何数字小于-0.01,它会自动小于0。我相信第一个应该是x>0,然后你的代码就可以了。

正如 VHarisop 所建议的那样,您可以为异常值设置一个阈值并排除它们。但是,根据您的绘图,确保剩余数据不会水平分流以填补空白可能很重要。要将 1./y 绘制为 x 的函数,您可以只 plot(x, 1./y) 然后使用 ylim 设置 y 限制以从视图中排除异常值,或使用 NaN:

e = 0.01
y( abs(y) < e ) = nan;
plot( x, 1./y )

对于定量(非可视化)统计分析,要么按照建议从 y 中完全删除值——请记住,这会使您得到更短的向量——或者使用知道如何处理的统计函数NaN 作为缺失数据(nanmeannanstd 等)。