【问题标题】:SAS Aligning datasets - using arrays?SAS对齐数据集 - 使用数组?
【发布时间】:2013-02-08 23:22:16
【问题描述】:

我有一个相当复杂的情况,并且是 SAS 的新手,我正在努力寻找解决方案。我有两个数据集(控制器、数据集),每个数据集中都有一个功率测量值。我需要将控制器数据与 daq 数据对齐。但是每个数据集中都有一个时间戳,但他们没有费心将 daq 与控制器同步,因此两者之间存在不确定的时间增量。更复杂的是,两个系统都以不同的速率对数据进行采样......虽然控制器只在测试期间记录数据,但数据采集器的记录时间更长。因此,对于典型的测试运行,控制器有大约 1000 行数据,而 daq 在不同的采样率下有 30,000 行(这意味着绝对测量值可能不会完全匹配)。

我正在尝试找出一种自动对齐数据的方法 - 即找出控制器数据的曲线与 daq 数据的曲线最接近的位置 - 为我们提供时间增量。

我目前的想法是遍历两个数组,从 controllerow[j] 中减去 daqrow[i],然后将曲线的增量相加并找到最小增量:

      set work.daqPower work.controlPower
array pwr_daq{*} daqPwr;  /* daqPwr is name of power variable in work.daqPower */
array pwr_control{*} controlPwr;  /* controllPwr is name of power variable in work.controlPower */
do idaq=1 to (30000 - 1000);
    x = idaq;
    tmp = 0;
    do jcontrol=1 to 1000;
        tmp = tmp + ABS(pwr_daq[x] - pwr_control[jcontrol]);
        x = x + 1;
    end;
    output;
end;

我显然不理解数组文档。我一直在网上搜索并浏览了很多示例,但我没有找到任何显示读取两个数据集并从中创建单独数组的示例。如果您有任何类似示例的链接,或者您对更好的方法有任何想法,我将不胜感激。

谢谢,

弗雷德

更新数据样本:

DateTime        daqPower
05JUL12:10:10:00    205.45687866211
05JUL12:10:10:00    204.33529663086
05JUL12:10:10:00    204.17504882813
05JUL12:10:10:00    203.53414916992
05JUL12:10:10:00    203.53414916992
05JUL12:10:10:00    204.81597900391
05JUL12:10:10:00    204.33529663086
05JUL12:10:10:00    205.13641357422
05JUL12:10:10:00    207.05914306641
05JUL12:10:10:00    206.73867797852
05JUL12:10:10:00    207.05914306641
05JUL12:10:10:00    208.50119018555
05JUL12:10:10:00    208.50119018555
05JUL12:10:10:00    207.53982543945
05JUL12:10:10:00    207.21936035156
05JUL12:10:10:00    206.73867797852
05JUL12:10:10:00    206.09777832031
05JUL12:10:10:00    205.77731323242
05JUL12:10:10:00    205.13641357422
05JUL12:10:10:00    205.45687866211

DateTime        controlPower
05JUL12:10:01:19    226.8705902
05JUL12:10:01:19    232.526886
05JUL12:10:01:19    236.9337006
05JUL12:10:01:19    242.3483887
05JUL12:10:01:19    246.9274292
05JUL12:10:01:19    246.3426819
05JUL12:10:01:19    244.3251495
05JUL12:10:01:19    242.6235352
05JUL12:10:01:20    243.5477753
05JUL12:10:01:20    240.9849854
05JUL12:10:01:20    230.8181458
05JUL12:10:01:20    225.579071
05JUL12:10:01:20    221.7199097
05JUL12:10:01:20    214.7053986
05JUL12:10:01:20    212.1452332
05JUL12:10:01:20    210.9714203
05JUL12:10:01:20    213.6631317
05JUL12:10:01:20    213.3510437
05JUL12:10:01:21    209.8970642
05JUL12:10:01:21    210.884964

请记住,时间不匹配(我们“听说”时间戳可能彼此不同步大约 10 分钟+)。关键是控制器的曲线比 daq 的间隔要短得多,我们试图通过对齐控制器曲线与控制器曲线最接近的位置来确定时间差。我说曲线,因为最初只是想匹配最大值,但是虽然控制器数据中只有一个最大值,但 daq 数据会持续更长的时间,并且功率曲线多次穿过该值,所以它会很难仅基于此对齐数据。

【问题讨论】:

  • 您可能不想使用数组。使用两个数据集中的一些示例数据更新您的问题,足以说明。然后,显示您想要的输出数据的示例。
  • 同意鲍勃的观点。 SAS 并没有真正以这种方式使用数组——这更像是一个 R/矩阵概念。除非您使用 IML,否则 SAS 更喜欢使用行而不是(列)数组。似乎您应该有两个数据集,数据集 1 的一行中的 daq 的每个值和数据集 2 中的控制器的每个值。这就是您所拥有的吗?
  • 我已经更新了数据,但我发现它的格式不正确。叹息。至于输出,理想情况下,我希望从 daq 和控件中识别时间戳,并控制来自 daq 和控件的曲线最佳排列的位置。这样我们就可以确定数据集之间的时间偏移,然后自动调整它们。是的,乔 - 你的解释是正确的。我可以使用它的矩阵概念在 R 中相当快地做到这一点,但我们正在迁移到 SAS,我需要在 SAS 中构建它。
  • 嗯。看到这一点,我建议这对于这个论坛来说可能不是一个合适的问题。这听起来更像是统计学家的问题,而不是程序员的问题。如果我要尝试解决这个问题,我想我会逐行进行,为每一行创建一个增量,并以图形方式查看;但即便如此,以编程方式实现也可能不会很容易。我假设你不能去硬件设备并修复它们的时间戳? :)
  • Fred,你有 SAS/IML 许可吗?如果是这样,那么您就有了可用的矩阵概念,它的基本原理与 R 几乎相同。

标签: arrays sas vertical-alignment


【解决方案1】:

Fred,您可以尝试以下一些想法。我同意 IML 可能是你要走的路,但你必须使用你手头的东西。

首先,使用数组,您可以使用 PROC TRANSPOSE 或带有 RETAIN 语句的 DATA 步骤来修改控制器数据集,以创建两个数组(一个用于时间,另一个用于测量)并仅在完成所有操作后输出最终观察结果数组元素已被填充。然后,您可以使用带有两个 SET 语句的单独 DATA 步骤(第一个设置 DAQ 数据集,然后是“IF N EQ 1 THEN SET ;”。您需要在这个新数据集中设置数组并再次使用 RETAIN 语句在整个处理过程中保持它们。然后您可以使用 DO 循环处理数组中的信息,其中 DAQ 观察中的时间变量等于或介于POWER 观察存储在时间数组中。这是一种处理信息的相当混乱的方式,并且会导致相当大的矩阵,除非您使用 KEEP 或 DROP 语句来限制最终输出。但是,这种方法将允许您可以通过多个观测值之间的一些外推值来修改 CONTROLLER 观测值。

相比之下,我认为我的第二个和第三个建议不能让您在两个值之间进行推断,但我还是会建议它们。

第二个选项,使用 PROC FORMAT 从 CONTROLLER 数据集创建用户定义的格式,其值为时间,格式化值为 POWER 观察值。您需要将数据按时间排序,然后您可以使用 lag 函数定义 START 和 END 值以传递到格式中。创建格式后,您可以使用该格式根据 DAQ 时间变量的格式化值在您的 DAQ 数据集中创建一个新变量。如上所述,使用此过程在值之间进行推断是不可行的。

第三个选项是第二个选项的变体,但您可以使用 DATA Step 组件对象创建一个哈希对象,而不是使用格式,您可以遍历该对象以检索您需要的值。我不经常使用这种方法,所以我不会费心去描述它,但你可以在 SAS 网站上找到它的文档。

还有第四个选项可能比其中任何一个都好,但您必须拥有 SAS/ETS 模块才能使用它。您可以使用 EXPAND 过程将 CONTROL 数据集中的 POWER 观测值外推为与 DAQ 数据集时间变量一致的时间频率,然后将此扩展数据集与 DAQ 数据集合并。这种方法可以让您对推断的完成方式有相当多的控制,并且相当容易实现,但同样,您必须拥有 ETS 模块才能使用该过程。

我没有提供任何示例,因为我的答案过于冗长(本来应该是评论,但太长了),但如果您希望我尝试为其中一种方法提供一些示例代码,请告诉我讨论过。祝你好运。

【讨论】:

  • 感谢您的建议。昨晚在谷歌搜索时,我确实找到了 PROC EXPAND 函数,结果我们同时拥有 IML 和 ETS。看起来 EXPAND 功能可能最容易解决问题。一旦我深入研究并找出正确的方法,我会发布
【解决方案2】:

由于您有 ETS,请参阅此 PROC TIMESERIES 示例,尤其是末尾的互相关图:

http://support.sas.com/documentation/cdl/en/etsug/63348/HTML/default/viewer.htm#etsug_timeseries_sect044.htm

互相关图将在最佳滞后处达到峰值。

您还可以使用 PROC TIMESERIES 来标准化采样率。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    • 1970-01-01
    • 2019-05-23
    相关资源
    最近更新 更多