行列の使用

このデモンストレーションでは、行列の使い方をいくつか紹介します。コースジャーナルの「硬化時間データ」セクションをクリックします。各日付の平均硬化時間を求めるとします。各行の硬化時間の値をすべて合計し、サンプル数で割ります。この計算には行列を使用します。繰り返しますが、ベクトル化された演算によって計算がより効率的になります。コースジャーナルに戻ると、「行列を使った統計計算」というスクリプトが既に作成されています。これを移動して、硬化時間テーブル(もう少し幅を広げます)とスクリプトの両方を確認できるようにします。スクリプトはまずsという変数を作成します。sにはJ関数の結果が格納されます。J関数は、指定された行数、指定された列数、そして初期値を持つ行列を作成します。今回はNrow関数を引数なしで使用しています。現在のデータテーブルの行数を確認します。次の行を実行します。ログを見ると、sに格納されているのはゼロの列ベクトルであることがわかります。これを使って、各硬化時間の値をその場で加算します。ここではforループを使用しています。硬化時間データでは2列目から開始したいので、cをequalsで初期化します。cが列数以下であることをテストします。繰り返しますが、特に大きなデータテーブルを扱う場合は、このカウントをforループの外で行い、結果を変数に格納して、cをその変数と比較するのがベストプラクティスです。次に、パーサーはforループの本体を評価します。まず、assign関数の右側を見てください。まず、get as matrices to columnというメッセージを列に送信し、それをsにその場で加算します。次に、後置インクリメント演算子を使ってcを更新します。これでcに1が加算されます。 c が列数以下であることを確認します。列を行列として取得し、それを s に追加します。次に、行を実行します。for 関数はログに欠損値を返すことに注意してください。s にマウスを移動すると、5 つの硬化時間列の合計というかなり大きな数値が含まれていることがわかります。最後に、現在のデータ テーブルに新しい列メッセージとしてメッセージを送信します。新しい列のタイトルは Average になります。値については、設定値または値のいずれかになりますが、実際に計算を行います。ここでも、最初に値を格納する変数を作成しなくても、値引数に関数を指定できます。ここでは関数として、割り算関数と減算関数を指定しています。硬化時間列の合計である s を c マイナスで割っています。c を数え始めたのは からなので、c マイナスで割ることになります。つまり、合計した項目の数から 1 が減ることになります。そしてもちろん、c はテストを超えて増加しなければなりません。つまり、テストに失敗するはずです。つまり、c の最終的な値は、マウスをポイントすると次のようになります。しかし、実際には加算しただけです。そのため、c マイナスで割るのです。それでは、この最後の行を実行してみましょう。硬化時間データ テーブルに Average 列が作成されていることがわかります。ログに示されているように、列オブジェクトのインスタンスを作成したことがわかります。実際、その列をさらに操作したい場合は、行の行にあるすべての結果を変数に割り当てることができます。さて、デモンストレーションの次のステップでは、すべての硬化時間データを一度に操作して計算を実行します。先ほど作成したスクリプトのように列ごとに抽出するのではなく、データテーブル全体をマトリックスとして抽出します。その前に、先ほど作成した列を削除しておきます。スクリプトエディタウィンドウの内容全体を選択します。そして、現在のデータテーブルにメッセージを送信します。「列を削除」です。削除したい列は「平均」です。繰り返しになりますが、現在のデータテーブルの使用は、テストやプレゼンテーションの際に非常に便利です。実際のスクリプトでは、テーブルへのより明示的な参照を使用する必要があります。スクリプトの練習や動作確認のテストなどには、現在のデータテーブルが便利です。しかし、実際には、JMPのバージョンを超えて、また複数の使用状況にわたってスクリプトを展開または使用し、維持管理する予定の場合は、現在のデータテーブルではなく、明示的なデータテーブル参照を使用する必要があります。それでは、これを実行してみましょう。これで、削除したかった列が削除されました。スクリプト可能なメッセージがログに返されました。では、スクリプトエディタウィンドウの内容をクリアしましょう。データテーブル全体を行列として抽出し、変数mに格納します。mには、現在のデータテーブルにメッセージを送信した結果が割り当てられます。そのメッセージはget as matrixです。これを実行します。ログ、あるいはmにマウスオーバーすると、この行列が作成されたことがわかります。最初の列は非常に大きな数値です。これは、get as matrixをデータテーブルに送信すると、すべての数値列が取り出されるためです。これには日付も含まれます。つまり、ここでは日付が数値として扱われています。モデリングタイプアイコンでわかるように、連続値です。データ型は数値である必要があります。実際には、これを幅広にすると、日付に文字が含まれているように見えますが、これは単なる書式設定です。数値なので、右揃えになっています。行列からその値も抽出します。そして、Cure Time の計算を行いたい場合(実際、私が行いたい計算は最小値と最大値を求めることです)、その日の大きな値を行列に残したくありません。そこで、新しい行に進みます。そして、慎重に作業を進めます。既にウィンドウに入力したコードは、この処理を進める間も表示させたままにしておきたいのですが、全体を最初から実行したくはありません。ですから、1行ずつ実行するように細心の注意を払います。最初の列を削除するには、変数 m を使い、0 と 1 を添え字として付けます。覚えていると思いますが、添え字は特定の行を選択しないという意味です。つまり、最初の列のすべての行を取得するということです。そして、そこに空の行列、つまり何も入っていない角括弧だけを代入します。もう一度言いますが、その1行だけを実行するには、その行をハイライト表示し、スクリプト全体を実行するのと同じ方法を使用できます。ただし、選択またはハイライト表示された部分のみが実行されます。または、標準のデスクトップキーボードのテンキーであれば、右端にあるEnterキーを使用できます。ログに返されるのは空のマトリックスだけです。ここでmにマウスポインターを合わせるか、mをハイライト表示して実行すると、硬化時間の値だけになっていることがわかります。最初の列の大きな日付の数字は削除されました。新しい行に移動して、使用できる他のマトリックス関数をいくつか見てみましょう。変数aを作成し、loc関数LOCの結果を割り当てます。そして、この行列 m の中で、値がより大きい位置を探します。この行を実行すると、行列 m を行ベクトルとして扱い、最初の位置から数えていき、行列内の要素のうち、値がより大きいすべての要素の位置、つまり単一の添字位置を返します。ここで、実際の値が必要な場合は、avals という変数を作成します。そして、m に格納されている行列を変数 a で添字付けした結果に署名します。そして、この行を実行します。そして、を超える実際の硬化時間の値があります。もちろん、このスクリプトを効率化するために、これらすべての値の位置を格納する必要がなければ、loc 関数を使って行列 m の添字付け (これをコピーします) を行うだけで済みます。位置を格納してそれを使用するという余分な手順は不要です。ただし、この例で最初に a に格納した位置を使用する他の理由がある場合は別です。次に、この行列を使って変換後の値を計算します。この変換では、各観測値からテーブル全体の最小値を引いた値を、最大値から最小値までの範囲で割り、それを で乗算します。つまり、各観測値における最小硬化時間からの距離を、範囲の割合として計算するようなものです。これは、行列を扱うことのもう1つの利点を示しています。データテーブル全体の最小値を見つけるには、スクリプトを作成する場合でもインタラクティブに操作する場合でも、データテーブル内の個々の列を操作すると、最小値または最大値を見つけるのに多くの手順が必要になります。しかし、行列を使えば、非常に短い1行のコードでそれを実行できます。スクリプトエディタウィンドウで(ここで内容をクリアしておきます)、minCT(最小硬化時間)という変数を作成し、min関数の引数mの値を使って結果を代入します。そして、その行を実行します。最小値は…です。それから変数maxCTも作成します。そして、引数mを指定したmax関数の結果を代入します。そして、この行だけを実行します。これで、これらの変数をこの変換の計算に使用できます。変換値を格納する変数tを作成します。新しい行に進みます。tにtimesの結果が代入され、分子mからminCTを引く値として開き括弧が付きます。そして、割り算の記号として閉じ括弧が付き、分母maxCTからminCTを引く値として開き括弧が付きます。この行だけを実行すると、これらの変換値が得られます。各観測値から最小値を引いた値が、硬化時間値の範囲の割合として表されます。これは小数点以下の桁数が非常に多いです。実際にはそれほど精度は高くありません。そこで、これらの値を実際に丸めることができます。また新しい行に進みます。tの値を上書きするために、round関数の結果をtに代入します。元の値を保持したい場合は、新しい変数でこれを行うこともできます。しかし、ここではtと入力し、代入演算子であるround関数を使用します。引数はまず、何を丸めるかです。tに格納されている値を丸めます。次に、小数点以下何桁にするかです。0にしたいです。ここで、マトリックス内の値を切り捨てます。これは、データ列をフォーマットして小数点以下0桁にし、その値がバックグラウンドでそのまま保存されるようにするのとは異なります。つまり、ここではフォーマットではなく、値を切り捨てているのです。さあ、これを実行してみましょう。これで、変換後の値の整数値が得られました。これらの値を硬化時間データテーブルに戻したい場合は、マトリックスをループ処理して新しい列を作成できます。完全に新しいデータテーブルを作成したい場合は、as tableという非常にシンプルな関数があります。テーブル名と列名を指定するためのオプション引数があります。このデモでは、変数tをas tableの引数として使うことで、シンプルにしています。実行すると、一般的な列名が付いた無題のテーブルが表示されます。しかし、このテーブルには変換行列から取得したすべての値が入力されています。また、名前と列見出しはas table引数の一部として指定できます。あるいは、スクリプトを使って後から変更することも可能です。ここまで、データテーブルから数値を抽出するいくつかの方法を見てきました。列ごと、またはデータテーブル全体、すべての数値列、データテーブル全体、そして行列を使った操作について見てきました。