【问题标题】:How to remove data points from a data set in MatlabMatlab如何从数据集中删除数据点
【发布时间】:2015-03-05 14:34:28
【问题描述】:

在 Matlab 中,我有一个 1x204 双精度向量。它表示一段时间内的生物信号,并且在这段时间内信号会发生变化 - 有时它会达到峰值并上升,有时它会保持相对较小,接近基线值 0。我需要将此数据的倒数绘制出来(在 x 轴上)针对另一组数据(在 y 轴上)进行一些统计分析。

问题在于,由于这些点接近于 0,例如我的最小点是 = -0.00497,1/0.00497 产生的值是 -201 并变成“异常值”,而其余数据则非常不同,值也不大。所以我试图从数据集中删除接近 0 的非常小的值,这样它就不会影响 1/值。

我知道我可以使用 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

【问题讨论】:

  • 不确定你真正想要什么。如果您尝试编写一些代码,请发布它?然后我们可以向您展示如何修复它。
  • 嗨,Sanjay,我已经添加了我使用的部分代码,但考虑到我想要的,我认为这没有意义。基本上解释说我有 A = [0.01 2 5 0.001 2.3],我想删除任何接近 0 的点,所以这里我想要 0.01 和 0.001,但我不知道该怎么做。我发布的 for 循环会给我 A = [1 2 5 1 2.3] 但我希望 0.01 和 0.001 完全从向量中消失,这样当我执行 plot(A) 时它看起来并不奇怪,这些点只是排除在外。我希望这是有道理的。
  • 我认为您最好先了解您的数据。然后你可以决定应用什么方法。只说if x&lt; 0.1 then x=0 可能就足够了,或者您可能想使用标准差来确定什么是异常值。由您决定最适合您的方法。

标签: matlab vector curve-fitting data-manipulation data-fitting


【解决方案1】:

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

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

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

【讨论】:

  • 感谢您的帮助!!
【解决方案2】:

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

total_BOLD_time_course( abs(total_BOLD_time_course<0.01) ) = nan

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

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

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

然后会有更少的数据点,它们不会映射到您拥有的任何其他time_course。但优点是它会“缩小”图表中的差距。

-- 附言

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

x<0 && x<-0.01

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

【讨论】:

  • 感谢您的帮助!使值 nan 完美地工作。非常感谢。
【解决方案3】:

正如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 等)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-23
    • 1970-01-01
    • 2022-11-26
    • 1970-01-01
    • 2019-10-25
    • 1970-01-01
    相关资源
    最近更新 更多