正規分布と正規変換やあみんな、
いくつかの測定データがあり、連続正規フィットを試してみると、データが正規ではないことがわかります。 ただし、適合度テストから、データは Johnson Su 分布からのものであることがわかります。
この分布には 2 つの形状、1 つの位置と 1 つのスケール パラメーターがあります。 オンラインで調べた結果、これらのパラメーターから分散を計算し、そこから標準偏差を計算する方法がわかりました。 Excel を使用して計算しましたが、JMP でこれを行う方法はありますか? 私の理解では、「分布」分析の要約統計量テーブルは、データが正規分布からのものであると仮定してこれらの統計量を計算します。
前もって感謝します!
ナタリー
Re: 正規分布と変換返信ありがとうございます、txnelsonさん。 そんなことは考えもしなかったし、そんなことになるとは予想もしなかった。 変換を正確に元に戻すことが不可能になる場合、その変換の価値は何になるのか疑問に思います。 変換されたデータからモデルを開発する場合、そのモデルの出力が元のデータ形式でどのようなものであるかを知る必要があります。 したがって、JMP がこの変換をオプションとして含めるというのは愚かなことのように思えます。 オリジナル脚本に敬意を表します。 今後必要に応じて使用できるよう保存しておきます。Re: 正規分布と変換このスクリプトは密度変換では機能しません。この関数は同じ密度値に対して複数の値を生成しますが、コードはそれを処理できません。以下のグラフを参照してください

Re: 正規分布と変換おそらくそれは私のデータセットでしょうか? つまり、コードのテスト/検証のためにデータセットから値を選択し、対数正規変換された値を取り出していました。 私のデータセットは以下です。 値 7 は、変換された値 0.112832236739791 に対応します。したがって、変換された値をコード内のターゲットとして使用でき、スクリプトは 7 を吐き出すはずです。 正しい?
Names Default to Here(1);
dt=New Table( "Test",
Add Rows( 30 ),
New Column("PNP3",
Numeric,
"Continuous",
Format( "Best", 10 ),
Set Values(
[12, 4, 12, 13, 7, 5, 5, 15, 5, 5, 5, 15, 7, 7, 16, 5, 9, 11, 18, 8, 16, 12, 7, 14, 6, 11, 7, 10, 14, 10]
)
),
New Column( "LogNormal Density PNP3",
Numeric,
"Continuous",
Format( "Best", 12 ),
Formula(
Normal Density( Log( :PNP3 ), 2.17970974904887, 0.43804625261609 ) / :PNP3
)
)
);
/***********************************************************************/
/* */
/* The getformula column retrieves the formula from the translation */
/* column and replaces the Original Column name in the formula with */
/* string "__value__". The value of this variable is what will be */
/* evaluated in the successive approximations done by the script. */
/* */
/***********************************************************************/
getformula = Function( {ColName, FormulaColName},
{ColName, FormulaColName, TheFormula, coloncolname},
//__value__ = .;
// Get the transformed data columns formula as a literal string
TheFormula=Column( FormulaColName ) << Get Formula ;
// Check to see that a formula was found
If( Is Empty( TheFormula ) == 1 ,
Dialog(
" The column specified as",
"the Transformed Column does",
" not contain a formula. ",
" ",
" Please rerun and select",
" the correct column"
);
Throw();
);
TheFormula=char( Column( FormulaColName ) << Get Formula );
// Get the actual name of the orignal column since
// the upper,lower case and spacing is critical in determining
// where in the formula the column name actually occurs
ColName = Column( ColName ) << Get Name;
// Determine if the reference to the column name in the
// formula is a simple :colname reference or a complex
// reference :Name(\!"colname\!")
// If the column name isn't found set the return code to -1
If(
Contains( TheFormula, ":" || ColName ), ColonColName = ":" || ColName, // Else
Contains( TheFormula, ":Name(\!"" || ColName || "\!")" ), ColonColName = ":Name(\!"" || ColName || "\!")", // Else
rc = -1
);
// Replace all of the column references in the formula with
// the string "(__value__)" so that when the formula is
// evaluated later, it will take the then value of the memory
// variable called __value__ and use it in the formula
If( Contains( TheFormula, ColonColName ) > 0,
While( Contains( TheFormula, ColonColName ) > 0, TheFormula = Munger( TheFormula, 1, ColonColName, "(__Value__)" ) ),
Dialog(
" The column specified as",
"the Transformed Column does",
" not contain a reference",
" to the original column.",
" in it's formula.",
" ",
" Please rerun and select",
" the correct column"
);
Throw();
);
TheFormula;
);
/***********************************************************************/
/* */
/* The gettrans function evaluates the formula in the transformed */
/* and converts the formula into a generic form for repeated use in */
/* running of the script. */
/* */
/***********************************************************************/
gettrans = Function( {ColName, FormulaColName, TheTarget, Theformula},
//colname="PNP3";formulacolname="Johnson Sl Transform PNP3"; Thetarget=johnsonmean;theformula=myformula;
{ColName, FormulaColName, TheFormula, High, Low, TheTarget, TheMax, Themin, __value__},
// The program uses successive approximations to determine the different
// parametrics. The way it works is that it calculates the needed parameter
// such as Mean, or Standard Deviation, and then by using successive
// approximations from the original column's values, and passing those
// values through the columns formula, when the approximation value matches
// the calculated value from the transformed column, the retransformed value
// has been found
// Set the extreem values
High = Col Maximum( If( Excluded( Row State( Empty() ) ) == 0, Column( ColName ), . ) );
Low = Col Minimum( If( Excluded( Row State( Empty() ) ) == 0, Column( ColName ), . ) );
// Make a guess at the first value
__value__ = Mean( High, Low );
// Iterate the guessing for up to 100 times, adjusting by 1/2 on each loop
For( i = 1, i <= 100, i++,
TheResult = Eval( Parse( theformula ) );
If(
TheResult > TheTarget, High = __value__,
TheResult < TheTarget, Low = __value__,
Break()
);
If( High == Low, Break() );
__value__ = Mean( High, Low );
);
__value__; // Expose the return value
); // End of function gettrans
myFormula = getformula( "PNP3","LogNormal Density PNP3" );
MatchValue = 7;
TargetValue = 0.112832236739791;
dt<<RUN formulas=""></RUN>
コードを実行した後のログ出力は次のとおりです
MatchValue = 7;
TargetValue = 0.112832236739791;
Gettrans("PNP3", "LogNormal Density PNP3", 0.112832236739791, myFormula) = 18;
Gettrans 関数の出力は 7 になるはずです。 コードが出力している値 18 は、変換された値 0.0135701784925184 に対応します。
Re: 正規分布と変換何が問題なのかわかりません。コードで行われるのは、元の列から値を取得し、結果が変換された列のターゲット値 (通常は新しい分布の平均) と等しくなるまで、それらを式に渡すことだけです。以前の回答からスクリプトを作り直しましたが、今回は、Distribution プラットフォームによって決定された対数正規密度の式を使用しており、コードはうまく機能しているようです。
Names Default to Here(1);
dt=New Table( "Test",
Add Rows( 100 ),
New Column("PNP3",
Numeric,
"Continuous",
Format( "Best", 10 ),
Set Values(
[130.378809500886, 132.736937590235, 136.831952164704, 136.969154239163,
136.622623419893, 137.480356512481, 138.094011176166, 142.10586919757,
134.750041237898, 129.719685093372, 136.520172900026, 134.778624216716,
136.991131754497, 140.420940666186, 143.257827228986, 132.213765487819,
144.671172276421, 134.703176752174, 136.744212473486, 137.187637284245,
139.788226018039, 139.372617199359, 136.112484488985, 142.809097034809,
137.799370430979, 138.482493403385, 135.236982575217, 136.251777781494,
130.768356509183, 138.248554728086, 139.77894292052, 134.25405167366,
147.680687116943, 131.351711991517, 132.84274608728, 129.925216236015,
133.47206414316, 143.339607103893, 145.341236691691, 139.200187547183,
142.775409342827, 140.276696563388, 130.623979847275, 140.899814366103,
136.839389290019, 137.239125319, 133.5265281641, 139.356927352471,
130.278640163464, 144.604061001983, 135.286715550332, 134.465744849174,
131.37612790407, 131.830655714309, 140.69724979219, 142.88152043774,
135.253839945611, 127.349434776131, 129.499730399113, 128.447533754611,
130.916853702805, 134.599575929218, 140.761701916093, 136.870661473033,
138.253066182015, 140.403627077024, 134.522643679098, 124.842978178703,
131.803059455053, 125.886786494664, 133.013566701611, 136.940299158936,
133.263913979648, 144.695171321015, 149.541020434399, 144.503845528521,
136.086324063453, 139.530943158798, 138.421460162451, 133.180943784947,
142.166796633818, 142.676541730822, 135.723943440339, 143.957996114985,
145.712158558794, 138.38937502716, 140.535304753392, 142.140619481175,
131.379414509756, 144.949299702964, 133.349854687882, 139.470639804255,
140.160558367008, 137.130662662612, 145.692632562344, 131.870848869966,
136.391733804566, 134.219740661271, 139.021827550389, 147.958038547157]
)
),
New Column( "LogNormal Density PNP3",
Numeric,
"Continuous",
Format( "Best", 12 ),
Formula(
Normal Density( Log( :PNP3 ), 4.92072961984847, 0.0370684539915594 ) / :PNP3
)
)
);
/***********************************************************************/
/* */
/* The getformula column retrieves the formula from the translation */
/* column and replaces the Original Column name in the formula with */
/* string "__value__". The value of this variable is what will be */
/* evaluated in the successive approximations done by the script. */
/* */
/***********************************************************************/
getformula = Function( {ColName, FormulaColName},
{ColName, FormulaColName, TheFormula, coloncolname},
//__value__ = .;
// Get the transformed data columns formula as a literal string
TheFormula=Column( FormulaColName ) << Get Formula ;
// Check to see that a formula was found
If( Is Empty( TheFormula ) == 1 ,
Dialog(
" The column specified as",
"the Transformed Column does",
" not contain a formula. ",
" ",
" Please rerun and select",
" the correct column"
);
Throw();
);
TheFormula=char( Column( FormulaColName ) << Get Formula );
// Get the actual name of the orignal column since
// the upper,lower case and spacing is critical in determining
// where in the formula the column name actually occurs
ColName = Column( ColName ) << Get Name;
// Determine if the reference to the column name in the
// formula is a simple :colname reference or a complex
// reference :Name(\!"colname\!")
// If the column name isn't found set the return code to -1
If(
Contains( TheFormula, ":" || ColName ), ColonColName = ":" || ColName, // Else
Contains( TheFormula, ":Name(\!"" || ColName || "\!")" ), ColonColName = ":Name(\!"" || ColName || "\!")", // Else
rc = -1
);
// Replace all of the column references in the formula with
// the string "(__value__)" so that when the formula is
// evaluated later, it will take the then value of the memory
// variable called __value__ and use it in the formula
If( Contains( TheFormula, ColonColName ) > 0,
While( Contains( TheFormula, ColonColName ) > 0, TheFormula = Munger( TheFormula, 1, ColonColName, "(__Value__)" ) ),
Dialog(
" The column specified as",
"the Transformed Column does",
" not contain a reference",
" to the original column.",
" in it's formula.",
" ",
" Please rerun and select",
" the correct column"
);
Throw();
);
TheFormula;
);
/***********************************************************************/
/* */
/* The gettrans function evaluates the formula in the transformed */
/* and converts the formula into a generic form for repeated use in */
/* running of the script. */
/* */
/***********************************************************************/
gettrans = Function( {ColName, FormulaColName, TheTarget, Theformula},
//colname="PNP3";formulacolname="Johnson Sl Transform PNP3"; Thetarget=johnsonmean;theformula=myformula;
{ColName, FormulaColName, TheFormula, High, Low, TheTarget, TheMax, Themin, __value__},
// The program uses successive approximations to determine the different
// parametrics. The way it works is that it calculates the needed parameter
// such as Mean, or Standard Deviation, and then by using successive
// approximations from the original column's values, and passing those
// values through the columns formula, when the approximation value matches
// the calculated value from the transformed column, the retransformed value
// has been found
// Set the extreem values
High = Col Maximum( If( Excluded( Row State( Empty() ) ) == 0, Column( ColName ), . ) );
Low = Col Minimum( If( Excluded( Row State( Empty() ) ) == 0, Column( ColName ), . ) );
// Make a guess at the first value
__value__ = Mean( High, Low );
// Iterate the guessing for up to 100 times, adjusting by 1/2 on each loop
For( i = 1, i <= 100, i++,
TheResult = Eval( Parse( theformula ) );
If(
TheResult > TheTarget, High = __value__,
TheResult < TheTarget, Low = __value__,
Break()
);
If( High == Low, Break() );
__value__ = Mean( High, Low );
);
__value__; // Expose the return value
); // End of function gettrans
myFormula = getformula( "PNP3","LogNormal Density PNP3" );
dt<<RUN formulas=""></RUN>Re: 正規分布と変換こんにちは、txnelson さん
リンクしたプログラム/スクリプトについて質問があります。 ジョンソン変換を簡単に元に戻すことができますが、他の変換には機能しません。 特に、対数正規密度変換です。 スクリプトを変更して機能する方法があるかどうか確認するために PM をお送りしてもよろしいでしょうか?Re: 正規分布と変換というコラムが「Johnson Sl Transform X By Timepoint」は、変換されたデータです。正規化されたデータが含まれるのはこの列です。この列に基づいて分析を実行します。
したがって、Timepoint1 と Timepoint2 のデータに違いがあるかどうかを判断するために分析を実行するときは、変換されたデータ列に対して実行することになります。ここで問題となるのは、変換されたデータのスケールで値が報告されることです。したがって、元の列 X に関連付けるには、分析からのデータ ポイント値を入力してスクリプトを実行し、X に関してその値を取得します。
Re: 正規分布と変換もちろん、前に投稿したように、スクリプトは個別に実行する必要があります。 便宜上、単一のファイル (Test.jmp) を同封しました。スクリプトを実行して通常の形状を確認するには、スクリプトでジョンソン SI 変換後の通常のデータを (データ テーブル ファイルの) Y という 3 番目の列に記録すべきではないでしょうか。
問題は、スクリプトに通常のデータをデータ テーブルに保存するためのコマンド ラインがないことです。 だからこそ、私はあなたにそれについて尋ねたのです。
これらの分割ファイルの 1 つを調べてスクリプトを実行すると、3 番目の列 Y は空白のままです。 分割された各データ テーブルは、3 番目の列 Y のジョンソン SI 変換後の通常のデータによって完成すると考えました。その後、それらを再び 1 つのファイルに結合して統計分析を進めたいからです。
タイムポイント 1:
ジョンソン平均値 = -3.80945275324507e-15;
Col Mean(:X) = -7.4569375;
Gettrans("X", "Johnson Sl Transform X By Timepoint", JohnsonMean, myFormula) = -10.7617217296089;
タイムポイント 2:
ジョンソン平均値 = 7.27196081129478e-15;
列平均(:X) = 3.257375;
Gettrans("X", "Johnson Sl Transform X By Timepoint", JohnsonMean, myFormula) = 1.87687074670016;
助けてくれてありがとう。
Re: 正規分布と変換あなたの質問の解決策では、データの異なるタイムポイントグループが異なる全体的な分布からのものであるという事実を知っているかどうかについて人間の判断をもたらす必要がありますか?私の仮定は、全体の分布が正規分布に基づくかどうかを判断する最良の方法は、すべてのデータを単一の評価に結合することであるということでした。その後、すべてのデータに対して単一の変換を使用し、その変換されたデータに対して後続の分析を実行します。本当の違いは、変換されたデータ内で特定される必要があります。ここで、Timepoint グループが別々のディストリビューションからのものであるという独立したアプリオリの知識がある場合は、データを別々の Timepoint グループにサブセット化し、異なるサブセットに対して別々にスクリプトを実行する必要があります。
Re: 正規分布と変換こんにちは、ジムさん
ここに誤解があると思います。 ただし、ログ ファイルには次のように表示されます。
JohnsonMean = 1.72084568816899e-15;
Col Mean(:X) = -2.09978125;
Gettrans("X", "Johnson Sl Transform X By Timepoint", JohnsonMean, myFormula) = 1.1;スクリプトは、「Johnson SI Transformation By Timepoint」列の通常のデータをデータテーブルの Y 列に保存しません。
最高、
レイナルド
Re: 正規分布と変換結合されたタイムポイントを含むデータ テーブルに戻ります。次に、[ディストリビューション] に移動し、変換されたデータに対して実行します。
次に、に行きます
ヘルプ==>書籍==>JMPの発見
JMP がどのように機能するかについてもっと学ぶ必要があります。
Re: 正規分布と変換タイムポイントごとに 1 つずつ、合計 2 つのサブセットを作成しました。 通常のデータを取得してプロットするには、ログ ファイルの出力をどこで使用すればよいですか?
Re: 正規分布と変換1. わかりました。個別に実行します。
2. あなたが言及した出力 (ログ ファイル) と Johnson SI Transform X By Timepoint (= 非正規分布) はありますが、Y 列にデータが割り当てられていません。
Re: 正規分布と変換1. タイムポイントごとに個別の結果を取得する必要がある場合は、データ テーブルをタイムポイントごとに個別のテーブルにサブセットし、それぞれのテーブルで個別にスクリプトを実行する必要があります。
2. 次に、変換されたデータ列を Y 列であるかのように使用して分析を進める必要があります。
3. 文書を読んで内容を理解する
ヘルプ==>書籍==>JMPの発見
Re: 正規分布と変換申し訳ありませんが、ログ ファイルが見つからなかったため、お知らせしませんでした。 私はJMPの初心者です。 これで、「表示」→「ログ」で見つけることができます。
さて、そのコマンドラインを追加したところ、同じ結果が得られました。
次のステップは何ですか? 
PS: スクリプトは、これらのパラメーターを計算するために 2 つのタイムポイントを個別に考慮しませんか? おそらく、「getformula」と「gettrans」関数に「Timepoint」と呼ばれる新しいパラメータが追加されるでしょう。
Re: 正規分布と変換1. 私は最後の回答で、ログを調べてエラーがあったかどうかを確認していただけないかとリクエストしました。前回の回答に添付されたデータ テーブルに含まれていたスクリプトを実行しました。ログを見ると、次のように指定されていました。
The namespace "dt" is not defined in access or evaluation of 'dt:Johnson Sl Transform X By Timepoint' ,
dt:Johnson Sl Transform X By Timepoint/*###*/
それを踏まえてスクリプトを調べてみると、「dt」参照が次の行にあります。
JohnsonMean = Col Mean( dt:Johnson Sl Transform X By Timepoint );
このコンテキストにおける dt は、データを読み取るデータ テーブルを指す dt という変数を探します。したがって、プログラムの修正は、コード内で参照を使用する前に次の行を追加することです。
dt=current data table();
これをコードのコピーに、スクリプトの最初の行として追加しました。
これを実行すると、ログにスクリプトから次の結果が得られました。
JohnsonMean = 1.72084568816899e-15;
Col Mean(:X) = -2.09978125;
Gettrans("X", "Johnson Sl Transform X By Timepoint", JohnsonMean, myFormula) = 1.1;
注意してください......結果はログ ファイルに記録されていました。
Re: 正規分布と変換ジムさん、投稿ありがとうございます! 能力分析について理解できたと思います。 
非正規データから正規性への変換に関して、2 つのタイムポイントと非正規変数として X を含む例 (Test.jmp) を作成しました。 私はあなたの手順に従いました:
1. 分析 -> 分布
2. X を「Y, Columns」として、Timepoint を「By」として指定します。
3. [Distributions Timepoint] -> [Stack] をクリックしました。
4. 各タイムポイントで、赤い三角形をクリックし、[Continuous Fit -> Johnson SI] をクリックします。
5.「Fitted Johnson SI -> 変換済みを保存」をクリックしました。
次に、JMP は「Johnson SI Transform X By Timepoint」列を生成しました。
これが重要です。Test.jmp の左上にあるスクリプトを実行しようとしましたが、何も起こりませんでした。
そのスクリプトのどこが間違っていたのか説明してもらえますか?
PS: Y 列がジョンソン SI 変換後の X の正規性を表すようにしたいと思います。
どうもありがとう!
Re: 正規分布と変換通常は製造プロセスに適用されます
Re: 正規分布と変換Cp と Cpk は心理学の分野ではなく、エンジニアリング、プロセス制御などに適用されると考えるのは正しいですか?
Re: 正規分布と変換Cp/Cpk 解析は仕様限界によって完全に支配されます。確かに、3,000 の仕様制限を生成することはできますが、そのような限られた測定スペースでそれらを使用することは、実際の意味ではなく、数値を生成するための練習にすぎないようです。
Re: 正規分布と変換能力分析に関しては、以前の投稿で「非データを通常のデータに変換する手順」を次の URL で説明した際にセットアップされているのを見ました。 https://community.jmp.com/t5/Discussions/Normal-Distributions-and-Transformations/td-p/28662/page/2?lightbox-message-images-53315=9889i529042A0AA61277A (2ページ)
「能力分析」とは、統計的工程管理においてシステムが一連の仕様や要件を満たせるかどうかを測定するもののようですね。 したがって、私の場合には当てはまりません。
Re: 正規分布と変換もう一度質問しますが、より直接的に、なぜデータに対して能力分析を実行する必要があると思いますか?
それはさておき、スクリプトが目に見える出力を提供しないことに関して、ログにエラーを示すメッセージはありますか?
Re: 正規分布と変換1. 能力分析は「定義された仕様限界に対するプロセスの適合性を測定する」と読みましたが、残念ながら統計におけるその意味を正確に理解していませんでした。
2. したがって、新しい列「Johnson SI」が作成されたときに、実際にスクリプトを実行する必要があります。 (最初は、実行する必要はないと考えていました)。 とにかく実行してみました。 私の場合、データテーブルは列形式です。 データテーブルを作成する最初の部分を削除し、PNP3 と "Johnson SI Transform PNP3" ではなく列の名前を挿入してスクリプトを調整しようとしました。そして、それを左上のボックス (データの名前の下) に保存しました。ファイル) データ ファイル内にあります。 実行してみたところ、何も起こりませんでした。 (列名はスクリプト内ではなくデータ ファイル内にあるため、正しく保存できたのか、それとも列名に関して解析エラーが発生したのかわかりません)。 お願いします、ジム ( @txnelson )、列形式のデータ ファイルを使用してスクリプトを実行するにはどうすればよいですか?
どうもありがとうございます!
Re: 正規分布と変換1. 能力分析で何をしたいのかを教えてください。私のバックグラウンドは心理学と工学の両方です。Cp/Cpk を使用して能力の推定値を取得することもできますが、単一のデータセット内で Cp/Cpk を使用しており、実際の仕様限界に基づいていないため、この統計はやや疑わしいと思います。
2. データを変換する目的は、データを正規分布に変換することです。その理由は、統計検定の多くが正規分布するデータに基づいているためです。ウィルコノン統計はノンパラメトリック検定です。正規分布は必要ありません。
Re: 正規分布と変換スクリプトを実行する必要があることを理解しました。 実行しなければ、列が正規化されているのがわかりますが...
1. 能力分析のこれらのパラメーターはどのような状況で使用する必要がありますか?
2. 反復測定計画で非正規データを実行すると、ノンパラメトリック多重比較検定 (たとえば、ウィルコクソン各ペア) の結果を通じて、複数の時点にわたって分析した変数に対する有意な効果を見つけることができました。 しかし、Johnson SI を使用して列が変換されたデータを実行すると、その重大な効果は時点全体で消失しました。 では、どの結果を信頼すればよいのでしょうか?
Re: 正規分布と変換はい.....
Re: 正規分布と変換わかった。 その後、スクリプトを実行して、その Johnson SI 列を正規に変換する必要がありますか?
Re: 正規分布と変換Fitted Johnson SI アウトライン ボックスの赤い三角形から [変換済みを保存] を選択します。Johnson SI 変換を使用して新しいデータ列を作成します。
Re: 正規分布と変換こんにちは、ジム ( @txnelson )、
投稿ありがとうございます。 あなたが提案したリンクを読みました。 理解したように、<分布タイプ> で「Johnson SI」を選択し、工程能力分析を通じてジョンソン SI を使用して分布を近似することができます。または、分布の近似を実行して赤い三角形の工程能力分析をクリックすると、仕様限界を見つけることができます。あなたが提案しました。
仕様限界は伝統的に測定データの知識に基づいて決定されているということに私も同意します。 しかし、それは工学分野にも当てはまると思います。 心理学の分野では、これらの制限について知ることは困難ですが、収集されたデータだけがわかります。 このようにして、Johnson SI の Fit Distribution を実行し、赤い三角をクリック ==> K Sigma の仕様限界を設定し、K 値 = 3 を選択する必要があると思います。
これを実行すると、分位シグマとジョンソン SI のフィッティング プロットが得られます。 ただし、データの通常の形状は得られておらず、能力分析からのパラメーター (仕様制限) だけが得られています。 次のステップは何ですか?
ありがとう。
Re: 正規分布と変換1. JMP Web ページにアクセスして、配布プラットフォームのドキュメントを読むことをお勧めします。
JMP Webページ==サポート==>オンラインドキュメント==基本分析==>配布物
このツールで何ができるかについて、非常に優れた知識を得ることができます。JMP 10 を使用しているとのことでした。最新の JMP バージョンは 14 (近日リリース予定) で、Web 上のドキュメントは JMP 14 です。ただし、ドキュメントで説明する内容のほぼすべてが JMP 10 で利用可能であることがわかります。
2. データの分布の形状 (つまり、正規分布、ジョンソン SI、対数正規分布など) の決定は、能力分析では決定されません。実際にはその逆です。分布の形状によって、データの能力を計算するためにどのような式を使用するかが決まります。
3. あなたは能力分析における限界が何であるかを理解していないようです。仕様限界は伝統的に、測定データの知識に基づいて決定されます。つまり、電気部品の電圧を測定している場合、部品が適切に動作するには、電圧が仕様下限値 (LSL) と仕様上限値 (USL) の間にある必要があると部品の設計に記載されています。プロセスがどの程度の能力を備えているかを判断する際に使用されるのは、これらの制限です。
4. 多くの場合、分散プラットフォームから取得したいことは、データが正規に分散されているかどうかの判定を取得することだけです。これがなぜ重要なのかというと、多くの統計分析ではデータが正規分布しているという前提があるからです。したがって、データを変換する目的は、データを正規分布に変更して、統計検定でより正確な結果が得られるようにすることです。
Re: 正規分布と変換さらに、私は JMP の初心者であり、これは反復測定デザインを参照するという追加の複雑さを伴う初めての変換です。
「能力分析」と「フィットジョンソンSI」の関係はまだ分かりませんでした。 つまり、 「能力分析」まず、前述のパラメータ (前回の投稿) を正しく入力したと仮定して、次に、 」 Continuous Fit ==> All」で、Johnson SIを選択します。 このように、JMP は「フィッテッド ジョンソン SI」を評価するために「能力分析」に入力された情報を考慮しますか?
PS: 私のデータはトール (またはロング) 形式です。行は件名によって表されます。最初の列はタイムポイント (T1、T2、...) で、2 番目の列は OUT です。 [Fitted Johnson SI]==>[Save Transformed for each timepoints] をクリックすると、「Johnson SI Transform OUT by Timepoints」という同じ列に、それらの変換されたスコアが完成しました。 その後、「役割変数の選択」ボックスの「タイムポイントによるジョンソンSI変換出力」列と、「モデルの構築効果」の{タイムポイント、件名&ランダム、件名*タイムポイント&ランダム}を使用して、フィットモデルで統計分析を実行しようとしました。 " 箱、しかし、関連する結果は得られませんでした。
「Johnson SI Transform OUT by Timepoints」(変換されたデータ)列を取得したら、すぐにスクリプトを実行する必要があると思います。 私は正しいですか?
それが私の次の疑問です。解決策として説明されている手順を理解することです。 あなたの例を実行してみましたが、素晴らしかったです。 「変換されたデータから標準偏差を取得し、標準偏差 1、2、3 などの平均値の上下の値が何であるかを計算し、変換を元のデータに戻す」方法を学ぶ必要があります。
ご清聴と貴重なご支援をいただき、誠にありがとうございました。
Re: 正規分布と変換こんにちは、ジム ( @txnelson )、ご説明ありがとうございました!
次の問題があります。
1. 私の研究ケースでは、反復測定デザインを採用しているため、OUT と呼ばれる非正常な結果には異なる時点 (T1、T2、...) が含まれています。 したがって、「分析」==>「分布」を実行するときは、「選択した列をロールにキャスト」ダイアログで変数 OUT を「Y, Columns」として選択し、サブジェクト間 (タイムポイントなど) を「By」として選択する必要があると思います。 、そうじゃないですか?
2. これを実行すると、OUT 対 T1 などの各時点に対する OUT のプロットが得られます。 OUT対T2など。 JMP v.10 では、プロットを自動的に実行できないため、プロットごとに指示に従う必要があります。 大丈夫。 Distributions Timepoint=T1==>Stack を選択すると、すべてのプロットが横軸に表示されます。
疑問: 最初に「能力分析」を選択するべきでしょうか、それとも「継続的フィット ==> すべて? つまり、「能力分析」を選択すると、「仕様の下限」、「ターゲット」、「仕様の上限」というパラメータを入力するダイアログが表示されますが、どの値を定義する必要があるのかわかりません。 外れ値を除いた箱ひげ図に基づいていますか?
ありがとう。
Re: 正規分布と変換分布プラットフォームを使用すると、特定の列がどのような分布であるかを評価でき、データを正規分布に変換するメソッドを使用できる場合があります。手順は次のとおりです
1. 分散プラットフォームを実行し、目的の列を選択します。この例は、JMP のインストール時にインストールされる Semiconductor Capability サンプル データ テーブルからのものです。
分析==>分布
2. 出力が表示されたら、次から選択します。
継続的フィット==>すべて

3. プラットフォームは、データに最も適合する分布を順番に提供します。この場合、LogNormal が選択されます。残念ながら、LogNormal にはデータの変換バージョンを作成する機能がないため、選択を解除して Johnson SI を選択します。
4. ここで、「Fitted Johnson SI」の赤い三角をクリックし、「変換済みの保存」を選択します。

JMP は、データの変換されたバージョンを新しい列に保存しました。これを分析に使用できるようになりました。
Re: 正規分布と変換こんにちは、ジム ( @txnelson )、
JMP で非正規データを正規分布に変換する方法がわかりませんでした。 生の非正規データからの手順を説明していただけますか?
ありがとう。
Re: 正規分布と変換これは、変換されたデータのセットからの統計結果に基づいて値を返す完全なプログラムです。これがお役に立てば幸いです
Names Default to Here(1);
dt=New Table( "Test",
Add Rows( 100 ),
New Column("PNP3",
Numeric,
"Continuous",
Format( "Best", 10 ),
Set Values(
[130.378809500886, 132.736937590235, 136.831952164704, 136.969154239163,
136.622623419893, 137.480356512481, 138.094011176166, 142.10586919757,
134.750041237898, 129.719685093372, 136.520172900026, 134.778624216716,
136.991131754497, 140.420940666186, 143.257827228986, 132.213765487819,
144.671172276421, 134.703176752174, 136.744212473486, 137.187637284245,
139.788226018039, 139.372617199359, 136.112484488985, 142.809097034809,
137.799370430979, 138.482493403385, 135.236982575217, 136.251777781494,
130.768356509183, 138.248554728086, 139.77894292052, 134.25405167366,
147.680687116943, 131.351711991517, 132.84274608728, 129.925216236015,
133.47206414316, 143.339607103893, 145.341236691691, 139.200187547183,
142.775409342827, 140.276696563388, 130.623979847275, 140.899814366103,
136.839389290019, 137.239125319, 133.5265281641, 139.356927352471,
130.278640163464, 144.604061001983, 135.286715550332, 134.465744849174,
131.37612790407, 131.830655714309, 140.69724979219, 142.88152043774,
135.253839945611, 127.349434776131, 129.499730399113, 128.447533754611,
130.916853702805, 134.599575929218, 140.761701916093, 136.870661473033,
138.253066182015, 140.403627077024, 134.522643679098, 124.842978178703,
131.803059455053, 125.886786494664, 133.013566701611, 136.940299158936,
133.263913979648, 144.695171321015, 149.541020434399, 144.503845528521,
136.086324063453, 139.530943158798, 138.421460162451, 133.180943784947,
142.166796633818, 142.676541730822, 135.723943440339, 143.957996114985,
145.712158558794, 138.38937502716, 140.535304753392, 142.140619481175,
131.379414509756, 144.949299702964, 133.349854687882, 139.470639804255,
140.160558367008, 137.130662662612, 145.692632562344, 131.870848869966,
136.391733804566, 134.219740661271, 139.021827550389, 147.958038547157]
)
),
New Column( "Johnson Sl Transform PNP3",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Property( "Notes", "Fitted Johnson Sl" ),
Formula(
(Log( (:PNP3 - 44.6529505888426) / 1 ) * 15.3554291860315 + (
-69.5611150866502)) * 1
)
)
);
/***********************************************************************/
/* */
/* The getformula column retrieves the formula from the translation */
/* column and replaces the Original Column name in the formula with */
/* string "__value__". The value of this variable is what will be */
/* evaluated in the successive approximations done by the script. */
/* */
/***********************************************************************/
getformula = Function( {ColName, FormulaColName},
{ColName, FormulaColName, TheFormula, coloncolname},
//__value__ = .;
// Get the transformed data columns formula as a literal string
TheFormula=Column( FormulaColName ) << Get Formula ;
// Check to see that a formula was found
If( Is Empty( TheFormula ) == 1 ,
Dialog(
" The column specified as",
"the Transformed Column does",
" not contain a formula. ",
" ",
" Please rerun and select",
" the correct column"
);
Throw();
);
TheFormula=char( Column( FormulaColName ) << Get Formula );
// Get the actual name of the orignal column since
// the upper,lower case and spacing is critical in determining
// where in the formula the column name actually occurs
ColName = Column( ColName ) << Get Name;
// Determine if the reference to the column name in the
// formula is a simple :colname reference or a complex
// reference :Name(\!"colname\!")
// If the column name isn't found set the return code to -1
If(
Contains( TheFormula, ":" || ColName ), ColonColName = ":" || ColName, // Else
Contains( TheFormula, ":Name(\!"" || ColName || "\!")" ), ColonColName = ":Name(\!"" || ColName || "\!")", // Else
rc = -1
);
// Replace all of the column references in the formula with
// the string "(__value__)" so that when the formula is
// evaluated later, it will take the then value of the memory
// variable called __value__ and use it in the formula
If( Contains( TheFormula, ColonColName ) > 0,
While( Contains( TheFormula, ColonColName ) > 0, TheFormula = Munger( TheFormula, 1, ColonColName, "(__Value__)" ) ),
Dialog(
" The column specified as",
"the Transformed Column does",
" not contain a reference",
" to the original column.",
" in it's formula.",
" ",
" Please rerun and select",
" the correct column"
);
Throw();
);
TheFormula;
);
/***********************************************************************/
/* */
/* The gettrans function evaluates the formula in the transformed */
/* and converts the formula into a generic form for repeated use in */
/* running of the script. */
/* */
/***********************************************************************/
gettrans = Function( {ColName, FormulaColName, TheTarget, Theformula},
//colname="PNP3";formulacolname="Johnson Sl Transform PNP3"; Thetarget=johnsonmean;theformula=myformula;
{ColName, FormulaColName, TheFormula, High, Low, TheTarget, TheMax, Themin, __value__},
// The program uses successive approximations to determine the different
// parametrics. The way it works is that it calculates the needed parameter
// such as Mean, or Standard Deviation, and then by using successive
// approximations from the original column's values, and passing those
// values through the columns formula, when the approximation value matches
// the calculated value from the transformed column, the retransformed value
// has been found
// Set the extreem values
High = Col Maximum( If( Excluded( Row State( Empty() ) ) == 0, Column( ColName ), . ) );
Low = Col Minimum( If( Excluded( Row State( Empty() ) ) == 0, Column( ColName ), . ) );
// Make a guess at the first value
__value__ = Mean( High, Low );
// Iterate the guessing for up to 100 times, adjusting by 1/2 on each loop
For( i = 1, i <= 100, i++,
TheResult = Eval( Parse( theformula ) );
If(
TheResult > TheTarget, High = __value__,
TheResult < TheTarget, Low = __value__,
Break()
);
If( High == Low, Break() );
__value__ = Mean( High, Low );
);
__value__; // Expose the return value
); // End of function gettrans
myFormula = getformula( "PNP3","Johnson Sl Transform PNP3" );
JohnsonMean = Col Mean(dt:Johnson Sl Transform PNP3);
show(JohnsonMean,colMean(:PNP3),Gettrans("PNP3","Johnson Sl Transform PNP3",JohnsonMean,myFormula));
Re: 正規分布と変換共有してくれてありがとう。
私はスクリプトの初心者なので、現時点では少し複雑すぎて、使い方がわかりませんでした。
Re: 正規分布と変換これは実行中のシステムから抽出した、逐次近似を使用して解決された値を取得する関数です。
/***********************************************************************/
/* */
/* The getformula column retrieves the formula from the translation */
/* column and replaces the Original Column name in the formula with */
/* string "__value__". The value of this variable is what will be */
/* evaluated in the successive approximations done by the script. */
/* */
/***********************************************************************/
getformula = Function( {ColName, FormulaColName},
{ColName, FormulaColName, TheFormula, coloncolname},
//__value__ = .;
// Get the transformed data columns formula as a literal string
TheFormula=Column( FormulaColName ) << Get Formula ;
// Check to see that a formula was found
If( Is Empty( TheFormula ) == 1 ,
Dialog(
" The column specified as",
"the Transformed Column does",
" not contain a formula. ",
" ",
" Please rerun and select",
" the correct column"
);
Throw();
);
TheFormula=char( Column( FormulaColName ) << Get Formula );
// Get the actual name of the orignal column since
// the upper,lower case and spacing is critical in determining
// where in the formula the column name actually occurs
ColName = Column( ColName ) << Get Name;
// Determine if the reference to the column name in the
// formula is a simple :colname reference or a complex
// reference :Name(\!"colname\!")
// If the column name isn't found set the return code to -1
If(
Contains( TheFormula, ":" || ColName ), ColonColName = ":" || ColName, // Else
Contains( TheFormula, ":Name(\!"" || ColName || "\!")" ), ColonColName = ":Name(\!"" || ColName || "\!")", // Else
rc = -1
);
// Replace all of the column references in the formula with
// the string "(__value__)" so that when the formula is
// evaluated later, it will take the then value of the memory
// variable called __value__ and use it in the formula
If( Contains( TheFormula, ColonColName ) > 0,
While( Contains( TheFormula, ColonColName ) > 0, TheFormula = Munger( TheFormula, 1, ColonColName, "(__Value__)" ) ),
Dialog(
" The column specified as",
"the Transformed Column does",
" not contain a reference",
" to the original column.",
" in it's formula.",
" ",
" Please rerun and select",
" the correct column"
);
Throw();
);
TheFormula;
);
。
/***********************************************************************/
/* */
/* The gettrans function evaluates the formula in the transformed */
/* and converts the formula into a generic form for repeated use in */
/* running of the script. */
/* */
/***********************************************************************/
gettrans = Function( {ColName, FormulaColName, TheTarget, Theformula},
{ColName, FormulaColName, TheFormula, High, Low, TheTarget, TheMax, Themin, __value__},
// The program uses successive approximations to determine the different
// parametrics. The way it works is that it calculates the needed parameter
// such as Mean, or Standard Deviation, and then by using successive
// approximations from the original column's values, and passing those
// values through the columns formula, when the approximation value matches
// the calculated value from the transformed column, the retransformed value
// has been found
// Set the extreem values
High = Col Maximum( If( Excluded( Row State( Empty() ) ) == 0, Column( ColName ), . ) );
Low = Col Minimum( If( Excluded( Row State( Empty() ) ) == 0, Column( ColName ), . ) );
Highm = 999999999999999999999999;
Lowm = -999999999999999999999999;
If( Highm > High,
High = Highm
);
If( Lowm < Low, low = lowm );
// Make a guess at the first value
__value__ = Mean( High, Low );
// Iterate the guessing for up to 100 times, adjusting by 1/2 on each loop
For( i = 1, i <= 100, i++,
TheResult = Eval( Parse( theformula ) );
If(
TheResult > TheTarget, High = __value__,
TheResult < TheTarget, Low = __value__,
Break()
);
If( High == Low, Break() );
__value__ = Mean( High, Low );
);
__value__; // Expose the return value
); // End of function gettrans
Re: 正規分布と変換こんにちは、ジムさん
私も同じ問題を抱えています。 いくつかの Johnson Si 変換データをモデル化し、予測モデルを取得しました。 逆関数を使用して予測データを逆変換しようとしましたが、うまくいきません。 これを行うためのスクリプトの作成についてさらに詳しいガイダンスを提供していただけますか? DOE 実験からの応答をモデル化するときにこの種の分布に頻繁に遭遇するため、データを転送して戻す方法を知っておくと非常に役立ちます。
どうもありがとう!
クリステル
Re: 正規分布と変換あなたの質問の要点を逸脱していると思います。 確率に基づいて「バンド」を計算する場合、これらのバンドの位置は分布のタイプによって異なります。 あなたの数字68-95-99.7 は標準偏差ではありませんが、正規分布に基づく平均からの 1、2、3 標準偏差の距離に基づく「バンド」に関連付けられた確率です。 正規分布がない場合、問題は標準偏差の計算ではなく、確率への変換にあります。 +/- 3 の標準偏差バンドが必要な場合は、分布が正規分布であるか、少なくとも対称であると仮定します。 やりたいことに応じて、非対称バンドを計算するか (JMP には正規分布だけでなくすべての分布の確率分布があります)、データを正規化するための変換を実行する必要があります (その後、常に逆変換を実行します)。自然メトリクスに変換し直したい場合)。 私の好みは、非対称バンドを使用し、JOHNSON SU 関数を使用して計算することです。
オンラインヘルプ
Re: 正規分布と変換ジムさん、返信ありがとうございます! これを試してみます。Re: 正規分布と変換これが私がやることです。 変換されたデータ値に基づいて元のデータに制限を設定するには、変換されたデータから標準偏差を取得し、1、2、3 などの平均値の上下の値を計算し、標準偏差を逆にします。元のデータに戻す変換。 Johnson SU などの場合によっては、値を元の変換に戻す簡単な方法がありません。そこで私が行うのは、元の変換に値を渡し、ターゲットの std の値をチェックする小さなスクリプトを実行することです。 、一致する値が見つかるまで値を繰り返します。 次に、変換すると、変換された値の目標値となる元のデータの値が見つかりました。 これを行うと、元のデータの平均より上の距離と下の距離は同じではなくなることに注意してください。Re: 正規分布と変換ああ、標準偏差は重要だと思いましたが。 たとえば、68-95-99.7 (標準偏差 3 つ) ルールは、正規分布の平均の周囲の帯域内の値を見つけるために使用されます。 ただし、データが正常でない場合、これを使用する意味がない可能性があります。 たとえば、トランジスタのオン抵抗が正常ではなく、平均から 3 標準偏差の値を知りたい場合、実際には意味をなさない負の値または非常に低い値が表示される可能性があります。 。
何か混乱したり誤解している場合は申し訳ありません。私は大学以来再び統計の学習を始めたところです。
Re: 正規分布と変換ありがとう、どうやってそうなったかわかりました。 データが正規であることがわかりました。これをどのように使用して標準偏差を見つけることができますか? 要約統計量には、変換に基づいて意味のある値が記載されていますが、元のデータの標準偏差が何であるかを知りたいです。 おそらくデータを変換する目的を理解していません。
Re: 正規分布と変換ナタリー
分散と標準偏差の公式は、分布の形状については何も仮定しません。 これは単なる代数です (平均値の計算では分布の種類について何の仮定も行わないのと同じです)。
Re: 正規分布と変換ナタリー、
変換を新しい列に保存するだけで、その列で分散を実行できるはずです。
ジム
正規分布と変換についてこんにちは、デイビッドさん、皆さん。
私は JMP を初めて使用しており、データ変換について疑問に思っています。
正規分布を得るためにデータ変換と比較してデータフィッティングを使用する場合の利点と欠点は何ですか?
また、変換後に適切な p 値が得られない場合、変換を考慮する必要がありますか?
ありがとう
正規分布と変換についてKowa さん、まずはコミュニティへようこそ。このフォーラムではあなたの質問に十分に答えることができません。ここから始めることをお勧めします:
https://www.ime.usp.br/~abe/lista/pdfQWaCMboK68.pdf
変革を行う主な理由は 2 つあります。
1. 平均 0 および同意分散 (NID(0, 分散)) で残差が正規分布し独立に分布するという定量的な仮定を満たします。これらの仮定が満たされない場合は、提案されたモデルに疑問を抱く必要があります。
2. 何年も前にボックス博士が私に言ったように、変換する唯一の理由はモデルを単純化すること、つまり本質的にモデルをより使いやすくすることです。