連想配列で計算評価を行うこんにちは、
連想配列内に格納された標準偏差の計算を返す関数を取得しようとしていますが、コードは連想配列の式のみを返し、計算は返しません。私のコードのどこが間違っているのか教えていただけませんか。
履歴書=マックス(返信リスト) ;// ファイル内の cvf は 8 です
履歴書=連想配列() ;
履歴書[ 6 ] =連想配列({(標準開発( 5 、 6 、 7 、 8 、 9 、 10 ))}) ;
履歴書[ 8 】 =連想配列({(標準開発( 5 、 6 、 7 、 8 、 9 、 10 、 11 、 12 ))}) ;
履歴書[ 12 】 =連想配列({(標準開発( 5 、 6 、 7 、 8 、 9 、 10 、 11 、 12 、 13 、 14 、 15 、 16 ))}) ;
CVC =関数( {参照} 、地元({履歴書=連想配列({履歴書、評価(履歴書)} )} 、履歴書<<値を取得する(履歴書)) ;履歴書[参照]) ; ) ;
ある= CVC (履歴書) ;
評価(評価式(ある)) ;
表示(a);
これは私が得る出力です:
a = 連想配列({{Std Dev( 5, 6, 7, 8, 9, 10, 11, 12 ), 1}}, 0);
これは私が望む出力です: a= 2.5
Re: 連想配列で計算評価を行うSummarize(age grp) は 2 つのリストのリストであり、連想配列 (age grp) とは互換性がありません。 また、avg と sd は 1 つのリストに含まれており、 Summary(age grp) との相互参照には互換性がありません。 以下のコードはリストを正しく配置します (きれいではありません)。
Names Default to Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
Summarize( sum = By( :age),sex grp= By (:sex), avg = Mean( :height ), sd = Std Dev( :height ) );
age grp = Associative Array( :age ) << Get Keys;
sex grp = Associative Array( :sex ) << Get Keys;
dt << New Column( "CV" ) << New Column( "AVG" ) << New Column( "SD" );
For( g = 1, g <= nitems(age grp), g++,
For(i =1, i<=nitems(sex grp), i++,
rows = dt << get rows where( :age == age grp[g] & :sex == sex grp[i] );
if( i==1,
:AVG[rows] = avg[ g*2-1 ];
:SD[rows] = sd[ g*2-1 ];
:CV[rows] = 100 * avg[ g*2-1 ] / sd[ g*2-1 ];
,
:AVG[rows] = avg[ g*i ];
:SD[rows] = sd[ g*i ];
:CV[rows] = 100 * avg[ g*i ] / sd[ g*i ];
)));
Re: 連想配列で計算評価を行うありがとう、うまくいきます
Re: 連想配列で計算評価を行ういつ登場したのかは定かではありませんが、参考までに、私のバージョンの JMP (13) では、「CV」が「Tables > Summary」で提供される統計の 1 つであることに今気づきました。 したがって、数式列は必要ありません。
Re: 連想配列で計算評価を行うグループ化変数が 2 つあるという事実を見逃してしまい申し訳ありません。 この変更されたスクリプトは、それがどのように機能するかを示します。
Names Default to Here( 1 );
// Open example of a data table
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
// Estimate group statistics and group identities
Summarize( age sex grp = By( :age, :sex ), avg = Mean( :height ), sd = Std Dev( :height ) );
// Make a new columns for group result
dt << New Column( "Avg" ) << New Column( "SD" ) << New Column( "CV" );
// Iterate over groups
For( g = 1, g <= N Items( age grp ), g++,
// Convert :age level to match data type of identity
rows = dt << Get Rows Where( Char( :age ) == age sex grp[1][g] & :sex == age sex grp[2][g] );
:Avg[rows] = avg[g];
:SD[rows] =sd[g];
:CV[rows] = 100 * sd[g] / avg[g];
);
連想配列がグループを識別する最も効率的な方法であるとは思いません。 Summarize() 関数は、グループ レベルの 2 つの並列リストを使用して、グループ統計を推定し、関連するグループを識別します。 私の意見では、唯一の欠点は、元のレベル (この場合は :age レベルなど) が数値であっても、グループ化レベルが常に文字列であることです。 そのため、ターゲット行番号を取得する際に使用される比較のために :age レベルを変換する必要がありました。
これで、概要コマンドを使用した Ian の解決策を含む 2 つのアプローチができました。
Re: 連想配列で計算評価を行うこれがより効率的かどうかを試してみることができます (私はそれを期待しているかもしれません)。
Names Default To Here( 1 );
// Example table
dt = Open("$SAMPLE_DATA/Big Class.jmp");
// Edit to taste . . .
var = Column(dt, "height");
byVars = {Column(dt, "sex"), Column(dt, "age")};
// Use a summary table with formula column
dt2 = dt << Summary(Group(byVars), Mean(var), Std Dev(var));
Column(dt2, 4) << setName("Mean");
Column(dt2, 5) << setName("StdDev");
dt2 << New Column( "CV", Numeric, "Continuous", Format( "Percent", 12, 3 ), Formula(:StdDev/:Mean));
元のテーブルの CV 値が必要な場合は、「テーブル > 結合」を使用します。
Re: 連想配列で計算評価を行うハイマーク 、
あなたの例を使用すると、行番号は正しく取得できますが、平均と標準偏差は正しくありません。 私のテーブルは 10,000 行を超えており、計算が少し遅いです。 私のどこが間違っていたのか教えていただけますか?ありがとう。
デフォルトの名前はここにあります( 1 ) ;
dt =開ける( "$SAMPLE_DATA/Big Class.jmp" ) ;
要約する(年齢層=に( :年) 、セックスグループ=に( :セックス) 、平均=平均( :身長) 、 SD =標準開発( :身長) ) ;
年齢層=連想配列( :年) <<キーを取得する;
セックスグループ=連想配列( :セックス) <<キーを取得する;
dt <<新しい列( "履歴書" ) ;
ために( g = 1 、 g <=ナイアイテム(年齢層) 、 g ++、
ために(私= 1 、私<=ナイアイテム(セックスグループ) 、私++、
行= dt <<行を取得します。 ( :年==年齢層[ g 】 & :セックス==セックスグループ[私]) ;
:履歴書[行】 = 100 * SD [私] /平均[私] ;
)) ;
Re: 連想配列で計算評価を行うありがとう、それは私が探しているものです。ありがとう。
シュウ
Re: 連想配列で計算評価を行うこの例を試してみてください。
Names Default to Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
Summarize( age grp = By( :age ), avg = Mean( :height ), sd = Std Dev( :height ) );
age grp = Associative Array( :age ) << Get Keys;
dt << New Column( "CV" );
For( g = 1, g <= N Items( age grp ), g++,
rows = dt << Get Rows Where( :age == age grp[g] )
:CV[rows] = 100 * sd[g] / avg[g];
);
Re: 連想配列で計算評価を行うデータ テーブルには 3 つの列があり、1 つはレプリケート番号を示し、もう 1 つはレプリケートの信号出力を持ち、最後の列は dataID を持ちます。すべての dataID の標準偏差を計算する必要があります。 「Titer」という名前の 1 つの特定のタイプを除いて、すべてのデータには 2 つのレプリケートしかありません。データの生成場所に応じて、データ タイプ「Titer」には 6、8、または 12 のレプリケートが含まれます。したがって、これら 3 つのケースを配列として作成し、レプリケート列にリンクします。
私のコードを編集して式を標準偏差計算に戻しますが、それらをCV計算用の新しい列に入れても何も起こりません。
私が考えられるもう 1 つのオプションは、Tabulate プラットフォームを使用して標準偏差を取得し、それらを配列に入れて新しい列に割り当てることです。 なにか提案を?
Re: 連想配列で計算評価を行うそれでは、最初からやり直してみましょう。
- あなたは何をしようとしているのですか?
- あなたのデータはどのようなものですか?
- どのように組織されていますか?
- 必要な結果は何ですか?
- 結果を使って何をしたいですか?
連想配列を使用する必要があるかどうかはわかりません。
Re: 連想配列で計算評価を行う問題は解決しましたが、新たな問題が発生しました。
私の連想配列は数式なので、計算を実行するにはキーを取得する必要があります。
私のコードは標準偏差を計算する式である a を返します。しかし、その数式を新しい数式に代入すると、新しい数式では計算が実行されません。
ある= CVC (履歴書) <<鍵を取得する(履歴書) ;
見せる(ある) ;// これは次の式です。
{Std Dev(:INSTRUMENT_SIGNAL[Row() + 8]、:INSTRUMENT_SIGNAL[Row() + 1]、:INSTRUMENT_SIGNAL[Row() + 2]、:INSTRUMENT_SIGNAL[Row() + 3]、:INSTRUMENT_SIGNAL[Row() + 4]、:INSTRUMENT_SIGNAL[Row() + 5]、:INSTRUMENT_SIGNAL[Row() + 6]、:INSTRUMENT_SIGNAL[Row() + 7])};
しかし、以下の新しい式に a を代入すると、 a が計算を実行します。 助けてください!
cオル2 <<式を設定する(もしも( :ランサンプル種類== 「TITERC.NEG」 、 (ある/ :平均信号) * 100 ) 、
もしも( :ランサンプル種類[行()] == :ランサンプル種類[行() + 1 】 、
もしも( :担当者[行()] != 2 、 (標準開発( : INSTRUMENT_SIGNAL [行() + 1 ] 、 : INSTRUMENT_SIGNAL [行()] ) / :平均信号) * 100 ) ) ) ;