簡體   English   中英

SAS對齊數據集-使用數組?

[英]SAS Aligning datasets - using arrays?

我的情況比較復雜,並且剛接觸SAS時,我總是想盡辦法找出解決辦法。 我有兩個數據集(控制器,daq),每個數據集中都有一個功率測量值。 我需要將控制器數據與daq數據對齊。 每個數據集BUT中都有一個時間戳,它們沒有花時間將數據與控制器同步,因此兩者之間的時間增量不確定。 為了進一步使事情復雜化,兩個系統都以不同的速率對數據進行采樣。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。 因此,對於典型的測試運行,控制器具有大約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數據會持續更長的時間,並且功率曲線會多次穿越該值,所以它將僅憑此很難對齊數據。

弗雷德,這是您可以嘗試的一些想法。 我同意IML可能是您的理想之選,但是您必須使用現有的工具。

首先,使用數組,您可以使用PROC TRANSPOSE或帶有RETAIN語句的DATA步驟修改控制器數據集,以創建兩個數組(一個用於時間,另一個用於測量),並在所有數組元素具有充滿了。 然后,您可以對兩個SET語句使用單獨的DATA步驟(第一個設置DAQ數據集,其次是“ IF N EQ 1 THEN SET <1觀測功率數據集名稱>;”。您需要在此新數組中設置數組數據集並再次使用RETAIN語句在整個處理過程中保留它們,然后可以使用DO循環在DAQ觀測值中的時間變量等於或存儲在POWER觀測值的日期之間的數組中處理信息。時間數組,這是一種處理信息的相當混亂的方式,並且會導致矩陣很大,除非您使用KEEP或DROP語句來限制最終輸出,但是,該方法將允許您通過以下方式修改CONTROLLER觀察值:多個觀測值之間的一些外推值。

相比之下,我認為我的第二和第三建議不會讓您在兩個值之間進行推斷,但是無論如何我都會建議它們。

第二種選擇是,使用PROC FORMAT從CONTROLLER數據集中創建用戶定義的格式,該值是時間,格式化后的值是POWER觀測值。 您將需要按時間對數據進行排序,然后可以使用lag函數定義START和END值以傳遞給格式。 創建格式后,您可以根據DAQ時間變量的格式值在DAQ數據集中使用該格式創建新變量。 如上所述,使用此過程在值之間進行推斷是不可行的。

第三個選項是第二個選項的變體,但是可以使用DATA Step Component Object來創建散列對象,而不是使用格式,該散列對象可以進行迭代以檢索所需的值。 我不經常使用這種方法,所以我不會費心嘗試描述它,但是您可以在SAS網站上找到它的文檔。

第四個選項可能比其中任何一個都更好,但是您必須擁有SAS / ETS模塊才能使用它。 您可能可以使用EXPAND過程將CONTROL數據集中的POWER觀測值外推到與DAQ數據集時間變量一致的時間頻率,然后將此擴展的數據集與DAQ數據集合並。 該方法將使您對外推的完成方式有相當多的控制,並且相當容易實現,但是再次,您必須具有ETS模塊才能使用該過程。

由於答案過於冗長,我沒有提供任何示例(本來應該是評論,但時間太長),但是請讓我知道是否希望我為所討論的方法之一提供一些示例代碼。 祝你好運。

由於您擁有ETS,請參閱以下示例以了解PROC TIMESERIES,尤其是最后的互相關圖:

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

互相關圖將在最佳滯后時達到峰值。

您也可以使用PROC TIMESERIES標准化采樣率。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM