1

私はかなり複雑な状況にあり、SAS に慣れていないため、解決策を見つけようとして壁に頭をぶつけています。2 つのデータセット (コントローラー、daq) があり、各データセットには電力の測定値があります。コントローラーのデータを daq データと揃える必要があります。各データセットにはタイム スタンプがありますが、daq とコントローラーの時刻を同期していないため、2 つのデータセットの間に不確定な時間差があります。さらに複雑なことに、両方のシステムが異なるレートでデータをサンプリングします...そして、コントローラはテスト中にデータを記録するだけですが、daq はより長い期間記録します。したがって、典型的なテスト実行では、コントローラには約 1000 行のデータがあり、daq には異なるサンプル レートで 30,000 行があります (つまり、絶対測定値が正確に一致しない可能性があります)。

データを自動的に調整する方法を見つけようとしています。つまり、コントローラー データの曲線が daq データの曲線と最もよく一致する場所を見つけて、時間のデルタを求めています。

私の現在の考えは、2 つの配列を反復処理し、daqrow[i] を controllerow[j] から減算してから、曲線のデルタを合計して最小デルタを見つけることです。

      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;

配列のドキュメントを理解していないようです。私はオンラインで検索して多くの例を調べてきましたが、2 つのデータセットを読み取ってそれらから別の配列を作成する例は見つかりませんでした。同様の例へのリンク、またはより良いアプローチのアイデアがあれば、よろしくお願いします。

ありがとう、

フレッド

データサンプルで更新:

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よりもはるかに短い間隔であり、コントローラーの曲線がコントローラーの曲線と最も密接に一致する場所を調整することによって時間差を決定しようとしているということです. 最初は最大値を一致させることだけを考えていたので、曲線と言いますが、コントローラーデータからの最大値は1つしかありませんが、daqデータははるかに長い期間続き、電力曲線はその値を何度も横切ります。それだけに基づいてデータを調整することは困難です。

4

2 に答える 2

0

フレッド、ここにあなたが試すことができるいくつかのアイデアがあります. IML があなたの進むべき道であることに同意しますが、手元にあるものを使用する必要があります。

まず、配列を使用して、PROC TRANSPOSE または RETAIN ステートメントを含む DATA ステップを使用してコントローラー データセットを変更し、2 つの配列 (1 つは時間用、もう 1 つは測定用) を作成し、すべての配列要素が取得された後に最終観測のみを出力できます。満たされました。次に、2 つの SET ステートメント (最初に DAQ データセットを設定し、その後に "IF NEQ 1 THEN SET <1 観測 POWER データセット名>;". この新しいデータセットに配列を設定し、RETAIN ステートメントを再度使用して、処理全体で配列を保持する必要があります。その後、DO ループを使用して、 DAQ 観測の時間変数が、時間配列に保存されている POWER 観測の日付と等しいか、またはその日付の間にある配列. これは、情報を処理するためのかなり厄介な方法であり、使用しない限り、かなり大きな行列になります.最終的な出力を制限するための KEEP または DROP ステートメント. ただし、この方法では、複数の観測値の間で外挿された値によって CONTROLLER の観測値を変更できます。

対照的に、私の 2 番目と 3 番目の提案では、2 つの値の間を推定することはできないと思いますが、とにかく提案します。

2 番目のオプションでは、PROC FORMAT を使用して、CONTROLLER データセットからユーザー定義の形式を作成します。値は時間であり、書式設定された値は POWER 観測値です。データを時間でソートする必要があり、ラグ関数を使用して、フォーマットに渡す START 値と END 値を定義できます。フォーマットを作成したら、そのフォーマットを使用して、DAQ 時間変数のフォーマットされた値の場所に基づいて、DAQ データセット内に新しい変数を作成できます。前述のように、このプロセスを使用して値を推定することは現実的ではありません。

3 番目のオプションは 2 番目のオプションのバリエーションですが、フォーマットを使用する代わりに、DATA ステップ コンポーネント オブジェクトを使用して、必要な値を取得するために反復できるハッシュ オブジェクトを作成できます。私はこの方法を頻繁に使用するわけではないので、わざわざ説明するつもりはありませんが、SAS サイトでドキュメントを見つけることができます。

これらのどれよりも優れた 4 番目のオプションがありますが、それを使用するには SAS/ETS モジュールが必要です。EXPAND 手順を使用して、CONTROL データセットの POWER 観測を DAQ データセットの時間変数と一致する時間頻度に外挿し、この拡張されたデータセットを DAQ データセットとマージできる場合があります。この方法を使用すると、外挿の実行方法をかなり細かく制御でき、実装もかなり簡単になりますが、その手順を使用するには ETS モジュールが必要です。

回答が長すぎるため、例を提供していません (コメントでしたが、長すぎます)。ただし、説明した方法の 1 つのサンプル コードを提供してほしい場合はお知らせください。幸運を祈ります。

于 2013-02-05T22:26:15.357 に答える
0

ETS があるので、PROC TIMESERIES のこの例、特に最後の相互相関プロットを参照してください。

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

相互相関プロットは、最適なラグでピークに達します。

PROC TIMESERIES を使用して、サンプリング レートを正規化することもできます。

于 2013-02-07T15:58:42.077 に答える