【问题标题】:Looping to calculate sum of adjacent values while skipping blanks在跳过空白时循环计算相邻值的总和
【发布时间】:2020-09-04 01:07:46
【问题描述】:

我有一个时间序列的情绪反应,我想根据这些反应之间的绝对差异之和来计算一个变量。例如,我有 10 个变量来表示 T1-T10 的悲伤强度。但是,有些参与者缺少一些数据,因为有些参与者只回应了例如T1-5 或 T1-8。因此,我对每个参与者的回复数量各不相同。

现在我想从这些变量之间的绝对差的总和中计算一个新变量 (SAD_s),如下所示(T1s 是 T1 的悲伤强度,T2s 是 T2 等):

COMPUTE SAD_s=abs(T2s-T1s)+abs(T3s-T2s) + abs(T4s-T3s) +abs(T5s-T4s)+abs(T6s-T5s) + abs(T7s-T6s) +abs(T8s-T7s)+abs(T9s-T8s) + abs(T10s-T9s) .
EXECUTE.

但是,这仅适用于具有最大可能响应的参与者。对于其他缺少数据的人,我没有任何价值。

对于在时间序列结束时缺少数据的参与者(例如,从 T7 开始的缺失值,但在那之前的完整数据),我如何才能使这项工作发挥作用?原则上,我还希望为介于两者之间的缺失值的参与者提供一个解决方案(例如 T1-T7 完整、T8 缺失、T9-T10 完整),但我会优先考虑前者。

我还有一个变量表示 Ts 参与者响应的数量。我有一个模糊的想法,我需要使用一个循环,该循环被重复此变量所指示的次数,但我不知道如何实现。

【问题讨论】:

  • 在spss中轻松搞定——只有一个问题——如果说T8不见了,你想abs(T9-T7)替换abs(T8-T7)+abs(T9-T8)
  • 不,在这种情况下,我想计算 (T2s-T1s)+abs(T3s-T2s) + abs(T4s-T3s) +abs(T5s-T4s)+abs(T6s-T5s ) + abs(T7s-T6s) + abs(T10s-T9s)

标签: r loops time-series spss


【解决方案1】:

如果您只想跳过缺失值并仍然计算所有相邻有效值对之间的差异,您可以这样:

compute #lstvr=T1.
compute sad_s=0.
do repeat vr=T2 to T10.
  if not missing(vr) and not missing (#lstvr) sad_s=sad_s+abs(vr-#lstvr).
  if not missing(vr) #lstvr=vr.
end repeat.

如果我从您的评论中了解到,您不想比较缺失值两侧的值,只需像这样修复循环中的第二行:

compute #lstvr=vr. /* instead of "if not missing(vr) #lstvr=vr."

【讨论】:

  • 谢谢!尽管在我的情况下,这个变量中的值似乎不切实际地高。也许我没有正确地将其适应我的数据集。无论如何,我通过在我的原始语法代码中使用 SUM 命令找到了一个更简单的解决方案:COMPUTE SAD_s=SUM(abs(T2s-T1s),abs(T3s-T2s),abs(T4s-T3s),abs(T5s- T4s),abs(T6s-T5s),abs(T7s-T6s),abs(T8s-T7s),abs(T9s-T8s),abs(T10s-T9s))。执行。
  • 如果你只有 9 个像这里这样的对,这是一个很好的解决方案,但如果你的时间序列有(很多)更多点,最好使用循环。至于高价值 - 我在一个示例上成功测试了我的代码 - 如果您想进一步了解这一点,请在您的帖子中添加一些示例数据(使用编辑按钮),我们可以在一个常见示例上测试答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多