【发布时间】: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