Agent API (window.midas)
AI エージェントや Playwright などの外部ツールから MIDAS をプログラムで操作するための API です。
- 概要
- 使い方
- レスポンス形式
- データモデル
- メソッド一覧: status / project / datasets / enums / tabs / models / reports / layout
- エラーコード
概要
window.midas は、ブラウザの DevTools コンソールや Playwright などの自動化ツールから MIDAS の機能にアクセスするための JavaScript API です。データセットの操作、タブの管理、統計モデルの実行、レポートの編集などを行えます。
API が利用可能なタイミング
- プロジェクト画面: すべてのメソッドが利用可能
- ランチャー画面:
help()と、プロジェクトを開く・新規作成するメソッド(project.openFile()、project.openUrl()、project.createFromCsv()、project.createFromCsvUrl()、project.openSample()、project.listSamples()、project.createEmpty())が利用可能。他のメソッドはNO_PROJECTエラーを返す
Playwright で自動化する場合は、これらのメソッドでプロジェクトを開くか新規作成してから他の API メソッドを使用してください。
AI エージェント向けクイックスタート
status()でプロジェクトの状態を確認します(データセット数、タブ数、モデル数)datasets.list()とdatasets.describe(id)でデータの構成を把握します- データモデルで永続化、データセットの種類、グラフ仕様の構造を理解します
- 目的に応じてメソッド一覧から操作を選びます
使い方
DevTools コンソールから使う
ブラウザの DevTools を開き、コンソールで直接呼び出します。
// プロジェクトの状態を確認
const result = await window.midas.status();
console.log(result.data);
// { datasets: 3, tabs: 2, models: 1, ... }
Playwright から使う
const result = await page.evaluate(async () => {
return await window.midas.datasets.list();
});
console.log(result.data);
// [{ id: '...', name: 'Iris', rows: 150, columns: 5, type: 'primary' }, ...]
ヘルプを表示する
help() メソッドで、利用可能なメソッド名の一覧を確認できます。メソッド名を渡すと、そのメソッドの詳細を返します。詳細は description(目的と挙動)、signature、params(引数ごとの説明。ネストした引数は options.limit のようにドット区切りで示す)、returns(戻り値の構造)、errors(固有のエラーコードで返る失敗と、その条件)、example を持ちます。戻り値には documentation フィールドがあり、このページの URL が含まれます。
const help = window.midas.help();
console.log(help.methods); // ["help(methodName?)", "status()", ...]
console.log(help.documentation); // "https://midas-app.org/docs/en/agent-api.md"
const detail = window.midas.help('datasets.query');
console.log(detail.signature);
console.log(detail.params); // [{ name: "sql", description: "..." }, { name: "options.limit", ... }, ...]
console.log(detail.errors); // [{ code: "SQL_PARSE_ERROR", when: "..." }, ...]
レスポンス形式
help() を除くすべてのメソッドは非同期で、APIResult<T> 型の統一されたレスポンスを返します。help() のみ同期メソッドで、メソッド名の一覧、またはメソッド名を指定した場合はそのメソッドの詳細を直接返します。ただし MIDAS 内部の不変条件の違反(assert 違反)は入力の誤りではなく MIDAS の不具合なので、メソッドは失敗のレスポンスを返さず、Promise を例外で reject します。
// 成功時
{
success: true,
message: "Found 3 datasets",
data: [...]
}
// 失敗時
{
success: false,
message: "Dataset not found",
error: {
code: "DATASET_NOT_FOUND",
message: "No dataset with ID 'abc'",
suggestion: "Use datasets.list() to see available datasets"
}
}
warnings フィールドが含まれる場合もあります。処理自体は成功していますが、注意が必要な点を示します。たとえば models.run() ではデータ準備段階の警告がトップレベルの warnings に、モデル実行時の警告が data.warnings に格納されます。
データセットを作る datasets.* は、評価の過程で値が null になった場合にその件数を列ごとに warnings へ載せます。対象は、型変換に失敗した値、表せる範囲(西暦 1〜9999 年)を超えた日付、64 ビット整数の範囲を超えた整数、計算が返した非有限値と空文字列です。非有限値はゼロ除算による ±Infinity や による NaN などです。MIDAS は非有限値と空文字列を値として保持せず欠損値にします。同じ内容は画面の通知にも表示されます。
// warnings を含む成功レスポンスの例
{
success: true,
message: "Model run completed",
warnings: ["3 rows with missing values were excluded from analysis"],
data: {
runId: '...',
warnings: ["Convergence achieved but Hessian is nearly singular"],
...
}
}
データモデル
API を使う前に、MIDAS がデータをどう管理しているかを把握しておくと操作の見通しが立ちやすくなります。
永続化
API の操作はメモリ上のプロジェクト状態を変更します。ブラウザストレージへの書き込みは project.save() を呼んだときだけ行われます。save() を呼ばずにページをリロードすると、そのセッションの変更はすべて失われます。
プロジェクトを新しく作るメソッドはこの例外です。project.createFromCsv()、project.createFromCsvUrl()、project.openSample()、project.createEmpty() は、作成したプロジェクトをブラウザストレージへ自動で書き込みます。書き込みはプロジェクトを開いたあとに始まるので、メソッドが返った時点では終わっていないことがあります。書き込みが済んだことを確認してから次へ進みたい場合は、続けて project.save() を呼びます。
// データセットのスキーマを変更
await window.midas.datasets.setColumnSchema('ds_001', { ... });
// この時点ではメモリ上だけに反映されている
await window.midas.project.save();
// ブラウザストレージに書き込まれた
DataSet の種類
datasets.list() が返すデータセットには 2 つの種類があります。
Primary — CSV などからインポートした元データです。データ本体をプロジェクトファイル内に保持します。
Derived — SQL やクロス集計などの変換操作から作成されたデータです。データ本体ではなく操作の定義(どの SQL を実行したか等)をプロジェクトファイルに保存します。データはキャッシュであり、既定ではプロジェクトファイルに含まれません。プロジェクトを開いたあと操作を再実行して再計算されるため、親を参照する派生ではその時点の親データが反映されます。計算結果をプロジェクトファイルに保存する設定はデータセットを参照してください。この設定は datasets.setSaveDataWithProject() で切り替えます。parentIds で親への依存関係を確認できます。
const result = await window.midas.datasets.list();
// [
// { id: 'ds_001', name: 'Sales', type: 'primary', ... },
// { id: 'derived_001', name: 'Monthly Total', type: 'derived', parentIds: ['ds_001'], ... }
// ]
これら以外に、MIDAS が内部のレンダリング用に一時的に作成する Ephemeral DataSet がありますが、datasets.list() には含まれません。ephemeral データセットの ID を直接指定してデータセットを受け取る API(models.run、datasets.describe・fetch、tabs.open・setDataset、reports.addDataTable・addGraph など)に渡すと INVALID_INPUT エラーになります。
レポート要素のライフサイクル
レポートは 2 つの部品で構成されます。Markdown テキストの content と、グラフやモデルサマリーなどの elements です。content の中に {{graph_builder:element_001}} のような参照を書くと、その位置に対応する要素が描画されます。
reports.addGraph() や reports.addModelSummary() は要素の作成と content への参照挿入を一度に行います。reports.removeElement() は要素と content 内の参照を同時に除去します。
モデルやデータセットを削除すると、それに依存するレポート要素は自動的に除去されます。手動で掃除する必要はありません。
グラフ仕様の構造
Custom Graph の設定は、グラフレベルとレイヤーの 2 層に分かれています。マルチパネル構成ではその間にパネルの層が入ります。
グラフレベル — データソース、座標系(coordinates)、ファセット(facets)、軸スケール(scales)、ブラシ選択の方向(brush)など、グラフ全体に関わる設定です。tabs.configureGraph() や reports.addGraph() で指定します。
パネル — マルチパネル構成(panels)でだけ現れる層です。複数のパネルを縦に並べて X 軸を共有し、各パネルが自分のレイヤー(layers)、Y 軸スケール(yScale)、高さの比率(heightRatio)、名前(name)を持ちます。マルチパネル構成では各パネルのレイヤーだけが描画され、グラフレベルの layers と facets は使われません。設定方法は tabs.configureGraph() の panels を参照してください。
レイヤー — 幾何要素(geom: 散布図の点、折れ線など)、統計変換(stats)、aesthetic mapping(aes: どの列を X 軸・色・サイズに対応させるか)を組み合わせた描画単位です。1 つのグラフに複数のレイヤーを重ねられます。tabs.addGraphLayer() で追加します。各レイヤーは scales で aesthetic ごとのスケールを個別に設定できます。
グラフレベルの globalAes は全レイヤーの既定値になり、各レイヤーの aes で上書きできます。
設定の詳細は Custom Graph と Custom Graph Reference を参照してください。
メソッド一覧
status()
プロジェクトの状態を取得します。
const result = await window.midas.status();
// result.data:
// {
// datasets: 3,
// derivedDatasets: 1,
// tabs: 2,
// models: 1,
// reports: 1,
// activeDatasetId: 'ds_001',
// activeTabId: 'tab_001'
// }
activeTabId はアクティブなペインで前面に表示されているタブの ID です。そのペインにタブがなければ null になります。
project
project.save()
プロジェクトをブラウザストレージに保存します。保存先の詳細はプライバシーとセキュリティを参照してください。
await window.midas.project.save();
サンドボックスモード(デモやトライアルなど、永続化が無効なプロジェクト)では SANDBOX_MODE エラーを返します。保存では、MDS ファイル形式の Parquet ファイルに行データを DuckDB で書くため、DuckDB を起動できない状態では INTERNAL_ERROR エラーを返します。
project.exportMds()
プロジェクトを MDS(MIDAS のプロジェクトファイル形式)バイナリとしてエクスポートします。エクスポートされたデータは ArrayBuffer として返されます。エクスポートには署名鍵が必要です。鍵が未設定の場合は NO_SIGNING_KEY エラーを返すので、Settings の Signing Keys で鍵を作成してください。署名してエクスポートするときは行データの Parquet ファイルを DuckDB で書くため、DuckDB を起動できない状態では INTERNAL_ERROR エラーを返します。未編集のファイルを原本のまま書き出す場合は Parquet ファイルを書かないので、このエラーは起きません。
const result = await window.midas.project.exportMds();
// result.data: { data: ArrayBuffer, size: 12345, suggestedFilename: 'MyProject.mds' }
project.downloadMds()
プロジェクトを MDS ファイルとしてブラウザからダウンロードします。exportMds() と同じく、鍵が未設定の場合は NO_SIGNING_KEY エラーを返し、署名が必要で DuckDB を起動できない場合は INTERNAL_ERROR エラーを返します。
const result = await window.midas.project.downloadMds();
// result.data: { filename: 'MyProject.mds' }
project.openFile(data, options?)
MDS バイナリデータ(Uint8Array)からプロジェクトを開きます。ランチャー画面でも実行できます。
const buf = await fetch('/project.mds').then(r => r.arrayBuffer());
const result = await window.midas.project.openFile(new Uint8Array(buf));
// result.data: { projectId: 'project-xxx' }
オプション:
sandbox(boolean, デフォルト:false) —trueの場合、新しい ID を振ってブラウザストレージへの保存をスキップしますonDuplicate('overwrite'|'copy', デフォルト:'overwrite') — 同一 ID のプロジェクトがブラウザストレージに存在する場合の挙動を指定します。'overwrite'は既存を上書きし、'copy'は重複時のみ新しい ID を割り当てます
現在のプロジェクトに未保存の変更がある場合、確認ダイアログが表示されます。ユーザーがキャンセルすると USER_CANCELLED を返します。署名警告はダイアログを表示せず、戻り値の warnings 配列で通知します。
project.openUrl(url, options?)
URL から MDS ファイルをフェッチしてプロジェクトを開きます。常にサンドボックスモードで開かれます(ブラウザストレージには保存されません)。ランチャー画面でも実行できます。
const result = await window.midas.project.openUrl('https://example.com/project.mds');
// result.data: { projectId: 'project-xxx' }
オプション:
signal(AbortSignal) — フェッチの中断に使用します
現在のプロジェクトに未保存の変更がある場合、確認ダイアログが表示されます。ユーザーがキャンセルすると USER_CANCELLED を返します。署名警告はダイアログを表示せず、戻り値の warnings 配列で通知します。
URL のバリデーションとセキュリティ制限は datasets.importFromURL() と同じです。プロトコルは HTTP/HTTPS のみ許可され、クラウドメタデータエンドポイントへのアクセスはブロックされます。ブロックされた URL には INVALID_INPUT エラーを返します。信頼済み URL リストに含まれない URL に対しては警告が warnings に含まれ、設定で「信頼されていないドメインへの接続をブロック」を有効にしている場合はエラーになります。サイズ警告閾値(デフォルト 10 MB、Settings で変更可能)を超えるファイルは開かれますが、サイズ警告が warnings に含まれます。詳細は プライバシーとセキュリティ を参照してください。ネットワークエラー・タイムアウト・signal による中断のいずれの場合も FETCH_ERROR を返します。
project.createFromCsv(data, options?)
CSV/TSV バイナリデータ(ArrayBuffer または Uint8Array などの TypedArray)から新規プロジェクトを作成します。データをパースして列型を検出し、プロジェクトを開きます。ブラウザストレージへの保存はプロジェクトを開いたあとに行うため、このメソッドが返った時点ではまだ保存が終わっていないことがあります。ランチャー画面でも実行できます。
const csv = new TextEncoder().encode('x,y\n1,2\n3,4');
const result = await window.midas.project.createFromCsv(csv, { name: 'My Data' });
// result.data: { projectId: 'project-xxx', datasetId: 'dataset_...', sourceDatasetId: 'dataset_...' }
戻り値の datasetId は作成されたデータセットの ID です。datasets.importFromBuffer() の id と同じ意味で、型変換されたデータセットが作られた場合はその ID を指します。型変換されたデータセットが作られた場合のみ、全列 string の元データセットの ID が sourceDatasetId に入ります。
オプション:
name(string, デフォルト:"Untitled") — データセット名を指定します。プロジェクト名にもなりますhasHeader(boolean, デフォルト:true) — 先頭行をヘッダーとして扱うかを指定しますencoding("utf-8"|"shift_jis"|"euc-jp") — 文字エンコーディングを指定します。省略時はバイト列から自動判定しますdelimiter(","|"\t"|";"|"|", デフォルト:",") — 区切り文字を指定します。TSV のデータを渡すときは"\t"を指定します
現在のプロジェクトに未保存の変更がある場合、確認ダイアログが表示されます。ユーザーがキャンセルすると USER_CANCELLED を返します。
project.createFromCsvUrl(url, options?)
URL から CSV/TSV ファイルをフェッチして新規プロジェクトを作成します。プロジェクトを開いたあとにブラウザストレージへ保存するため、このメソッドが返った時点ではまだ保存が終わっていないことがあります。ランチャー画面でも実行できます。
const result = await window.midas.project.createFromCsvUrl('https://example.com/data.csv');
// result.data: { projectId: 'project-xxx', datasetId: 'dataset_...', sourceDatasetId: 'dataset_...' }
戻り値の datasetId と sourceDatasetId の意味は project.createFromCsv() と同じです。
オプション:
name(string) — データセット名を指定します。省略時は URL から推測します。プロジェクト名にもなりますhasHeader(boolean, デフォルト:true) — 先頭行をヘッダーとして扱うかを指定しますencoding("utf-8"|"shift_jis"|"euc-jp") — 文字エンコーディングを指定します。省略時は Content-Type ヘッダの charset とバイト列から自動判定しますdelimiter(","|"\t"|";"|"|") — 区切り文字を指定します。省略時は URL のファイル名の拡張子で決まり、.tsvと.txtはタブ、それ以外はカンマですsignal(AbortSignal) — フェッチの中断に使用します
現在のプロジェクトに未保存の変更がある場合、確認ダイアログが表示されます。ユーザーがキャンセルすると USER_CANCELLED を返します。URL のバリデーションとセキュリティ制限は datasets.importFromURL() と同じです。ネットワークエラー・タイムアウト・signal による中断の場合は FETCH_ERROR を返します。
project.openSample(sampleId)
組み込みのサンプルデータセットから新規プロジェクトを作成します。プロジェクトは Sample: {name} の名前で開かれます。ブラウザストレージへの保存はプロジェクトを開いたあとに行うため、このメソッドが返った時点ではまだ保存が終わっていないことがあります。ランチャー画面でも実行できます。
const result = await window.midas.project.openSample('penguins');
// result.data: { projectId: 'project-xxx' }
未知のサンプル id には、有効な id の一覧を含む INVALID_INPUT エラーを返します。現在のプロジェクトに未保存の変更がある場合、確認ダイアログが表示されます。ユーザーがキャンセルすると USER_CANCELLED を返します。サンプルデータの取得に失敗した場合は FETCH_ERROR を返します。
project.listSamples()
project.openSample() で使える組み込みサンプルデータセットの一覧を取得します。ランチャー画面でも実行できます。
const result = await window.midas.project.listSamples();
// result.data: { samples: [{ id: 'penguins', name: 'Palmer Penguins', rows: 344, columns: 8,
// purpose: 'Classification, visualization', recommended: true }, ...] }
project.createEmpty(name?)
データセットを持たない新規プロジェクトを作成し、Project Overview タブを開いた状態で開きます。ランチャーの New Empty Project と同じ経路です。データセットは、datasets.create()、datasets.generateSynthetic()、datasets.importFromBuffer()、datasets.importFromURL() であとから追加します。ブラウザストレージへの保存はプロジェクトを開いたあとに行うため、このメソッドが返った時点ではまだ保存が終わっていないことがあります。ランチャー画面でも実行できます。
const result = await window.midas.project.createEmpty('Design Study');
// result.data: { projectId: 'project-xxx' }
引数 name (string, デフォルト: "Untitled Project") はプロジェクト名です。文字列でない値や空文字列を渡すと INVALID_INPUT を返します。現在のプロジェクトに未保存の変更がある場合、確認ダイアログが表示されます。ユーザーがキャンセルすると USER_CANCELLED を返します。
datasets
datasets.list()
プロジェクト内のデータセット一覧を取得します。
const result = await window.midas.datasets.list();
// result.data: [{ id, name, rows, columns, type, parentIds?, saveDataWithProject? }, ...]
type は 'primary'(読み込んだデータ)または 'derived'(SQL やその他の操作で作成)のいずれかです。parentIds は派生データセットが依存する元データセットの ID です。どのデータセットも参照しない SQL(generate_series など)から作成した派生データセットでは空配列になります。saveDataWithProject は派生データセットだけが持ち、計算結果をプロジェクトファイルに保存する設定が有効かどうかを示します。設定は datasets.setSaveDataWithProject() で切り替えます。一時的な内部データセット(ephemeral)は一覧に含まれません。
datasets.describe(id)
データセットの詳細情報を取得します。データセット ID またはデータセット名(大文字小文字を区別しない)を指定できます。
const result = await window.midas.datasets.describe('Iris');
// result.data:
// {
// id: 'ds_001',
// name: 'Iris',
// type: 'primary',
// rowCount: 150,
// columns: [
// { id: 'col_001', name: 'sepal_length', type: 'float64', scale: 'ratio' },
// { id: 'col_002', name: 'species', type: 'enum', scale: 'nominal', enumName: 'species_enum' },
// ...
// ]
// }
columns の各要素には id、name、type が含まれます。scale、enumName、displayFormat はオプショナルです。enumName は列の型が enum の場合に、対応する enum 定義の名前を返します。displayFormat は datasets.setColumnDisplayFormat() で設定した表示形式で、設定がない列では返しません。MIDAS が内部で追加する行番号列(Row #)は columns に含まれません。columns の数は datasets.list() の columns と一致します。
操作を編集できる派生データセットでは、データセットを計算する操作の定義を operation で返します。編集できる操作の種別は tabs.open() の editingDatasetId の表に挙げたものです。operation はプロジェクトが保存している形のままなので、フィールドは operation.type ごとに異なります。たとえば datasets.derive() で作ったデータセットの operation は type: 'sql_query' で、SQL を query に持ちます。primary データセットと、モデルから保存したデータセットのように操作を編集できない派生データセットは operation を返しません。
派生データセットでは、計算結果をプロジェクトファイルに保存する設定が有効かどうかを saveDataWithProject で返します。primary データセットは saveDataWithProject を返しません。
datasets.profile(id)
データセットの各列について基本統計量を返します。データセット ID またはデータセット名(大文字小文字を区別しない)を指定できます。まだ評価されていない派生データセットは、評価してから読みます。保存済みプロジェクトを開いた直後や、依存元のデータセットを上書きした直後がこれに当たります。
const result = await window.midas.datasets.profile('Iris');
// result.data:
// {
// id: 'ds_001',
// name: 'Iris',
// rowCount: 150,
// columns: [
// {
// name: 'sepal_length', type: 'float64', scale: 'ratio',
// nullCount: 0, uniqueCount: 35,
// min: 4.3, max: 7.9, mean: 5.843, median: 5.8, sd: 0.828
// },
// {
// name: 'species', type: 'string', scale: 'nominal',
// nullCount: 0, uniqueCount: 3,
// topValues: [
// { value: 'setosa', count: 50 },
// { value: 'versicolor', count: 50 },
// { value: 'virginica', count: 50 }
// ]
// },
// ...
// ]
// }
全列に nullCount と uniqueCount が含まれます。uniqueCount は null 以外の全ユニーク値数です。数値列(int64、float64)には min、max、mean、median、sd(標本標準偏差、n-1 で除算)が追加されます。有効な数値が存在しない場合は min〜sd の値が null になります。sd は有効な値が 1 件のみ(n < 2)の場合も null です。列の値域が倍精度で計算できる範囲を超える場合は mean、median、sd が null になります。文字列列と enum 列には topValues(頻度上位 5 件まで)が追加されます。MIDAS が内部で追加する行番号列(Row #)は結果に含まれません。
datasets.query(sql, options?)
SQL クエリを実行し、行データを返します。データセットの作成・変更は行いません。SQL は DuckDB の構文に従います。
const result = await window.midas.datasets.query(
'SELECT species, AVG(sepal_length) as avg_sl FROM Iris GROUP BY species'
);
// result.data: { columns: ['species', 'avg_sl'], totalRows: 3, returnedRows: 3, rows: [...] }
FROM と JOIN のテーブル名にはプロジェクト内のデータセット名を書きます。大文字小文字は区別しません。データセット ID は受け付けません。使える名前は datasets.list() で確認できます。日本語やスペースを含むデータセット名は、SQL 内でダブルクォートで囲んでください(例: SELECT * FROM "売上データ")。クエリを実行する対象のデータセットは、最初のテーブル参照から解決されます。一致するデータセットがない場合は DATASET_NOT_FOUND エラーを返します。
options.limit と options.offset でページネーションを制御できます。limit を省略すると全行が返されます。SELECT * でも、MIDAS が内部で追加する行番号列(Row #)は結果に含まれません。行番号が必要な場合は SELECT ROW_NUMBER() OVER () などで明示的に列を作成してください。
SQL の出力列名が予約プレフィックス __midas_(MIDAS 内部列のために予約)で始まる場合は INVALID_INPUT エラーを返します。サブクエリや CTE を含むクエリのどこかで、行番号列の名前 Row # を列の名前として付けた場合も同じエラーを返します。予約されていない名前にエイリアスしてください。
クエリが非有限値(±Infinity、NaN)、表せる範囲(西暦 1〜9999 年)を超えた日付、64 ビット整数の範囲を超えた整数、空文字列を返す場合、その値は結果の行では null になり、件数が列ごとにトップレベルの warnings へ載ります。データセットを作る datasets.*(前述)と異なり、query() は何も作成しないため画面の通知は表示されません。
DuckDB が SQL を解析できない場合は SQL_PARSE_ERROR エラーを返します。エラーの message には DuckDB のパーサーが返したメッセージが入ります。構文エラーの場合は問題のある位置も示します。構文エラーのほか、MIDAS が解析できない文(PIVOT など)もこのエラーになります。列の別名など、SQL のキーワードと衝突する識別子はダブルクォートで囲んでください(例: SELECT x AS "order")。解析はできたもののテーブルを 1 つも参照していない SQL には NO_TARGET エラーを返します。
受け付けられるのは単一の SELECT 文のみです。セミコロン区切りの複数ステートメントや DML/DDL は拒否されます。
datasets.derive(sql, name, options?)
SQL クエリを実行し、結果を新しい派生データセットとして保存します。SQL は DuckDB の構文に従います。
const result = await window.midas.datasets.derive(
'SELECT species, AVG(sepal_length) as avg_sl FROM Iris GROUP BY species',
'Species Averages'
);
// result.data: { id: 'derived_...', name: 'Species Averages', rowCount: 3, columnCount: 2, overwrote: false,
// lineage: { traceable: true } }
FROM と JOIN のテーブル名にはプロジェクト内のデータセット名を書きます。大文字小文字は区別しません。データセット ID は受け付けません。使える名前は datasets.list() で確認できます。日本語やスペースを含むデータセット名は、SQL 内でダブルクォートで囲んでください(例: SELECT * FROM "売上データ")。派生元のデータセットは、最初のテーブル参照から解決されます。一致するデータセットがない場合は DATASET_NOT_FOUND エラーを返します。DuckDB が SQL を解析できない場合は SQL_PARSE_ERROR エラーを、テーブルを 1 つも参照していない SQL には NO_TARGET エラーを返します。
derive() の完了時点で結果データはメモリ上で評価済みであり、直後に datasets.fetch() や datasets.profile() で参照できます。デフォルトでは同名の派生データセットが存在する場合に in-place で更新します。既存のデータセット ID が維持されるため、そのデータセットを参照しているタブや依存する派生データセットの参照は壊れません。上書き対象に依存する派生データセットのキャッシュと依存モデルの推定結果は無効化され、次回アクセス時に新しいデータで再評価されます。options.overwrite を false にすると、同名の派生データセットが既に存在する場合にエラーを返します。
出力名が SQL の FROM / JOIN で参照しているデータセット、またはそれらの祖先(参照先データセットの派生元)のいずれかと同じ ID に解決される場合、依存関係の循環を生む操作になるため SELF_REFERENCE エラーを返します(例: derive('SELECT species, COUNT(*) FROM Iris GROUP BY species', 'Iris')、または Iris → A → B のチェーンで derive('SELECT * FROM B', 'A'))。また、出力名がプライマリデータセットの名前と一致する場合は NAME_CONFLICT エラーを返します(プライマリを派生で上書きしません)。同名の派生データセットが異なるメソッドで作成されている場合(例: addColumns で作成したデータセットを derive で上書きしようとした場合)は OPERATION_TYPE_MISMATCH エラーを返します。SQL が参照するテーブル名または出力名に case-insensitive で複数の既存データセットがマッチする場合は AMBIGUOUS_TABLE_NAME エラーを返します。SQL の出力列名が予約プレフィックス __midas_(MIDAS 内部列のために予約)で始まる場合は INVALID_INPUT エラーを返します。サブクエリや CTE を含むクエリのどこかで、行番号列の名前 Row # を列の名前として付けた場合も同じエラーを返します。予約されていない名前にエイリアスしてください。
SQL が複数のテーブルを参照している場合(JOIN やサブクエリ)、参照された全データセットの ID が派生データセットの parentIds として保存されます。datasets.list() で取得できる各派生データセットのエントリに parentIds 配列が含まれます。Project Lineage タブでは各親から派生データセットへのエッジとして表示されます。
戻り値の lineage は、作成した派生データセットの行リネージ(親への 1 ホップ)を datasets.traceRowLineage() でたどれるかを示します。判定は SQL の構造だけで行われ、データは評価されません。ウィンドウ関数、UNION などの集合演算、GROUP BY で集計しているサブクエリや CTE を含むクエリはたどれません。このとき lineage.traceable は false になり、reason に理由の分類が、warnings に説明が入ります。分類の一覧は datasets.traceRowLineage() を参照してください。たどれないと Contributing rows やグラフのドリルダウンで元の行に戻れないため、集計を 1 段ずつ別の派生データセットに分けるなどのクエリの組み直しを、この時点で判断できます。判定処理自体に失敗した場合、lineage は返されません。
受け付けられるのは単一の SELECT 文のみです。セミコロン区切りの複数ステートメントや DML/DDL は拒否されます。外部からデータを取り込む場合は datasets.importFromURL または datasets.importFromBuffer を使ってください。
datasets.importFromURL(url, options?)
外部 URL から CSV/TSV ファイルをフェッチしてデータセットとして取り込みます。ファイルは全列を文字列として読み込んだプライマリデータセットになり、型判定で文字列以外の列が見つかった場合は、Convert Column Types タブを適用した派生データセットが自動作成されます。派生データセットが指定した名前を継承し、プライマリデータセットには (raw) が付きます。変換対象の列がない場合はプライマリデータセットだけが作られます。
const result = await window.midas.datasets.importFromURL(
'https://example.com/data.csv'
);
// result.data: { id: 'converted_...', name: 'data', rowCount: 100, columnCount: 5,
// sourceDatasetId: 'dataset_...', sourceDatasetName: 'data (raw)' }
戻り値の id と name は分析対象となる変換後のデータセットを指します。raw 側は sourceDatasetId と sourceDatasetName で参照できます(変換後のデータセットが作られた場合のみ含まれます)。以降の datasets.query やグラフ・モデルの対象には name のデータセットを使ってください。
options のプロパティは次のとおりです。
name: 取り込み後のデータセット名。省略した場合は URL から推測されます。hasHeader: 先頭行をヘッダーとして扱うかどうか。デフォルトはtrueです。falseの場合、列名はColumn1、Column2のように自動生成されます。encoding: 文字エンコーディング("utf-8"、"shift_jis"、"euc-jp")。省略時は Content-Type ヘッダの charset とバイト列から自動判定されます。charset が対応外のときはバイト列だけで判定します。データが charset どおりにデコードできないときもバイト列だけで判定し、warningsにその旨が入ります。自動判定した場合は、結果のdetectedEncodingに判定されたエンコーディングが入ります。delimiter: 区切り文字(","、"\t"、";"、"|")。省略時は URL のファイル名の拡張子で決まり、.tsvと.txtはタブ、それ以外はカンマです。overwrite: 同名のデータセットが存在する場合に置き換えるかどうか。デフォルトはfalseです。
同名(大文字小文字を区別しない)のデータセットが既に存在する場合はエラー(DATASET_ALREADY_EXISTS)を返します。options.overwrite を true にすると、既存のデータセットを in-place で置き換えます(ID が維持されます)。置き換え後も、既存と同名の列は列 ID と手動設定(尺度・表示形式)を引き継ぐため、その列を参照する保存済みモデルや派生データセットは引き続き有効です。列名の照合は現在の列名で行うため、インポート後にリネームした列は新しいデータに同じ名前の列がない限り引き継がれません。既存にない名前の列は新しい列 ID を持ちます。過去のインポートで自動作成されたペア(変換後 + raw)を上書きする場合は、両方のデータセットが更新されます。既存のプライマリデータセットと同名で、かつ新しいデータで変換後のデータセットが作られる場合は上書きできず、NAME_CONFLICT エラーになります。返却される columnCount は元ファイルの列数と一致します。MIDAS が内部で追加する行番号列(Row #)はカウントに含まれません。
CSV パースに失敗した場合(空データ、ヘッダー行が空、行ごとの列数が食い違う、引用符で囲んだ値が正しく閉じていない、64 MB を超える行がある、改行コードが混在する、読み込みに使うエンコーディングでデコードできないバイトがある、URL バリデーション失敗、Content-Type 不正など)は INVALID_INPUT エラーを返します。ネットワーク障害やタイムアウトは EXECUTION_ERROR を返します。サイズ警告閾値(デフォルト 10 MB、Settings で変更可能)を超えるファイルはインポートされますが、サイズ警告が result.warnings に含まれます。__midas_ で始まる列ヘッダー(MIDAS 内部列のために予約)と、行番号列と同じ名前の列ヘッダー Row # は、予約されていない名前に自動的にリネームされ、リネームしたヘッダーごとに警告が result.warnings に含まれます。変換後のデータセットが作られる場合、前述の型変換で null になった値(変換失敗、表せる範囲を超えた日付、非有限値)の列ごとの件数も result.warnings に含まれます。
URL のバリデーションとセキュリティ制限が適用されます。プロトコルは HTTP/HTTPS のみ許可され、クラウドメタデータエンドポイントへのアクセスはブロックされます。信頼済み URL リストに含まれない URL に対しては警告が発生し、設定で「信頼されていないドメインへの接続をブロック」を有効にしている場合はエラーになります。詳細はプライバシーとセキュリティを参照してください。
datasets.importFromBuffer(data, options?)
ArrayBuffer または TypedArray(Uint8Array、Node.js の Buffer など)から CSV/TSV データをデータセットとして取り込みます。Playwright のテストから HTTP サーバーを立てずにローカル CSV を読み込みたい場合に使用します。
// Playwright: ローカル CSV を page.evaluate で読み込む
import { readFileSync } from 'fs';
const csvBytes = Array.from(readFileSync('fixtures/sales.csv'));
const result = await page.evaluate(async (bytes) => {
const buffer = new Uint8Array(bytes).buffer;
return await window.midas.datasets.importFromBuffer(buffer, {
name: 'Sales',
});
}, csvBytes);
// result.data: { id: 'converted_...', name: 'Sales', rowCount: 500, columnCount: 7,
// sourceDatasetId: 'dataset_...', sourceDatasetName: 'Sales (raw)' }
data は ArrayBuffer または ArrayBufferView(Uint8Array、DataView、Node.js の Buffer 等)を受け付けます。options のプロパティは次のとおりです。
name: 取り込み後のデータセット名。省略時は"Untitled"hasHeader: 先頭行をヘッダーとして扱うか。省略時はtrueencoding: 文字エンコーディング("utf-8"、"shift_jis"、"euc-jp")。省略時はバイト列から自動判定します。自動判定した場合は、結果のdetectedEncodingに判定されたエンコーディングが入ります。delimiter: 区切り文字(","、"\t"、";"、"|")。省略時は","overwrite: 同名のデータセットが存在する場合に上書きするか。省略時はfalse
区切り文字は delimiter で指定し、TSV のデータを渡すときは "\t" を指定します。返却される columnCount は元ファイルの列数と一致します。MIDAS が内部で追加する行番号列(Row #)はカウントに含まれません。
データセットの作られ方は importFromURL と同じです。全列を文字列として読み込んだプライマリデータセット(名前に (raw))と、型判定に基づく変換を適用した派生データセット(指定した名前を継承)が作られ、戻り値の id と name は変換後のデータセットを指します。同名(大文字小文字を区別しない)のデータセットが既に存在する場合はエラー(DATASET_ALREADY_EXISTS)を返します。overwrite: true で既存を in-place で置き換えられます(ID 維持)。列 ID と手動設定の引き継ぎ規則は importFromURL と同じです。過去のインポートで自動作成されたペアを上書きする場合は両方が更新され、既存のプライマリデータセットと同名で変換後のデータセットが作られる場合は NAME_CONFLICT エラーになります。__midas_ で始まる列ヘッダー(MIDAS 内部列のために予約)と、行番号列と同じ名前の列ヘッダー Row # は、予約されていない名前に自動的にリネームされ、リネームしたヘッダーごとに警告が result.warnings に含まれます。変換後のデータセットが作られる場合、前述の型変換で null になった値(変換失敗、表せる範囲を超えた日付、非有限値)の列ごとの件数も result.warnings に含まれます。CSV パースに失敗した場合(空データ、ヘッダー行が空、行ごとの列数が食い違う、引用符で囲んだ値が正しく閉じていない、64 MB を超える行がある、改行コードが混在する、読み込みに使うエンコーディングでデコードできないバイトがある、など)は INVALID_INPUT エラーを返します。
datasets.generateSynthetic(spec, options)
データ生成過程(DGP、data generating process)を指定して合成データセットを作ります。Synthetic Data Generator タブと同じ機能で、分布・式・因子・By・プリセットの意味はタブのページが説明します。この節では API 固有の形式(spec の JSON、オプション、エラーコード)を説明します。よく使う設計の雛形 spec は listSyntheticPresets で取得できます。
// y = 1 + 2x + ノイズ(誤差 sd = 0.5)の線形回帰データを生成する
const result = await window.midas.datasets.generateSynthetic(
{
nodes: [
{ name: 'x', dist: { kind: 'normal', mean: { type: 'const', value: 0 }, sd: { type: 'const', value: 1 } } },
{
name: 'y',
dist: {
kind: 'normal',
mean: {
type: 'binary', op: '+',
left: { type: 'const', value: 1 },
right: { type: 'binary', op: '*', left: { type: 'const', value: 2 }, right: { type: 'ref', name: 'x' } },
},
sd: { type: 'const', value: 0.5 },
},
},
],
},
{ name: 'Linear', rows: 200, seed: 42 }
);
// result.data: { id: 'ds_...', name: 'Linear', rowCount: 200, columnCount: 2 }
spec.nodes の各要素が出力データセットの 1 列です。dist.kind で分布を選びます。
normal(mean, sd)/uniform(min, max)/gamma(shape, scale)/weibull(shape, scale): 連続値(float64 列)poisson(lambda)/bernoulli(p): 非負整数(int64 列)categorical(levels, weights?): 文字列ラベル(string 列)。weightsは相対値で、省略時は一様ですdeterministic(value): ノイズなしの変換列。式のトップレベルが比較のときは 0/1 の指示列として int64 列になり、それ以外は float64 列です
行の構造は spec.factors(因子の配列。各要素は { name, levels })、spec.rowsPerCell(セルあたりの行数。省略時 1)、spec.time(時刻列。{ name, length })で宣言します。タブの Factors セクション・Rows per cell・Time column に対応し、宣言すると行数がそこから決まるため options.rows を省略できます。ノードの by(列名の配列)はタブの By 欄に対応し、群ごとに 1 回サンプリングする粒度の指定です。因子と By の意味はタブのページを参照してください。
分布のパラメータは式(Expr)の JSON で、次のノードを組み合わせます。
- 定数:
{ type: 'const', value } - 他列の参照:
{ type: 'ref', name } - 二項演算:
{ type: 'binary', op, left, right }。opは四則+-*/と比較<<=>>=です - 単項マイナス:
{ type: 'unary', op: '-', operand } - 関数:
{ type: 'call', fn, args }。argsは引数の式の配列で、関数は 1 引数のexp、log、sqrt、logistic、absと 2 引数のpow、min、maxです - カテゴリ分岐:
{ type: 'cases', over, map, default? } - 過去参照:
{ type: 'lag', name, k }。kは正の整数で、timeがあるときだけ使えます
語彙はタブのテキスト式と同じです。比較の返す値、cases と lag の規則、生存時間データの構成は式の構文と生存時間データの設定例を参照してください。
options のプロパティは次のとおりです。
name: データセット名(必須)rows: 生成する行数(1 以上、上限 10,000,000)。spec.factorsかspec.timeがある場合は省略でき、そこから決まる行数が使われます。指定する場合はその行数と一致する必要があります。どちらも無い場合は必須ですseed: 乱数シード(必須)。符号付き 32bit 整数。同じspec・rows・seedは同じデータを再現しますoverwrite: 同名の合成データセットが存在する場合に上書きするか。省略時はfalse
生成したデータは既定では MDS に保存せず、spec と seed を生成 operation に保持します。リロード時はこの operation からデータを再生成します。再現の範囲と値を固定する方法は保存したデータセットの編集を参照してください。
生成中にパラメータの式が定義域を外れた値になると、その時点で INVALID_INPUT を返して失敗します。sd が 0 以下になる場合や、p が [0, 1] の外になる場合が該当します。線形予測子は logistic で 0 から 1 の範囲に、exp で正の値に写せます。ただし浮動小数点の限界を超える極端な線形予測子では exp の結果が 0 または無限大になり、生成は失敗します。
無効な spec は INVALID_INPUT を返します。次の場合が該当します。
- 循環参照または未定義列の参照がある
sdが 0 以下になるなど、パラメータが定義域を外れるcasesが全水準を被覆せず、defaultも無いbyを持つ列の式が、群内で値の変わる列を参照するrowsまたはseedが範囲外である
同名のデータセットが既に存在し overwrite が false の場合は DATASET_ALREADY_EXISTS を返します。overwrite: true で置き換えられるのは同じ生成方法で作った合成データセットのみです。プライマリデータセットとの同名は NAME_CONFLICT、別の方法で作ったデータセットとの同名は OPERATION_TYPE_MISMATCH を返し、上書きを拒否します。
datasets.listSyntheticPresets()
組み込みの合成データプリセットの一覧を返します。プリセットは、マルチレベル(ランダム切片)、反復測定(subject × time)、相関するランダム切片・傾きの 3 種類で、Synthetic Data Generator タブの Preset 選択と同じものです。
const presets = await window.midas.datasets.listSyntheticPresets();
// presets.data: [{ id, label, description, spec, rowCount }, ...]
await window.midas.datasets.generateSynthetic(presets.data[0].spec, { name: 'Schools', seed: 42 });
各要素は次のフィールドを持ちます。
id: プリセットの識別子label: UI の表示名description: 設計の説明spec: DGP の specrowCount: 因子から決まる行数
spec はそのまま、または編集してから generateSynthetic に渡せます。すべてのプリセットは factors を持ち行数が spec から決まるため、options.rows は不要です。各プリセットが作るデータの内容と、MIDAS 内で当てはめられるモデルの制約はプリセットの説明を参照してください。
datasets.reload(options?)
URL またはファイルから取り込んだデータセットを、元のソースから読み直して更新します。
// URL 由来・ファイル由来のすべてのデータセットを読み直す
const result = await window.midas.datasets.reload();
// result.data: { reloaded: [{ datasetId, name, rowCount, previousRowCount, source, clearedExcludedRowCount, clearedRowCommentCount }], failed: [], needsFileSelection: [] }
// 特定のデータセットのみ読み直す
const result = await window.midas.datasets.reload({
datasetId: 'primary_abc123',
});
URL から取り込んだデータセットは、保存されている URL から再取得します。ファイルから取り込んだデータセットは、Reload ダイアログで最後に選択したファイルから最新の内容を読みます。ファイルの読み取り許可の再取得にはユーザー操作が必要なため、API からは許可が残っているファイルだけを読みます。自動で読み直せなかったデータセットは result.data.needsFileSelection に理由(no-handle・file-missing・permission-required)つきで返します。これらは Reload ダイアログでのファイル選択または再許可が必要です。
options.datasetId を指定すると、そのデータセットだけを読み直します。データセット ID またはデータセット名(大文字小文字を区別しない)を指定できます。省略すると、URL またはファイルから取り込まれたすべてのプライマリデータセットが対象になります。指定したデータセットが存在しない場合は DATASET_NOT_FOUND エラー、存在するが URL からもファイルからも取り込まれたものでない場合は INVALID_INPUT エラーを返します。
読み直しは、ヘッダー行の有無を最初に取り込んだときの設定で、区切り文字をデータセットに記録されたもので読みます。記録される区切り文字は、通常は前回読んだときのものです(データセットのリロード を参照)。別の区切り文字で読むには、options.datasetId とあわせて options.delimiter(","、"\t"、";"、"|" のいずれか)を指定します。読んだ区切り文字は保存され、以後の読み直しに使われます。データセットごとにファイルの区切り文字が異なりうるため、options.datasetId なしで options.delimiter を指定すると INVALID_INPUT エラーを返します。
読み直しではデータセット ID、名前、派生データセット、モデルとの紐づけが維持されます。除外行と行コメントはクリアされます。新しいデータを CSV/TSV として解析できない場合は、そのデータセットの読み直しは失敗します。解析できない条件は datasets.importFromURL() と同じです。読み直し先の CSV から既存の列が消えた場合(削除や改名)と、読み直し後に同じ名前の列が 2 つできる場合も失敗します。列が string 以外の型を持つデータセットでは、現在の列の型へ変換できない値があると失敗します。列の追加や順番の変更は許容されます。
型が Convert Column Types タブの変換に由来する派生データセットは、この失敗の対象になりません。型に合わない値は変換を評価し直す時点で On Error 設定に従って処理され、読み直し自体は成功します。
result.data.reloaded には読み直しに成功したデータセットの情報(datasetId、name、更新後の行数 rowCount、更新前の行数 previousRowCount、読み直し元 source)が含まれます。各要素には、その読み直しで消えた除外行の件数 clearedExcludedRowCount と行コメントの件数 clearedRowCommentCount も含まれます。result.data.failed には失敗したデータセットの情報(datasetId、name、source、error)が含まれます。一部のデータセットが失敗した場合でも success は true になります。全件失敗した場合のみ success: false になります。
datasets.addColumns(datasetId, input)
計算列をデータセットに追加します。datasetId にはデータセット ID またはデータセット名(大文字小文字を区別しない)を指定できます。結果は新しい派生データセットとして作成されます。expression は DuckDB の SQL 式構文に従います。CASE WHEN や CAST 等の SQL 関数も使用できます。
const result = await window.midas.datasets.addColumns('Iris', {
columns: [
{ name: 'bmi', expression: 'weight / (height * height)' }
]
});
// result.data: { id: 'derived_...', name: '...', rowCount: 150, columnCount: 6 }
列名が予約プレフィックス __midas_(MIDAS 内部列のために予約)で始まる場合と、行番号列と同じ Row # である場合は、INVALID_INPUT エラーを返します。outputName で出力データセット名を指定できます。同名の派生データセットが存在する場合は in-place で更新し、既存のデータセット ID を維持します。outputName がソース datasetId またはその祖先(派生元のデータセット)のいずれかに解決される場合、依存関係の循環を防ぐため SELF_REFERENCE エラーを返します。同名のプライマリデータセットと衝突する場合は NAME_CONFLICT エラーを返します。同名の派生データセットが異なるメソッドで作成されている場合は OPERATION_TYPE_MISMATCH エラーを返します。outputName に case-insensitive で複数の既存データセットがマッチする場合は AMBIGUOUS_TABLE_NAME エラーを返します。
datasets.addOrthogonalPolynomials(datasetId, input)
直交多項式列をデータセットに追加します。datasetId にはデータセット ID またはデータセット名(大文字小文字を区別しない)を指定できます。多項式回帰の説明変数として使用します。
const result = await window.midas.datasets.addOrthogonalPolynomials('Iris', {
column: 'temperature',
degree: 3
});
// result.data: { id: 'derived_...', name: '...', rowCount: 150, columnCount: 8, columnNames: ['temperature_poly1', 'temperature_poly2', 'temperature_poly3'] }
degree の最大値は 30 です。outputName で出力データセット名を指定できます。outputName がソース datasetId またはその祖先(派生元のデータセット)のいずれかに解決される場合、依存関係の循環を防ぐため SELF_REFERENCE エラーを返します。同名のプライマリデータセットと衝突する場合は NAME_CONFLICT エラーを返します。同名の派生データセットが異なるメソッドで作成されている場合は OPERATION_TYPE_MISMATCH エラーを返します。outputName に case-insensitive で複数の既存データセットがマッチする場合は AMBIGUOUS_TABLE_NAME エラーを返します。
datasets.reshapeWideToLong(datasetId, input)
データセットを Wide 形式から Long 形式へ変換(unpivot)します。datasetId にはデータセット ID またはデータセット名(大文字小文字を区別しない)を指定できます。idColumns・valueColumns には列名または列 ID を指定できます。Reshape タブの Wide to Long と同じ変換で、結果は新しい派生データセットとして作成されます。
const result = await window.midas.datasets.reshapeWideToLong('Scores', {
idColumns: ['subject'],
valueColumns: ['test1', 'test2', 'test3'],
variableName: 'test',
valueName: 'score'
});
// result.data: { id: 'derived_...', name: 'Scores (Long)', rowCount: 30, columnCount: 3 }
idColumns で指定した列はそのまま残り、valueColumns で指定した列 1 本ずつが 1 行に展開されます。行数は元の行数に valueColumns の本数を掛けた数になります。variableName(既定値 variable)は展開前の列名が入る列、valueName(既定値 value)は値が入る列の名前です。valueColumns が空の場合は INVALID_INPUT エラーを返します。variableName・valueName が予約プレフィックス __midas_(MIDAS 内部列のために予約)で始まる場合と、行番号列と同じ Row # である場合も、同じエラーを返します。outputName で出力データセット名を指定できます。同名の派生データセットが存在する場合は in-place で更新し、既存のデータセット ID を維持します。outputName がソース datasetId またはその祖先のいずれかに解決される場合は SELF_REFERENCE、同名のプライマリデータセットと衝突する場合は NAME_CONFLICT、同名の派生データセットが異なるメソッドで作成されている場合は OPERATION_TYPE_MISMATCH、outputName に case-insensitive で複数の既存データセットがマッチする場合は AMBIGUOUS_TABLE_NAME エラーを返します。
datasets.reshapeLongToWide(datasetId, input)
データセットを Long 形式から Wide 形式へ変換(pivot)します。datasetId にはデータセット ID またはデータセット名(大文字小文字を区別しない)を指定できます。idColumns・variableColumn・valueColumn には列名または列 ID を指定できます。Reshape タブの Long to Wide と同じ変換で、結果は新しい派生データセットとして作成されます。
const result = await window.midas.datasets.reshapeLongToWide('Scores', {
idColumns: ['subject'],
variableColumn: 'test',
valueColumn: 'score'
});
// result.data: { id: 'derived_...', name: 'Scores (Wide)', rowCount: 10, columnCount: 4 }
idColumns の値の組み合わせで行をグループ化し、variableColumn に現れるユニークな値ごとに新しい列を作成して valueColumn の値を割り当てます。idColumns の値と variableColumn の値の組み合わせが一意でない場合(重複エントリ)は INVALID_INPUT エラーを返します。outputName で出力データセット名を指定できます。同名の派生データセットが存在する場合は in-place で更新し、既存のデータセット ID を維持します。outputName がソース datasetId またはその祖先のいずれかに解決される場合は SELF_REFERENCE、同名のプライマリデータセットと衝突する場合は NAME_CONFLICT、同名の派生データセットが異なるメソッドで作成されている場合は OPERATION_TYPE_MISMATCH、outputName に case-insensitive で複数の既存データセットがマッチする場合は AMBIGUOUS_TABLE_NAME エラーを返します。
datasets.dummyCode(datasetId, input)
カテゴリ変数を 0/1 のダミー変数(treatment coding)に変換します。datasetId にはデータセット ID またはデータセット名(大文字小文字を区別しない)を指定できます。columns・includedColumns・keepOriginalColumns には列名または列 ID を指定できます。Dummy Coding タブと同じ変換で、結果は新しい派生データセットとして作成されます。
const result = await window.midas.datasets.dummyCode('Iris', {
columns: ['species'],
referenceCategories: { species: 'setosa' }
});
// result.data: { id: 'derived_...', name: 'Iris (Dummy Coded)', rowCount: 150, columnCount: 6,
// encodedColumns: [{ column: 'species', referenceCategory: 'setosa', dummyVariableCount: 2 }] }
columns で指定した各列を k 個のカテゴリから k-1 個のダミー変数に変換し、参照カテゴリを省略します。参照カテゴリの既定値はカテゴリの順序で最初のカテゴリです。referenceCategories で列ごとに参照カテゴリを指定できます。includedColumns は出力に含める列(ダミー変数化対象の列を含む)を指定し、省略した場合は Row # を除くソースの全列を含めます。ここに無い列は出力から除外されます。keepOriginalColumns(columns の部分集合)で指定した列は、ダミー変数化後も元の列を出力に残します。scaleOverrides は素通りする列の測定尺度を上書きします。string 型と enum 型の列に指定できる尺度は nominal と ordinal だけで、interval や ratio を指定すると INVALID_INPUT エラーを返します。ダミー変数の列自体は常に ratio 尺度として記録されます。ユニーク値が 50 を超える列も変換しますが、その列名と生成したダミー変数の本数を warnings に載せます。Dummy Coding タブが Create Dataset の前に出す警告と同じ判定です。columns に指定した列が名義・順序尺度以外または boolean 型の場合、ユニーク値が 2 未満の場合(データセットの行数が 0 の場合を含む)、referenceCategories に指定したカテゴリがデータに存在しない場合、または keepOriginalColumns に columns に無い列が含まれる場合は INVALID_INPUT エラーを返します。outputName で出力データセット名を指定できます。同名の派生データセットが存在する場合は in-place で更新し、既存のデータセット ID を維持します。outputName がソース datasetId またはその祖先のいずれかに解決される場合は SELF_REFERENCE、同名のプライマリデータセットと衝突する場合は NAME_CONFLICT、同名の派生データセットが異なるメソッドで作成されている場合は OPERATION_TYPE_MISMATCH、outputName に case-insensitive で複数の既存データセットがマッチする場合は AMBIGUOUS_TABLE_NAME エラーを返します。
datasets.filter(datasetId, input)
データセットの行をフィルタ式で絞り込み、結果を新しい派生データセットとして作成します。datasetId にはデータセット ID またはデータセット名(大文字小文字を区別しない)を指定できます。Filtered Data タブの Save as Dataset と同じ変換で、ソースのデータが変わるたびにフィルタが再評価されます。
const result = await window.midas.datasets.filter('Iris', {
expression: "species = 'setosa' AND sepal_length > 5"
});
// result.data: { id: 'derived_...', name: 'Iris (Filtered)', rowCount: 22, columnCount: 5 }
expression の構文は Filtered Data タブのフィルタ入力欄と同じです。欠損値の扱いも Data Table のフィルタと同じ規則に従います。否定の条件は否定する前の条件に一致しない行をすべて返すため、species != 'setosa' は species が欠損値の行を含みます。欠損値かどうかを直接判定する構文は IS NULL と IS NOT NULL だけです。expression が空の場合、構文が不正な場合、データセットに無い列を参照している場合は INVALID_INPUT エラーを返します。列の型として読めない値や NULL を値として書いた場合、string と enum 以外の列に LIKE / ILIKE を書いた場合、LIKE / ILIKE のパターンが文字列でない場合も INVALID_INPUT エラーを返します。outputName で出力データセット名を指定できます。同名の派生データセットが存在する場合は in-place で更新し、既存のデータセット ID を維持します。outputName がソース datasetId またはその祖先のいずれかに解決される場合は SELF_REFERENCE、同名のプライマリデータセットと衝突する場合は NAME_CONFLICT、同名の派生データセットが異なるメソッドで作成されている場合は OPERATION_TYPE_MISMATCH、outputName に case-insensitive で複数の既存データセットがマッチする場合は AMBIGUOUS_TABLE_NAME エラーを返します。
datasets.setColumnSchema(datasetId, columnId, schema)
列のデータ型、測定尺度、enum 定義を変更します。datasetId にはデータセット ID またはデータセット名(大文字小文字を区別しない)を指定できます。
const result = await window.midas.datasets.setColumnSchema('Iris', 'col_002', {
type: 'enum',
scale: 'nominal',
enumName: 'species_enum'
});
// result.data: { datasetId: 'ds_001', columnId: 'col_002', createdDerived: true, derivedDatasetId: 'derived_...', overwrote: false }
schema には type、scale、enumName、timezone を指定できます。type、scale、enumName の少なくとも 1 つは必須です。string 型と enum 型の列に指定できる尺度は nominal と ordinal だけで、interval や ratio を指定すると INVALID_INPUT エラーを返します。変更後の型が string または enum になる場合も同様です。データ型の変更は SQL による型変換を伴うため、新しい派生データセットが作成されます。同名の出力データセットが既に存在する場合は in-place で更新し、既存のデータセット ID を維持します。outputName がソースデータセット自身またはその祖先(派生元のデータセット)を指す場合、依存関係の循環を防ぐため SELF_REFERENCE エラーを返します。同名のプライマリデータセットと衝突する場合は NAME_CONFLICT エラーを返します。同名の派生データセットが異なるメソッドで作成されている場合は OPERATION_TYPE_MISMATCH エラーを返します。outputName に case-insensitive で複数の既存データセットがマッチする場合は AMBIGUOUS_TABLE_NAME エラーを返します。測定尺度のみの変更はメタデータの更新のみで、派生データセットは作成されません。
enum 型に変換できるのは string 型・int64 型・enum 型の列です。float64・boolean・date・datetime 型の列を enum 型に変換しようとすると INVALID_INPUT エラーを返すので、先に type: 'string' で string 型へ変換し、文字列になった値を確かめてから enum 型へ変換してください。float64 の値 2 は 2.0 になります。int64 型の列は値を 10 進表記の文字列にして enum 定義の値と照合します。Convert Column Types タブと同じ規則で、詳細は Manage Enums タブで説明しています。
enum 型への変換では、列の値が全て enum 定義内または NULL である必要があります。定義外の値が存在する場合は ENUM_VALUE_MISMATCH で拒否されます。事前に Convert Column Types タブで不要な値を NULL 化または除外するか、enums.update で定義に値を追加してください。
string 列から datetime への変換では、timezone にタイムゾーンオフセットのない値を解釈するタイムゾーン名(例: Asia/Tokyo)を指定できます。省略時は UTC として解釈します。オフセット付きの値は、指定に関係なく値自身のオフセットで解釈します。string から datetime への変換以外で timezone を指定した場合と、MIDAS が扱えない名前を指定した場合は INVALID_INPUT エラーを返します。指定できる名前と解釈の規則は Convert Column Types タブの Timezone 指定と同じです。
datasets.rename(id, newName)
データセット名を変更します。データセット ID またはデータセット名(大文字小文字を区別しない)を指定できます。
const result = await window.midas.datasets.rename('Iris', 'Iris (raw)');
// result.data: { datasetId: 'ds_001', previousName: 'Iris', name: 'Iris (raw)' }
このデータセットを参照している SQL 派生データセットのクエリは、新しい名前に書き換わります。書き換わるのは FROM "sales_2024" のようにダブルクォートで囲んだ参照だけで、FROM sales_2024 のように引用符なしで書いた参照はそのまま残り、リネーム後は手で直すまでそのクエリは失敗します。リネームの完了後、以前の名前で参照するクエリは失敗します。データセット名は大文字小文字を区別せずに比較するため、Iris があるときに iris へは変更できません。
datasets.setSaveDataWithProject(id, save)
派生データセットの計算結果をプロジェクトファイルに保存するかどうかを設定します。UI の Save data with project と同じ設定で、意味はデータセットで説明しています。id にはデータセット ID またはデータセット名(大文字小文字を区別しない)を指定できます。
const result = await window.midas.datasets.setSaveDataWithProject('Monthly Total', true);
// result.data: { datasetId: 'derived_001', previousSaveDataWithProject: false, saveDataWithProject: true }
save に true を渡すと、次に保存するプロジェクトファイルには、保存の時点で計算済みのデータが入ります。保存の時点で計算していないデータはファイルに入らず、開いたあと必要になった時点で再計算します。false を渡すと、プロジェクトファイルには操作の定義だけが入り、MIDAS はプロジェクトを開いたあとデータが必要になった時点で操作を再実行します。
設定を切り替えた時点では、データもプロジェクトファイルも変わりません。切り替えでデータセットを再計算することはありません。プロジェクトファイルの中身が変わるのは、次に project.save()、project.exportMds()、project.downloadMds() のいずれかを呼んだときです。
この設定を持つのは派生データセットだけです。primary データセットのデータは常にプロジェクトファイルに入るため、primary データセットを指定すると INVALID_INPUT エラーを返します。save が真偽値でない場合と、一時的な内部データセット(ephemeral)の ID を指定した場合も INVALID_INPUT エラーを返します。
datasets.renameColumn(datasetId, columnId, newName)
列名を変更します。datasetId にはデータセット ID またはデータセット名、columnId には列 ID または列名を指定できます。
const result = await window.midas.datasets.renameColumn('Iris', 'sepal_length', 'sepal length (cm)');
// result.data: { datasetId: 'ds_001', columnId: 'col_001', previousName: 'sepal_length', name: 'sepal length (cm)' }
列名は SQL での列の識別子を兼ねます。古い列名で書かれた SQL クエリは一致しなくなるため、リネーム後に自分で書き換えてください。リネームすると、このデータセットに依存する派生データセット、モデル、レポート要素のキャッシュは無効化され、再計算されます。
派生データセットの列はリネームできません。列名は SQL クエリや型変換の設定といったデータセットの定義が決めており、評価のたびに定義から作り直されるためです。派生データセットを指定すると INVALID_INPUT エラーを返し、error.suggestion が名前を変える場所を示します。SQL 派生データセットで名前を変えるには、クエリの AS 別名を変更してください。CSV インポートが作る型変換済みデータセットの列名はインポート元のファイルのヘッダーが決めるため、別の名前を使うにはファイルのヘッダーを直して新しいデータセットとしてインポートし直すか、AS 別名で列名を付けるクエリからデータセットを作ります。
datasets.setColumnDisplayFormat(datasetId, columnId, format)
列の値の表示形式を設定します。datasetId にはデータセット ID またはデータセット名、columnId には列 ID または列名を指定できます。
const result = await window.midas.datasets.setColumnDisplayFormat('Issues', 'number', {
link: { urlTemplate: 'http://example.com/issues/{number}' }
});
// result.data: {
// datasetId: 'ds_001', columnId: 'col_001',
// displayFormat: { link: { urlTemplate: 'http://example.com/issues/{number}' } }
// }
表示形式はリンク表示と数値の書式の 2 種類からなり、format には変更する種類だけをキーとして書きます。link: { urlTemplate } はリンク表示です。urlTemplate の {列名} は同じ行のその列の値に置き換わり、値は URL エンコードされます。参照した列の値が欠損している行は、リンクにならずプレーンテキストで表示されます。number: { formatSpec } は数値の書式で、formatSpec には空でない Python 互換の format spec 構文を指定します。数値の書式は数値列(float64 または int64)にのみ設定できます。
2 種類は互いに独立した設定です。format に書かなかった種類は現在の設定のまま残り、null を値に書いた種類は解除されます。format そのものに null を渡すと、両方の種類が解除されます。両方を設定した列では、数値の書式を当てた値がリンクとして表示されます。戻り値の displayFormat は変更後の表示形式で、どちらの種類も残っていなければ null です。
表示形式は列に設定されるため、その列を表示するすべての場所に効きます。絞り込んだ結果を表示する Filtered Data タブでも同じ形式で表示され、レポートに追加済みのデータテーブルにも反映され、派生データセットを評価し直しても設定は残ります。ただし、評価し直した結果で列が数値以外の型になった場合、数値の書式は外れます。現在の設定は datasets.describe() が返す列情報の displayFormat で読めます。
Data Table タブは、そのタブでだけ有効な形式を列に設定できます。GLM や GLMM などの分析タブの係数テーブルにも、同様にそのタブでだけ有効な形式があります。これらのタブの形式はビューの状態であり、この API からは読み書きできません。タブの形式は種類ごとに列の形式より優先されます。タブにある種類は、この API で列の形式を変えてもタブの形式で表示され続け、タブにない種類は列の形式で表示されます。係数テーブルを Save as Dataset で保存すると、保存時点のタブの形式が列の形式としてデータセットに引き継がれ、この API から読み書きできるようになります。
リンクが実際に描画されるのは、自分で作成したプロジェクトと、Official または Trusted の署名がついた MDS ファイル由来のプロジェクトだけです。未知の署名者の MDS ファイル由来のプロジェクトでは設定は保存されますが、リンクは描画されずプレーンテキストで表示されます。
datasets.download(id, options)
データセットを CSV、TSV、JSON のファイルとしてダウンロードします。データテーブルの Export ボタンと同じ処理を通ります。データセット ID またはデータセット名(大文字小文字を区別しない)を指定できます。
const result = await window.midas.datasets.download('Iris', {
format: 'csv',
fileName: 'iris-export',
encoding: 'shift_jis'
});
// result.data: {
// datasetId: 'ds_001', fileName: 'iris-export.csv', format: 'csv',
// rowCount: 150, unrepresentableCharacters: []
// }
format は必須です。fileName を省略するとデータセット名を使い、拡張子は形式に合わせて付け替えます。includeHeaders の既定は true で、JSON では無視します。CSV と TSV では encoding(utf-8、shift_jis、euc-jp)と、UTF-8 のときの bom を指定できます。JSON は常に UTF-8 です。指定した文字コードで表現できない文字は HTML 文字参照(é など)に置き換わります。置き換わった文字は unrepresentableCharacters に先頭 10 種類まで載り、総数は警告の文言に入ります。
データテーブルのタブで掛けているフィルタ・並べ替え・行選択は、開いているタブの状態であってデータセットの一部ではないため、この API では指定できません。行を絞ったファイルが必要なときは datasets.derive() で先に絞り込んでください。
datasets.create(name, options)
列を指定してデータセットを作成します。各セルは欠損値で始まります。
const result = await window.midas.datasets.create('Measurements', {
columns: [
{ name: 'subject', type: 'string' },
{ name: 'score', type: 'float64', scale: 'ratio' }
],
rowCount: 3
});
// result.data: { id: 'manual_...', name: 'Measurements', columnIds: ['col_0_...', 'col_1_...'], rowCount: 3 }
測定尺度は scale を省略すると列のデータ型から推論します。string 列に指定できる尺度は nominal と ordinal だけです。値の書き込みには datasets.setCellValues() を使います。列の type に指定できるのは string、int64、float64、boolean、date、datetime です。enum 列は string で作成してから、datasets.setColumnSchema() に enumName を渡して変換してください。
datasets.setCellValues(id, values)
自分で値を保持しているデータセットのセルを個別に書き換えます。データセット ID またはデータセット名(大文字小文字を区別しない)を指定できます。
const result = await window.midas.datasets.setCellValues('Measurements', [
{ row: 0, column: 'subject', value: 'A' },
{ row: 0, column: 'score', value: 12.5 }
]);
// result.data: { datasetId: 'manual_...', updatedCells: 2 }
row は 0 から始まる行の位置、column は列 ID または列名です。書き換えた値は元に戻せません。データセットは以前の値を記録しないため、プロジェクトから元のデータを復元できなくなります。このデータセットに依存する派生データセット、モデル、レポート要素のキャッシュは無効化され、再計算されます。
データテーブルのセル編集は入力欄の文字列を列の型へ変換しますが、この API は値を変換しません。value は列のデータ型に合う値である必要があります。int64 列に書き込める整数は -9007199254740992 から 9007199254740992(±2^53)までで、この範囲を超える値は JavaScript の number が正確に保持できないため拒否されます。null はどの型でも欠損値として書き込めます。string 列と enum 列では空文字列を null として格納します。enum 列の値は前後の空白を除いてから enum 定義と照合し、除いた値を格納します。date 列には YYYY-MM-DD 形式の文字列を、datetime 列には 2024-01-15T10:30:00Z のような ISO 8601 形式の文字列を書き込みます。UTC オフセットのない datetime は UTC として読み、どちらもデータテーブルのセル編集と同じ正規形で格納します。入力はすべて検証してから書き込むため、1 つでも不正な指定があれば何も書き換えません。
派生データセットの値は operation から導出されるため、セル単位では書き換えられません。CSV インポートが作る型変換済みデータセットもこれにあたるので、取り込んだ値を直すには生の値を持つ <名前> (raw) の側を指定してください。
datasets.excludeRows(datasetId, rows, reason?)
自分で値を保持しているデータセットの行を除外します。Data Table の Exclude this row と同じ操作です。除外がデータセットに与える効果は 行の除外と復元 を参照してください。データセット ID またはデータセット名(大文字小文字を区別しない)を指定できます。
const result = await window.midas.datasets.excludeRows(
'Measurements (raw)',
{ filter: "subject IN ('P07', 'P12')" },
'Withdrew consent'
);
// result.data: { datasetId: 'ds_001', excludedRowNumbers: [6, 11], rowCount: 98 }
rows には、0 から始まる行インデックスの配列か、Data Table のフィルタ構文 の式を持つ { filter } を渡します。どちらも datasets.selectRows() と同じ形式です。行インデックスはデータ上の行の位置で、Data Table で並べ替えや絞り込みをした後の表示順ではありません。reason は Excluded Rows ダイアログに表示する除外の理由で、省略できます。reason の前後の空白は取り除き、空になった理由は理由なしとして保存します。このデータセットに依存する派生データセット、モデル、レポート要素のキャッシュは無効化され、除外後のデータで再計算されます。フィルタに一致する行がなければ、何も除外せずに成功を返します。入力はすべて検証してから書き込むため、行数以上のインデックスが配列に 1 つでもあれば何も除外しません。
返り値の excludedRowNumbers は、除外した行の Row # です。Row # は Data Table に表示される 行番号 にあたります。除外した行はデータから取り除かれて行インデックスを持たないため、datasets.restoreRows() は Row # で行を指定します。他の行を除外・復元しても、各行の Row # は変わりません。このメソッドの実行中に他の操作が除外または削除した行は、excludedRowNumbers に含めません。
Data Table タブがこのデータセットを Edit Mode で開いている間、このメソッドは EDIT_MODE_ACTIVE エラーを返します。Edit Mode は Done を押すまで編集を行インデックスで保持しており、その間に行を除外すると編集の対象行がずれるためです。ユーザーに編集を終えてもらってから、もう一度呼び出してください。
派生データセットは自分の行を持たないため、行を除外できません。CSV インポートで作ったデータセットなら、<名前> (raw) の側の行を除外してください。型変換済みデータセットは再計算のときに除外後のデータから作り直されます。
<名前> (raw) のデータセットは全列が文字列です。そのためフィルタは値を文字列として比べることしかできず、weight > 200 のような数値の比較は INVALID_INPUT エラーになります。数値の条件で除外するには、型変換済みデータセットで datasets.selectRows() を使って行を選び、datasets.traceRowLineage() で raw 側の行に対応づけます。
const selected = await window.midas.datasets.selectRows('Measurements', { filter: 'weight > 200' });
const traced = await window.midas.datasets.traceRowLineage('Measurements', selected.data.selectedRows);
const raw = traced.data.contributions[0];
await window.midas.datasets.excludeRows(raw.datasetName, raw.rowIndices, 'Scale error');
datasets.listExcludedRows(datasetId)
自分で値を保持しているデータセットの除外中の行を返します。データセット ID またはデータセット名(大文字小文字を区別しない)を指定できます。
const result = await window.midas.datasets.listExcludedRows('Measurements (raw)');
// result.data: { datasetId: 'ds_001', excludedRows: [
// { rowNumber: 6, reason: 'Withdrew consent', excludedAt: '2026-10-06T09:15:00.000Z', values: { subject: 'P07', weight: '250' } }
// ] }
excludedRows は Row # の昇順に並びます。reason は除外の理由で、理由なしで除外した行では null です。excludedAt は除外した時刻を ISO 8601 形式で表します。values は除外した時点の値を列名をキーにして持ちます。
datasets.restoreRows(datasetId, rowNumbers)
除外中の行を復元します。Excluded Rows ダイアログの Restore、Restore Selected、Restore All と同じ操作です。データセット ID またはデータセット名(大文字小文字を区別しない)を指定できます。
const result = await window.midas.datasets.restoreRows('Measurements (raw)', [6, 11]);
// result.data: { datasetId: 'ds_001', restoredRowNumbers: [6, 11], rowCount: 100 }
// 除外中のすべての行を復元する
await window.midas.datasets.restoreRows('Measurements (raw)', 'all');
rowNumbers には、datasets.excludeRows() または datasets.listExcludedRows() が返した Row # の配列か、'all' を渡します。復元した行は Row # の順の位置に戻ります。このデータセットに依存する派生データセット、モデル、レポート要素のキャッシュは無効化され、再計算されます。
復元すると、除外の理由と時刻は破棄され、元に戻せません。Excluded Rows ダイアログはこのため Restore All の前に確認を求めますが、このメソッドは確認を求めません。理由と時刻が必要なら、先に datasets.listExcludedRows() で読み出してください。
除外中でない Row # を指定すると INVALID_INPUT エラーを返し、何も復元しません。このメソッドの実行中に Excluded Rows ダイアログなどの他の操作が復元した行は、restoredRowNumbers に含めません。除外中の行がないデータセットに 'all' を渡した場合は、何も変えずに成功を返します。'all' を渡したときの restoredRowNumbers は、復元した時点で除外中だった行です。Edit Mode の間は、datasets.excludeRows() と同じ理由で EDIT_MODE_ACTIVE エラーを返します。
datasets.listRowComments(datasetId)
自分で値を保持しているデータセットの行コメントを返します。データセット ID またはデータセット名(大文字小文字を区別しない)を指定できます。
const result = await window.midas.datasets.listRowComments('Measurements (raw)');
// result.data: { datasetId: 'ds_001', comments: [
// { rowNumber: 3, row: 3, comment: 'Checked against the paper form', commentedAt: '2026-10-06T09:20:00.000Z' }
// ] }
comments は Row # の昇順に並び、除外中の行のコメントも含みます。行を除外してもコメントは残るためです。row は現在のデータ上の 0 から始まる行インデックスで、除外中の行では null です。
datasets.setRowComments(datasetId, rows, comment)
自分で値を保持しているデータセットの行に、同じコメントを付けます。Data Table の Add comment と Edit comment と同じ操作です。データセット ID またはデータセット名(大文字小文字を区別しない)を指定できます。
const result = await window.midas.datasets.setRowComments('Measurements (raw)', [3], 'Checked against the paper form');
// result.data: { datasetId: 'ds_001', rowNumbers: [3] }
rows には、datasets.excludeRows() と同じく行インデックスの配列か { filter } を渡します。除外中の行は指定できません。既にコメントのある行では、コメントを置き換えます。comment の前後の空白は取り除き、空になるコメントは INVALID_INPUT エラーを返します。コメントを消すには datasets.removeRowComments() を使います。返り値の rowNumbers は、コメントを付けた行の Row # です。
このメソッドは Data Table と違い、データセットが Edit Mode の間も使えます。Data Table が Edit Mode の間 Add comment と Edit comment を出さないのは、Done を押すまで画面上の行と保存済みの行が一致しないことがあるためです。このメソッドは保存済みのデータ上の行インデックスで行を受け取り、コメントを Row # に付けるので、保留中の編集によってコメントが付く行は変わりません。
datasets.removeRowComments(datasetId, rowNumbers)
自分で値を保持しているデータセットの行コメントを削除します。データセット ID またはデータセット名(大文字小文字を区別しない)を指定できます。
const result = await window.midas.datasets.removeRowComments('Measurements (raw)', [3]);
// result.data: { datasetId: 'ds_001', removedRowNumbers: [3] }
rowNumbers には datasets.listRowComments() が返した Row # を渡します。コメントのない Row # を指定すると INVALID_INPUT エラーを返し、何も削除しません。
datasets.remove(id)
データセットをプロジェクトから削除します。データセット ID またはデータセット名(大文字小文字を区別しない)を指定できます。対象データセットを参照しているタブを閉じたあと、依存する派生データセットとモデルをカスケード削除します。
await window.midas.datasets.remove('Iris');
datasets.fetch(id, options?)
データセットの行データを副作用なしで取得します。データセット ID またはデータセット名(大文字小文字を区別しない)を指定できます。
const result = await window.midas.datasets.fetch('Iris', { limit: 5, offset: 0 });
// result.data: {
// datasetId: 'ds_001', name: 'Iris', totalRows: 150, returnedRows: 5,
// columns: ['sepal_length', 'sepal_width', 'petal_length', 'petal_width', 'species'],
// rows: [{ sepal_length: 5.1, sepal_width: 3.5, ... }, ...]
// }
limit と offset で取得範囲を制御します。省略時は全行を返します。MIDAS が内部で追加する行番号列(Row #)は結果に含まれません。まだ評価されていない派生データセットは、評価してから読みます。保存済みプロジェクトを開いた直後や、依存元のデータセットを上書きした直後がこれに当たります。
datasets.buildMapping(datasetId, columnId, input)
文字列列または enum 列のユニーク値に対して value → canonical のマッピングデータセットを生成します。
// Key Collision: 全角統一 → 小文字化
const result = await window.midas.datasets.buildMapping('ds_001', 'city', {
method: { type: 'key_collision', normalizers: ['fullwidth', 'case'] }
});
// result.data: { id: 'primary_...', changedCount: 3, valueCount: 7 }
// Nearest Neighbor: 編集距離
const result2 = await window.midas.datasets.buildMapping('ds_001', 'city', {
method: { type: 'nearest_neighbor', method: 'levenshtein', threshold: 2 }
});
method.type は 'key_collision' または 'nearest_neighbor' を指定します。
Key Collision は決定的な正規化関数を順序付きで適用し、canonical の初期値を生成します。normalizers に適用順で指定します。利用可能な normalizer: 'trim'(前後空白除去)、'fullwidth'(NFKC 正規化)、'kana'(カタカナ→ひらがな)、'case'(小文字化)、'fingerprint'(小文字化・句読点除去・重複排除・トークンソート)。
Nearest Neighbor は距離関数で近傍の値をグルーピングし、クラスタ内の最頻値を canonical の初期値とします。method は 'levenshtein'(編集距離)を指定します。threshold(デフォルト: 2)で距離の閾値を設定します。ユニーク値数の上限は 10,000 です。
overrides で特定の値の canonical を上書きできます。name でデータセット名を指定できます(デフォルト: {source}_{column}_mapping)。
結果は value 列と canonical 列を持つ Primary DataSet です。
datasets.normalize(datasetId, columnId, mappingDatasetId, input?)
マッピングデータセットを使って元データを正規化します。SQL JOIN で value → canonical の変換を適用します。
const result = await window.midas.datasets.normalize('ds_001', 'city', mp.data.id, {
mode: 'replace'
});
// result.data: { id: 'derived_...', name: 'sales_normalized', rowCount: 100, columnCount: 5,
// lineage: { traceable: true } }
mode は 'add'(デフォルト)で {column}_normalized 列を追加、'replace' で元列を COALESCE(canonical, 元値) で置き換えます。name で出力データセット名を指定できます(デフォルト: {source}_normalized)。マッピングデータセットは value 列と canonical 列を持つ任意のデータセットを指定できます。戻り値の lineage は datasets.derive() と同じ、行リネージの静的判定です。
同じ名前で同じ定義の派生データセットが既にあれば、normalize() は新しいデータセットを作らずに既存のものを再利用します。定義が同じとは、元データセット・列・マッピングデータセット・mode がすべて一致することです。再利用したときの戻り値は reused: true で、id と name は既存のデータセットのものです。同じ名前で定義が異なる派生データセットがある場合は DATASET_ALREADY_EXISTS、同じ名前のプライマリデータセットがある場合は NAME_CONFLICT を返します。
datasets.traceRowLineage(datasetId, rowIndices)
派生データセットの指定行に寄与した親データセットの行を 1 ホップ分たどります。SQL クエリで作った派生データセットは、derive クエリの最上段の集約を外して親の Row # を射影する probe クエリに書き換えて再実行し、指定行の値に一致する親行を集めます。列型変換(Convert Column Types)で作った派生データセットも同じ仕組みで、現在の変換設定から組み直した同等のクエリでたどります。filter(Save Filtered Data)・crosstab・reshape(wide/long)で作った派生データセットは、probe を使わず親の列の値を直接照合して寄与行を集めます。
const result = await window.midas.datasets.traceRowLineage('sales_by_region', [0]);
// result.data: { traceable: true, contributions: [{ datasetId: 'ds_001', datasetName: 'sales', rowIndices: [0, 3, 7] }] }
rowIndices は対象データセット内の 0 始まりの行インデックスです。0 以上の整数のみ受け付けます。空配列、非整数、負値はいずれも INVALID_INPUT エラーになります。範囲外の整数は無視します。戻り値の contributions は関与した親データセットごとの寄与行で、JOIN では複数要素になります。各 rowIndices は昇順で重複しません。複数行を渡すと寄与はまとめて返り、行ごとの内訳は付きません。行ごとに調べるには 1 行ずつ呼び出します。
SQL クエリ派生でたどれるのは次の形です。GROUP BY 集計(式によるキー、序数や出力エイリアスでの GROUP BY、集計関数を含まない出力列をキーにする GROUP BY ALL を含む)、JOIN、FROM のサブクエリと CTE、素の射影と WHERE フィルタ、DISTINCT、テーブル全体の集計(全行が寄与)。FROM のサブクエリや CTE が GROUP BY を書かない全体集計のときは、その内側の WHERE や JOIN を通過した親行すべてが外側の各行に寄与します。列型変換で作った派生データセットも同じ形でたどれます。filter・crosstab・reshape(wide/long)で作った派生データセットも対象で、親の列値との一致で寄与行を集めます。
たどれない形のときは traceable: false と reason を返します。
window-function: ウィンドウ関数または QUALIFY 句を含むset-operation: UNION などの集合演算を含むnondeterministic: TABLESAMPLE や ORDER BY を伴わない LIMIT を含むnested-aggregation: FROM のサブクエリや CTE が GROUP BY・GROUP BY ALL・GROUP BY ()・HAVING で集計している。GROUP BY を書かない全体集計でも、その FROM がさらにサブクエリや CTE を含む場合と、外側のテーブルを参照している場合を含むnested-distinct-limit: FROM のサブクエリや CTE の DISTINCT に LIMIT が続き、選ばれる行を親の行に対応付けられないambiguous-group-keys: GROUP BY のキーが出力列に無く、行のキー値を読めない。GROUP BY ALL で*がキーになる場合も含むno-parent-table: FROM が登録済みの親データセットに解決できないno-parent-dataset: 派生だが辿る親データセットを持たない(FROM にデータセットを参照しないSELECT 1のようなクエリなど)not-derived: 対象が派生データセットでないunsupported-operation: 対応していない種別の操作で作られている(SQL クエリ・列型変換・filter・crosstab・reshape 以外)parse-failed: クエリの構造を解析できなかった
reason によっては detail に補足が入ります。解決できなかったテーブル名(no-parent-table)、元の operation 種別(unsupported-operation)、TABLESAMPLE、検出したサブクエリや CTE の名前(nested-aggregation、nested-distinct-limit)などです。
datasets.openContributingRows(datasetId, rowIndices, targetDatasetId?)
派生データセットの指定行に寄与した親(元データ)の行を traceRowLineage と同じ規則でたどり、寄与行だけを含む Contributing rows タブを開きます。JOIN では寄与した親ごとにタブを開きます。
targetDatasetId(データセットの ID または名前)を渡すと、来歴チェーン上の指定した祖先まで複数のホップを内部でまとめて処理し、その祖先の寄与行ビューだけを開きます(途中のタブは開きません)。targetDatasetId は対象データセットのたどれる祖先のいずれかである必要があり、そうでなければ INVALID_INPUT エラーを返します。省略すると直近の親へ 1 段だけたどります。
開いた Contributing rows ビューの行を指定してもう一度呼ぶと、親チェーンをもう 1 段さかのぼります(元データに向かって進みます)。チェーンが primary データセットか、辿る親を持たない派生に行き着くとそこで止まり、traceable: false と reason: 'no-parent-dataset' を返します。これを繰り返すと、集計表から元データまで段階的にたどれます。
Filtered Data タブが表示している一時ビューも起点にできます。この一時ビューは保存前でもフィルタの条件と絞り込み元を保持しているため、tabs.list() が返すタブの datasetId をそのまま渡せます。
const result = await window.midas.datasets.openContributingRows('sales_by_region', [0]);
// result.data: { traceable: true, opened: [{ datasetId: 'dataset-ephemeral-...', parentDatasetId: 'ds_001', parentName: 'sales', rowCount: 12 }] }
// 開いた Contributing rows ビューをさらにさかのぼる
const next = await window.midas.datasets.openContributingRows(result.data.opened[0].datasetId, [0]);
// 特定の祖先まで一気に飛ぶ(中間タブは開かず、その祖先の寄与行ビューだけを開く)
const jumped = await window.midas.datasets.openContributingRows('sales_by_region', [0], 'sales_raw');
rowIndices の扱い(0 始まりの整数で、空配列・非整数・負値は INVALID_INPUT エラー、範囲外の整数は無視)と、たどれる・たどれないの判定規則は traceRowLineage と同じです。たどれないときは何も開かず traceable: false と reason を返します。タブを開くため、アクティブなタブコンテナが無い場合(プロジェクト画面の外から呼んだ場合など)は NO_CONTAINER エラーを返します。
開いたタブの ephemeral データセットは来歴を保持します。タブの「Save as Dataset」で、再評価のたびに寄与行をたどり直す永続データセット(RowLineageOperation)に昇格します。保存するビューが未保存の Filtered Data ビューや Contributing rows ビューに依存しているとき、たとえば未保存の Filtered Data ビューからたどったときは、それらのビューも同時にデータセットとして保存し、保存した来歴はそれを参照します。保存したデータセットが Ephemeral Dataset を参照することはありません。レシピが既存の派生データセットと同じビューは重複して保存せず、保存した来歴は既存のデータセットを参照します。
datasets.selectRows(datasetId, rows)
データセットの行を選択します。書き込む先は UI が読む選択状態と同じなので、選択した行はそのデータセットを表示している Data Table・Statistics・Graph Builder タブでハイライトされます。行選択の仕組みにある UI 操作との対応は次のとおりです。0 始まりの行インデックス配列を渡すと Data Table の行クリックと同じ選択になり、{ filter } を渡すと Graph Builder の矩形選択と同じく条件式つきの選択になります。空配列を渡すと選択を解除します。
// 行インデックスで選択する
await window.midas.datasets.selectRows('bike_daily', [0, 1, 2]);
// 条件式で選択する(Data Table のフィルタと同じ構文)
const result = await window.midas.datasets.selectRows('bike_daily', { filter: 'cnt > 8000' });
// result.data: { datasetId: 'ds_001', selectedRows: [ ... ], selectedColumns: [], selectionExpression: '"cnt" > 8000' }
// 選択を解除する
await window.midas.datasets.selectRows('bike_daily', []);
rows に渡す行インデックスは 0 以上の整数で、データセットの行数未満でなければなりません。非整数、負値、行数以上の値はいずれも INVALID_INPUT エラーになります。重複は取り除き、昇順に並べ替えて保存します。rows.filter の条件式は対象データセットの列に対して検証と評価を行います。構文エラー、存在しない列の参照、列の型として読めない値、値として書いた NULL、string と enum 以外の列への LIKE / ILIKE、文字列でない LIKE / ILIKE のパターンのいずれかを含む式は INVALID_INPUT エラーになります。
条件式で選択したときは戻り値と選択状態に selectionExpression が付きます。selectionExpression は渡した文字列そのものではなく、列名を二重引用符で囲んだ正規形で、そのまま rows.filter に渡し直せます。条件式のある選択は Statistics タブや Graph Builder のグラフを右クリックして Open as Filtered Data を選ぶと Filtered Data タブとして開け、Save as Dataset で派生データセットに昇格できます。行インデックスで選択したときは条件式が無く、このメニューは表示されません。
対象には persistent データセットのほか、Filtered Data タブと Contributing rows タブが表示中の一時ビューも指定できます。一時ビューは tabs.list() が返すタブの datasetId で指定します。
選択状態はタブの表示状態であり、プロジェクトファイルには保存されません。Statistics タブの統計量やモデルの推定は選択の影響を受けません。行を絞って計算したいときは datasets.filter() か datasets.derive() で派生データセットを作ります。
datasets.getSelection(datasetId)
データセットの現在の選択状態を返します。UI の操作(Data Table の行クリック・列クリック、Graph Builder の矩形選択、Statistics のヒストグラムのビン選択)による選択も、selectRows() による選択も同じ状態から読みます。
const result = await window.midas.datasets.getSelection('bike_daily');
// result.data: { datasetId: 'ds_001', selectedRows: [3, 8, 21], selectedColumns: ['cnt'], selectionExpression: '"cnt" > 8000' }
selectedRows はデータセット内の 0 始まりの行インデックスを昇順に並べた配列です。Data Table のフィルタで行を絞っていても、フィルタ後の位置ではなく元のデータセット内の位置を返します。selectedColumns は選択中の列名です。selectionExpression は条件式で選択したときだけ付きます。何も選択していなければ selectedRows と selectedColumns は空配列です。datasetId には selectRows() と同じく一時ビューも指定できます。
enums
enums.create(name, values)
enum 定義を作成します。値は最大 50 個まで設定できます。
const result = await window.midas.enums.create('color', ['red', 'green', 'blue']);
// result.data: { name: 'color', valueCount: 3 }
enums.list()
enum 定義の一覧を取得します。
const result = await window.midas.enums.list();
// result.data: [{ name: 'color', values: ['red', 'green', 'blue'] }, ...]
enums.update(name, values)
既存の enum 定義の値を更新します。
await window.midas.enums.update('color', ['red', 'green', 'blue', 'yellow']);
値は最大 50 個まで設定できます。値を削除する場合、この enum 型の列を持つデータセットに削除対象の値が残っていれば ENUM_VALUE_MISMATCH で拒否されます。enum 列の値は常に定義内または NULL である不変条件を維持するためです。先に Convert Column Types タブで該当値を NULL 化または除外するか、値を残したまま定義に保持してください。Filtered Data タブなどが持つ ephemeral データセットの列だけに残っている値は拒否されず、その列では null になります。
enums.remove(name)
enum 定義を削除します。列がまだこの enum を参照している場合は ENUM_IN_USE エラーで拒否されます。ephemeral データセットの列だけが参照している場合は拒否されず、その列は string 型になります。
await window.midas.enums.remove('color');
tabs
tabs.list()
開いているタブの一覧を取得します。
const result = await window.midas.tabs.list();
// result.data: [{ id, type, title, paneId, isActive, datasetId?, targetDatasetId?, editingDatasetId?, reportId?, modelId? }, ...]
paneId はそのタブが置かれているペインの ID です。isActive はそのペインで前面に表示されているタブで true になります。ペインごとに 1 つのタブが前面にあるため、複数のペインが開いていれば isActive が true のタブも複数あります。ペインの構成は layout.get() で取得します。
タブがリソースを表示・参照している場合、その ID が datasetId(表示中のデータセット)、targetDatasetId(分析対象のデータセット)、editingDatasetId(編集タブが操作を編集しているデータセット)、reportId、modelId として含まれます。これらのキーは該当があるタブにだけ現れます。ただし、Statistics タブと Selected Columns タブはデータセットを保持せず、アクティブな Data Table タブのデータセットを表示します。この 2 つのタブが表示しているデータセットは datasetId からは判定できません。特定のデータセット・レポート・モデルをどのタブが開いているかは、この ID で絞り込んで判定できます。
// データセット ds_001 を表示・参照しているタブを探す
const tabs = (await window.midas.tabs.list()).data.filter(
t => t.datasetId === 'ds_001' || t.targetDatasetId === 'ds_001' || t.editingDatasetId === 'ds_001'
);
tabs.activate(tabId)
開いているタブを前面に出します。UI でタブをクリックしたときと同じ操作です。そのタブのあるペインがアクティブなペインになるため、以後の tabs.open() はそのペインに新しいタブを開きます。
await window.midas.tabs.activate('tab_001');
tabs.open(config)
新しいタブを開きます。datasetId にはデータセット ID またはデータセット名(大文字小文字を区別しない)を指定できます。graph-builder タブではデータセットがタブに紐づき、データセット選択欄と tabs.getGraphBuilder() に反映されます。
一部のタブは、現在のワークスペースに 1 枚だけ開きます。report、model-detail、glm-diagnostics、sql-query-viewer、computed-column、column-type-conversion、orthogonal-polynomials は指定した対象だけで、project-overview、project-lineage、project-diff、enum-definition、help はタブの種別だけで表示内容が決まるためです。同じ内容のタブが既にあれば、新しいタブを作らずにそのタブを前面に出します。このとき戻り値の id は既存タブの ID です。既存タブが別のペインにあれば、そのペインがアクティブなペインになります。以後の tabs.open() はそのペインに新しいタブを開きます。対象を特定する以外の指定(title・datasetId・tabViewState)は既存タブに反映されず、warnings で報告します。
statistics と selected-columns の 2 つのタブは、ペインごとに 1 枚だけ開きます。データテーブルの隣に並べて使うため、別のペインをアクティブにして呼べば 2 枚目を開けます。アクティブなペインに同じ種別のタブがあれば、そのタブを前面に出します。この 2 つのタブは自分ではデータセットを持たず、アクティブな Data Table タブのデータセット(そのフィルタを含む)を表示します。datasetId を渡すと INVALID_INPUT エラーになります。特定のデータセットの統計を見るには、先にそのデータセットを data-table タブで開きます。
editingDatasetId に派生データセットの ID または名前を渡すと、Project Overview の Edit Operation... と同じ編集タブを開きます。編集タブで保存すると、そのデータセットの ID を変えずに操作の定義が更新されます。type には、データセットの操作を編集するタブの種別を次の表から指定します。操作の種別は datasets.describe() の operation.type で確認できます。
| 操作の種別 | タブの種別 |
|---|---|
sql_query | sql-editor |
synthetic_generation | synthetic-data-generator |
crosstab | crosstab |
dummy_coding | dummy-coding |
wide_to_long、long_to_wide | reshape |
computed_column | computed-column |
column_type_conversion | column-type-conversion |
filter | filtered-data |
tabs.open() は、編集できないデータセットと、編集タブに合わない指定をエラーで拒否します。type が表の種別と異なると INVALID_TAB_TYPE_FOR_OPERATION エラーになり、suggestion が正しい種別を示します。primary データセットと、モデルから保存したデータセットのように操作を編集できない派生データセットは INVALID_INPUT エラーになります。編集タブの内容は編集対象の操作だけで決まるため、datasetId・modelId・reportId・initialQuery・initialOutputName・tabViewState を同時に渡しても INVALID_INPUT エラーになります。同じデータセットを編集する sql-editor・synthetic-data-generator・computed-column・column-type-conversion のタブは、ワークスペースに 1 枚だけ開きます。
上に挙げていないタブは、呼ぶたびに新しいタブを開きます。編集対象を指定しない sql-editor のように、タブごとの入力内容を持つタブが該当します。
// Graph Builder を開く
const result = await window.midas.tabs.open({
type: 'graph-builder',
title: 'My Graph',
datasetId: 'ds_001'
});
// result.data: { id: 'tab_...', type: 'graph-builder', title: 'My Graph' }
// SQL Query Editor を開く
const result2 = await window.midas.tabs.open({
type: 'sql-editor',
initialQuery: 'SELECT * FROM Iris LIMIT 10',
initialOutputName: 'Preview'
});
// SQL から作った派生データセットの編集タブを開く
const result3 = await window.midas.tabs.open({
type: 'sql-editor',
editingDatasetId: 'Iris Subset'
});
利用可能なタブタイプ:
| タイプ | 説明 |
|---|---|
graph-builder | Graph Builder |
sql-editor | SQL Query Editor |
synthetic-data-generator | Synthetic Data Generator |
glm | GLM |
glmm | GLMM |
random-forest | Random Forest |
linear-regression | 線形回帰 |
pca | 主成分分析 |
statistics | 記述統計 |
crosstab | クロス集計 |
anova | ANOVA |
kaplan-meier | Kaplan-Meier |
cox-regression | Cox 回帰 |
arima | ARIMA |
data-table | データテーブル |
report | レポート(reportId が必要) |
computed-column | 計算列 |
dummy-coding | ダミーコーディング |
orthogonal-polynomials | 直交多項式 |
reshape | データ整形 |
column-type-conversion | 型変換 |
enum-definition | enum 定義 |
project-overview | プロジェクト概要 |
project-lineage | Project Lineage |
selected-columns | 選択列の詳細 |
filtered-data | フィルタ済みデータ |
model-detail | モデル詳細(modelId が必要) |
glm-diagnostics | GLM 診断(modelId が必要) |
glm-prediction | GLM 予測(modelId が必要) |
sql-query-viewer | SQL クエリビューア |
variant-normalization | 表記揺れ正規化 |
apply-mapping | マッピング適用 |
project-diff | プロジェクト差分 |
help | ヘルプ |
report タブには reportId、model-detail・glm-diagnostics・glm-prediction タブには modelId の指定が必須です。modelId には models.list() で取得した保存済みモデルの ID を指定します。省略すると INVALID_INPUT エラーを返します。
selected-columns タブが表示対象とする列選択は、人が画面を操作するためのビュー状態です。API からは datasets.getSelection() で読めますが、書き込む操作はありません。エージェントが列の統計を取得するには datasets.profile() を使います。
// モデル詳細タブを開く
const result3 = await window.midas.tabs.open({
type: 'model-detail',
modelId: 'model_001'
});
glm-diagnostics タブは GLM と線形回帰(linear_regression)の両方のモデルを開けます。線形回帰モデルでは Deviance/Pearson 残差の切り替えを省き、見出しを Residual Diagnostics に変えて表示します。
models.run() が対応するモデルタイプは glm、glmm、random_forest、arima、linear_regression、anova、pca、kaplan_meier、cox_regression の 9 個です。対応するタブ(glm、glmm、random-forest、arima、linear-regression、anova、pca、kaplan-meier、cox-regression)およびその他の分析タブ(crosstab、statistics)はすべて tabs.open() で開けますが、上記 9 タイプ以外は API から実行できず、設定と実行は GUI で行います。
tabs.duplicate(tabId)
分析タブを複製し、独立したコピーを隣に開きます。コピーは現在の設定(predictors・次数・応答変数など)を引き継ぎますが、実行結果とモデル保存状態は引き継ぎません。パラメータを変えて再フィットし、2 つの結果を並べて比較できます。複製できるのは分析タブ(glm、glmm、anova、linear-regression、cox-regression、kaplan-meier、pca、random-forest、arima)に限られ、それ以外のタブタイプは INVALID_TAB_TYPE_FOR_OPERATION エラーを返します。UI ではタブを右クリックして Duplicate Tab を選ぶと同じ操作になります。
const result = await window.midas.tabs.duplicate('arima_001');
// result.data: { id, type, title }
tabs.close(id)
タブを閉じます。
await window.midas.tabs.close('tab_001');
tabs.closeOthers(keepTabId)
指定したタブ以外をすべて閉じます。
const result = await window.midas.tabs.closeOthers('tab_001');
// result.data: { closedCount: 3 }
tabs.getGraphBuilder(tabId)
Graph Builder タブの設定を取得します。
const result = await window.midas.tabs.getGraphBuilder('tab_001');
// result.data: { tabId, graphType, datasetId, config, aspectRatio,
// availableColumns, lineageTargetDatasetId, availableLineageTargets, renderWarnings? }
renderWarnings には、現在の設定で Graph Builder のプレビュー上部に表示される診断メッセージが入ります。1 要素が 1 メッセージです。例として、描く値が 1 つも残らずに消えた群、position が fill で構成比を出せずに落ちた X 座標、統計量や区間を計算できなかった群とその理由、計算できなかった点の除外、グループ内での同一 X 値の重複、shape や linetype のカテゴリ数が割り当てた形状・線種の種類数を超えたこと、position が stack または fill の Area レイヤーで系列が正負両方の値を持つこと、Boxplot 統計で有効値が 5 個未満の群や四分位範囲が 0 の群があること、Label レイヤーの labelContent に指定したフィールドの値がどの点でも取れないこと、レイヤーの filter の式を構文として解釈できないことが入ります。消えた群と計算できなかった群のメッセージには、群を特定する値が引用符付きで並びます。これらの例に挙げた診断はグラフの描画自体を妨げません。labelContent の診断が出たレイヤーはラベルを 1 つも描かず、filter の診断が出たレイヤーは何も描きませんが、グラフの他の内容は描画されます。グラフが描画されない唯一の場合はファセットのパネル数上限で、パネル数が上限(Settings の Max Facet Panels)を超えたことを示す警告が入ったときは、グラフは描画されていません。診断がなければこのフィールドは省略されます。評価するのは graphType が 'custom' でデータセットを選択している場合だけです。描画したサイズで決まる診断(right または left に置いた凡例がグラフの高さに収まらず一部のカテゴリまたは凡例全体を表示していない、あるいはグラフの幅に収まらず凡例を表示していない)は画面上の警告にだけ表示され、このフィールドには入りません。ファセットを設定したグラフでは、診断はパネル単位で評価され、プレビューの警告ストリップと同じ形式(警告が出たパネルのタイトルを前置し、全パネル共通の警告は All panels: の 1 行に集約)で入ります。
tabs.addGraphLayer(tabId, layer, options?)
カスタムグラフにレイヤーを追加します。graphType が 'custom' のタブでのみ使用できます。
マルチパネル構成のタブでは、第 3 引数 options の panelIndex で追加先のパネルを指定します。マルチパネル構成では各パネルの layers だけが描画されるためで、panelIndex を省略した呼び出しは失敗し、エラーメッセージがパネルの指定を求めます。追加に成功すると result.data に、そのパネル内の添字 layerIndex と panelIndex が入ります。マルチパネル構成の設定方法は configureGraph の panels を参照してください。
await window.midas.tabs.addGraphLayer('tab_001', {
geom: { type: 'line' },
aes: { y: 'pop' }
}, { panelIndex: 1 });
// result.data: { layerIndex: 1, panelIndex: 1 }
const result = await window.midas.tabs.addGraphLayer('tab_001', {
geom: { type: 'point' },
aes: { x: 'sepal_length', y: 'sepal_width', color: 'species' }
});
// result.data: { layerIndex: 0 }
Aesthetic マッピング (aes) ではカラム名またはカラム ID を指定します。カラム名は大文字小文字を区別せずに解決されます。利用可能なプロパティは x、y、color、fill、stroke、size、shape、alpha、linetype、ymin、ymax、label、group、weight です。すべてのプロパティがすべての geom type で使えるわけではありません。例えば Point と Line は fill に対応していません。weight は行の頻度重みの数値カラムを指定するプロパティで、geom の描画には影響せず、重みに対応した stat(roc)だけが読み取ります。aes はカラム参照のみを受け付けます。固定の色・サイズ・不透明度は aes ではなく geom.defaults で設定します。Geometry ごとに指定できる geom.defaults のキーは Custom Graph Reference に一覧があります。aes に固定値({ fixedColor: '#FF0000' } や数値)を渡すと INVALID_INPUT エラーになります。stats を省略した場合はデフォルトで identity が設定されます。position を省略した場合、bar geom では { type: "stack" }(積み上げ)、それ以外の geom では identity がデフォルトです。使用できる position type は geom と primary stat(stats の先頭)の組み合わせで決まります(例: line は identity のみ、Boxplot stat は stack / fill と組み合わせられません)。使用できない position を指定すると INVALID_INPUT エラーが返ります。position を省略し、geom の既定 position が stat と組み合わせられない場合は identity が設定され、warning が返ります。scales でレイヤー固有のスケール(color、fill、shape、linetype、size、alpha)を設定できます。詳細は configureGraph のレイヤースケールの説明を参照してください。
追加するレイヤーは、保存の前に、描画側がレイヤーごとに行う検証にかけられます。検証の対象は、geom ごとの必須 aesthetic(Text geom の label、Error Bar の ymin / ymax など)、軸に割り当てた列の型、パレットとスケール種別の互換性です。レイヤーに適用される軸のスケールが type: 'log' または type: 'sqrt' の場合は、その軸の x または y に割り当てた列が定義域外の値を含まないことと、その軸に指定した domain が定義域内にあることも検証します。定義域は、log では 0 より大きい有限の値、sqrt では 0 以上の有限の値です。この検証は、描画側と同じく、タブのフィルタ式(filterExpression)を適用した後に残る行だけを読みます。派生データセットの data がまだ計算されていない場合は列の値を読めないため、指定した domain だけを検証し、値を検証しなかったことを警告で知らせます。検証を通らないレイヤーも保存され、呼び出しは成功します。レイヤーを複数回の呼び出しで段階的に組み立てられるようにするためです。検証を通らなかった内容は warnings で報告され、解消するまでグラフは描画されません。
Label geom ({ type: 'label' }) で集約 stat(summary, count, bin 等)を使う場合、aes.label で指定した列は集約時に失われます。代わりに geom.defaults.labelContent で stat 出力変数を参照できます。
await window.midas.tabs.addGraphLayer(tabId, {
geom: {
type: 'label',
defaults: {
labelContent: { field: '$y', format: '.1f', prefix: 'Mean: ' }
}
},
stats: [{ type: 'summary', params: { outputs: [{ fun: 'mean', to: 'y' }] } }],
});
labelContent のプロパティ:
| プロパティ | 型 | 説明 |
|---|---|---|
field | string | 表示するフィールド。$x、$y、$n 等の stat 変数、またはカラム名かカラム ID。カラム名は大文字小文字を区別せずに解決されます。解決できない値を指定すると COLUMN_NOT_FOUND エラーになります |
format | string | d3-format 形式の書式指定(例: .2f、,.0f) |
prefix | string | 値の前に付ける文字列 |
suffix | string | 値の後に付ける文字列 |
labelContent が設定されている場合、aes.label は不要です。
Text geom ({ type: 'text' }) では aes.label が必須です。labelContent を参照するのは Label geom だけで、Text geom に指定しても表示されるテキストは変わりません。
レイヤーには以下のオプションプロパティも指定できます。
| プロパティ | 型 | 説明 |
|---|---|---|
name | string | レイヤーの表示名 |
filter | string | レイヤーのデータを絞り込むフィルタ式。構文は Data Table タブのフィルタ入力欄と同じで(Data Table タブ を参照)、検証も同じ規則で行うため、構文の誤り、存在しない列名、列の型と噛み合わない値、値として書いた NULL、string と enum 以外の列への LIKE / ILIKE、文字列でない LIKE / ILIKE のパターンのいずれかを含む式は INVALID_INPUT を返します |
visible | boolean | レイヤーの表示/非表示(デフォルト true) |
yAxis | 'primary' | 'secondary' | 使用する Y 軸 |
showLegend | 'auto' | 'show' | 'hide' | レイヤーの凡例表示 |
clickSelection | boolean | データポイントのクリック選択を有効にする |
tooltip | array | { content: 'encoding' } | データポイントにカーソルを合わせたときの表示内容。詳細は後述 |
tooltip にフィールド定義の配列を指定すると、カーソルを合わせたときに指定した値を表示します。{ content: 'encoding' } を指定すると、レイヤーの aes からフィールドを自動生成します。position が fill のレイヤーでは、自動生成される $y のラベルに (% of total) が付き、値はパーセント形式で表示されます。配列で $y を指定した場合も、format を省略するとパーセント形式になり、label を省略すると % of total が付きます。分母は各 X 位置の値の絶対値合計です。同じ設定で、割合になった軸の自動生成タイトルにも (% of total) が付き、目盛りはパーセント表示になります。詳細は 構成比で積み上げる を参照してください。tooltip を省略すると表示されません。
await window.midas.tabs.addGraphLayer(tabId, {
geom: { type: 'point' },
aes: { x: 'sepal_length', y: 'sepal_width' },
tooltip: [
{ field: '$x', label: 'Sepal Length' },
{ field: 'species' }
]
});
Tooltip フィールドのプロパティ:
| プロパティ | 型 | 説明 |
|---|---|---|
field | string | 表示するフィールド。$x、$y、$n 等の stat 変数、またはカラム名/カラム ID |
label | string | カスタムラベル(省略時はラベルなし、値のみ表示) |
format | string | d3-format 形式の書式指定(例: .2f、,.0f) |
type | 'datetime' | 'date' | タイムスタンプを日付/日時文字列として表示 |
利用可能な geom、stat、position の一覧は Custom Graph リファレンスを参照してください。各 Statistic の params は指定可能な値とデフォルト値とともに同ページに掲載しています。ファセット、座標系などグラフレベルのオプションは Custom Graph を参照してください。
tabs.updateGraphLayer(tabId, layerIndex, layer, options?)
既存のレイヤーを部分更新します。指定したフィールドのみが変更され、省略したフィールドは既存の値を保持します。指定できるフィールドは addGraphLayer と同じで、name、geom、aes、stats、position、scales、tooltip、filter、visible、yAxis、showLegend、clickSelection を同じ意味で変更できます。マルチパネル構成のタブでは、第 4 引数 options の panelIndex で対象のパネルを指定し、layerIndex はそのパネル内の添字です。
await window.midas.tabs.updateGraphLayer('tab_001', 0, {
geom: { type: 'line' }
});
geom または stats を変更した際、現在の position(未設定の場合は geom の既定)が変更後の geom と stat の組み合わせで許可されない場合は identity に自動リセットされ、warning が返ります。許可されない position を明示指定した場合は INVALID_INPUT エラーが返ります。
更新後のレイヤーも addGraphLayer と同じ検証にかけられます。検証の対象は更新内容そのものではなく、更新を既存のレイヤーへマージした結果です。geom の変更で必須 aesthetic が不足した場合、新しい geom が読まない aes が残った場合(設定には残りますが描画されません)、aes の差し替えでレイヤーの scaleType が割り当て列の型と噛み合わなくなった場合は、いずれも warnings で報告されます。aes または yAxis を変える更新では、軸のスケールの定義域の検証もやり直します。この 2 つは、軸に割り当てる列と、Y と Y2 のどちらのスケールを適用するかを決めるからです。
scales: null を渡すとレイヤー固有のスケールを削除し、既定のスケールに戻します。position: null で position をデフォルト(未設定)にリセットできます。tooltip: null を渡すと Tooltip を削除します。filter: null または空文字を渡すとレイヤーのフィルタを解除します。
tabs.removeGraphLayer(tabId, layerIndex, options?)
レイヤーを削除します。マルチパネル構成のタブでは、第 3 引数 options の panelIndex で対象のパネルを指定し、layerIndex はそのパネル内の添字です。パネルの最後のレイヤーも削除できますが、すべてのパネルがレイヤーを持つまでグラフは描画されず、warnings で通知されます。
await window.midas.tabs.removeGraphLayer('tab_001', 0);
tabs.moveToPane(tabId, toPaneId)
タブを別のペインに移動します。移動先のペインの ID は layout.get() で取得します。タブを並べるためにペインを新しく作る場合は、layout.split() が返す ID を指定します。
await window.midas.tabs.moveToPane('tab_001', 'pane_002');
tabs.setDataset(tabId, datasetId)
タブのデータセットを切り替えます。datasetId にはデータセット ID またはデータセット名(大文字小文字を区別しない)を指定できます。graph-builder タブでは、切り替えたデータセットがデータセット選択欄と tabs.getGraphBuilder() に反映されます。statistics と selected-columns のタブはアクティブな Data Table タブのデータセットを表示するため、このメソッドの対象にできません。指定すると INVALID_INPUT エラーになります。それ以外の種別のうち、このメソッドが受け付けるのは、開いているタブが切替に追従する種別だけです。対象は data-table・sql-query-viewer・graph-builder・crosstab・reshape・variant-normalization・glm・glmm・linear-regression・random-forest・pca・anova・arima・kaplan-meier・cox-regression です。これ以外の種別のタブは開いた後の切替に追従しないため、指定すると INVALID_INPUT エラーになります。
computed-column・dummy-coding・orthogonal-polynomials・column-type-conversion のタブも、拒否する種別に含まれます。これらのタブはタブ内の選択欄でデータセットを選び直せますが、このメソッドによる切替には、開いているタブが追従しません。Agent API では、同じ操作を datasets.addColumns()・datasets.dummyCode()・datasets.addOrthogonalPolynomials()・datasets.setColumnSchema() でデータセットに直接実行できます。
列を参照する設定は、タブの画面でデータセットを選び直したときと同じ規則で扱います。crosstab タブは切替先に同名の列(値フィールドは数値型の列)があるフィールドを引き継ぎ、reshape タブは同名の列がある列設定を引き継ぎます。graph-builder タブはフィルタ式と lineageTargetDatasetId を消します。Custom Graph では、configureGraph と同じく、切替先のデータで log または sqrt の軸の定義域外の値をレイヤーごとに検証し、問題を result.warnings で報告します。回帰・生存分析・PCA など変数を列 ID で選ぶタブは変数選択を消します。引き継げずに外した設定は result.warnings に載ります。同じデータセットを指定した場合は設定を変えません。
const result = await window.midas.tabs.setDataset('tab_001', 'ds_002');
// result.warnings: ["Removed fields not present in the selected dataset: region"]
tabs.configureGraph(tabId, config)
Graph Builder タブを一括設定します。graphType でグラフタイプを選びます。datasetId にはデータセット ID またはデータセット名(大文字小文字を区別しない)を指定でき、空文字を渡すとデータセットの紐づけを解除します。カラム名は大文字小文字を区別せずに解決されます。GraphConfigInput や LayerDefInput に存在しないプロパティが渡された場合は result.warnings で通知されます。
layers に渡したレイヤーは addGraphLayer と同じ検証にかけられ、必須 aesthetic の不足などの問題は warnings で報告されます。layers を省略して globalAes だけを差し替えた場合も、既存のレイヤーを新しい globalAes とあわせて再検証します。scales、layers、panels、globalAes、datasetId、filterExpression のいずれかを渡した場合は、グラフのすべてのレイヤーについて、保存後の設定とフィルタ式で軸のスケールの定義域も検証します。非表示のレイヤーも検証します。描画側も、この検証を通らない非表示のレイヤーがあるとグラフを描画しないためです。パネル内のレイヤーでは、パネルに yScale があれば scales.y の代わりにそれを使います。いずれの場合も、この検証で出る警告には、どのレイヤーの警告かを示すため、先頭にレイヤーの呼び名が付きます。ただし、データセットの data がまだ計算されておらず列の値を検証しなかったことを示す警告は、グラフ全体についての警告なので呼び名が付きません。呼び名はレイヤーの名前で、名前のないレイヤーでは 0 から数えた位置を使って Layer 0 の形になります。panels のパネル内のレイヤーでは、パネルの呼び名とレイヤーの呼び名を / でつないだ "Top"/Layer 0 の形になり、名前のないパネルは panels[1] のように位置で呼びます。filterExpression にはグラフ全体の行を絞り込むフィルタ式を指定します。構文は Data Table タブのフィルタ入力欄と同じです。
await window.midas.tabs.configureGraph('tab_001', {
graphType: 'custom',
datasetId: 'ds_001',
layers: [
{ geom: { type: 'point' }, aes: { x: 'weight', y: 'height', color: 'group' } }
],
aspectRatio: '4:3'
});
coordinates で座標系を設定できます。'flipped' は X 軸と Y 軸を入れ替えます(カテゴリ名が長い横棒グラフなどに有用です)。'cartesian' はデフォルトのデカルト座標系に戻します。
await window.midas.tabs.configureGraph('tab_001', {
coordinates: 'flipped'
});
scales で軸スケールを設定できます。configureGraph で scales を渡すと、指定した軸のみ上書きし、指定しなかった軸の設定は保持されます。指定しなかった軸は、その軸に割り当てた列の型からスケールを推論します。date・datetime 列は time、カテゴリカル列は categorical、数値列は linear になります。順序尺度の enum 列では、推論した categorical スケールの limits に enum 定義の値順序が入ります。明示的に指定したスケールが優先されます。
await window.midas.tabs.configureGraph('tab_001', {
scales: { y: { type: 'log', title: 'Log scale' } }
});
scales の各軸(x、y、y2)には以下を指定できます。
| プロパティ | 型 | 説明 |
|---|---|---|
type | 'linear' | 'log' | 'sqrt' | 'time' | 'categorical' | スケールの種類 |
title | string | 軸タイトル |
domain | { min?, max? } | 連続スケールの範囲(categorical では無効) |
tickCount | number | 目盛りの数(categorical では無効) |
limits | string[] | カテゴリの表示順(categorical 用) |
breaks | string[] | 表示するカテゴリのサブセット(categorical 用) |
labels | Record<string, string> | カテゴリのカスタム表示名(categorical 用) |
labelRotation | 'auto' | 0 | 45 | 90 | ラベルの回転角度 |
zoomEnabled | boolean | false でこの軸をズーム・パン操作から外す(categorical では無効。既定 true) |
titlePadding | number | 軸タイトルと目盛りラベルの間隔(ピクセル。既定は X 軸 15、Y 軸 6) |
labelPadding | number | 目盛りラベルと目盛り線の間隔(ピクセル。既定 3) |
limits はカテゴリ軸の表示順を決めます。limits に並べた値がその順序で先に並び、limits に載せなかった値はその後ろに続きます。limits を指定しない場合、enum 列は enum の定義順に、数値列は数値の順に、それ以外の列は文字列として比較した順に並びます。
レイヤーごとのスケールは layers[].scales で設定します。color、fill、shape、linetype、size、alpha の各 aesthetic に対して個別にスケールを指定できます。レイヤーごとの Tooltip は layers[].tooltip で設定します(詳細は addGraphLayer を参照)。
await window.midas.tabs.configureGraph('tab_001', {
graphType: 'custom',
datasetId: 'ds_001',
layers: [{
geom: { type: 'tile' },
aes: { x: 'col_x', y: 'col_y', fill: 'col_value' },
scales: { fill: { scaleType: 'sequential', paletteId: 'viridis' } }
}]
});
レイヤースケールの color / fill には以下を指定できます。
| プロパティ | 型 | 説明 |
|---|---|---|
scaleType | 'categorical' | 'sequential' | 'diverging' | 'threshold' | カラースケールの種類 |
paletteId | string | パレット ID。有効な値の一覧は Custom Graph リファレンス を参照 |
domain | { min?, max?, center? } | 連続スケールのドメイン |
legendPosition | 'right' | 'left' | 'top' | 'bottom' | 'none' | 凡例の位置 |
legendTitle | string | 凡例のタイトル |
thresholds | number[] | 閾値の配列(threshold 用) |
thresholdColors | string[] | 各領域の色(threshold 用、長さ = thresholds.length + 1) |
thresholdVariable | 'x' | 'y' | 閾値の比較に使う変数(threshold 用、デフォルト 'y') |
scaleType の実効値は、指定した値と列の型から決まります。省略すると、fill は数値列では sequential、それ以外の列では categorical になります。color は常に categorical になります。数値列でない列に sequential または diverging を指定した場合、MIDAS は列の型を優先してその aesthetic を categorical スケールで描画し、設定時の応答の warnings と診断メッセージ(renderWarnings)で通知します。ただし paletteId に diverging 用のパレットも指定されている場合は、実効の categorical スケールと非互換になるため検証エラーになり、グラフは描画されません。sequential 用のパレットは categorical スケールでも使えるため、検証エラーになりません。非互換の組は設定時の応答の warnings で通知され、reports.addGraph / reports.updateElement では renderStatus が 'error' になります。
レイヤースケールの shape / linetype には以下を指定できます。
| プロパティ | 型 | 説明 |
|---|---|---|
shapes | ('circle' | 'square' | 'triangle' | 'diamond' | 'cross' | 'plus')[] | カテゴリへ割り当てる形状の並び(shape 用) |
linetypes | ('solid' | 'dashed' | 'dotted')[] | カテゴリへ割り当てる線種の並び(linetype 用) |
legendPosition | 'right' | 'left' | 'top' | 'bottom' | 'none' | 凡例の位置 |
legendTitle | string | 凡例のタイトル |
並びの 1 番目が最初のカテゴリに対応します。カテゴリ数が並びの長さを超えると、並びの先頭から繰り返し割り当てられます。未知の形状名・線種名は取り除かれ、warnings で通知されます。凡例の位置はグラフ全体で 1 つです。凡例を表示する最初のレイヤーの設定を、color、fill、shape、linetype の順で探して採用します。探す対象は列を割り当てている aesthetic だけです。列を割り当てていない aesthetic の legendPosition は凡例の位置に影響せず、warnings で通知されます。
レイヤースケールの size / alpha には値域だけを指定できます。この 2 つの aesthetic は凡例を描画しません。
| プロパティ | 型 | 説明 |
|---|---|---|
range | { min?, max? } | 描画に使う値域。size の既定は 2-20(ピクセル)、alpha の既定は 0.2-1 |
size の値域は 0 以上、alpha の値域は 0 から 1 に収まります。範囲外の値は端へ丸められ、warnings で通知されます。
await window.midas.tabs.configureGraph('tab_001', {
graphType: 'custom',
datasetId: 'ds_001',
layers: [{
geom: { type: 'point' },
aes: { x: 'weight', y: 'mpg', shape: 'origin', size: 'horsepower' },
scales: {
shape: { shapes: ['square', 'triangle', 'diamond'], legendTitle: 'Origin' },
size: { range: { min: 4, max: 30 } }
}
}]
});
facets でカテゴリ変数によるパネル分割(ファセット)を設定できます。wrap(1 変数で自動配置)と grid(行・列の 2 変数)の 2 種類があります。
// Facet wrap: 1 変数でパネル分割
await window.midas.tabs.configureGraph('tab_001', {
facets: { type: 'wrap', variable: 'species', ncol: 3, scales: 'free_y' }
});
// Facet grid: 行・列の変数でパネル分割
await window.midas.tabs.configureGraph('tab_001', {
facets: { type: 'grid', rows: 'region', cols: 'year' }
});
// ファセットを解除
await window.midas.tabs.configureGraph('tab_001', { facets: null });
panels でマルチパネル構成を設定できます。マルチパネル構成は Graph Builder の Multi-Panel セクションの Enable Multi-Panel Mode と同じ機能で、複数のパネルを縦に並べ、X 軸を共有してズームとパンを連動させます。管理図や時系列分解のように、同じ X 軸で複数の量を並べて見るときに使います。各パネルは layers に描画するレイヤーを持ちます。yScale はパネル固有の Y 軸スケールで、scales の各軸と同じプロパティを指定でき、省略したパネルは scales.y を使います。heightRatio は高さの比率(既定 1)、name はパネル左上に表示する名前です。
マルチパネル構成では各パネルの layers だけが描画され、グラフ全体の layers と facets は描画されません。そのため panels を持つタブへ layers や facets を渡す呼び出しは失敗します。パネル内のレイヤーは addGraphLayer / updateGraphLayer / removeGraphLayer に panelIndex を渡して編集します。panels を設定すると既存の facets は解除され、warnings で通知されます。panels: null を渡すと単一パネルの構成に戻ります。このとき layers を渡さなければ、全パネルのレイヤーを順に連結したものがグラフの layers になります。
await window.midas.tabs.configureGraph('tab_001', {
graphType: 'custom',
datasetId: 'ds_001',
globalAes: { x: 'year' },
panels: [
{ name: 'Life expectancy', layers: [{ geom: { type: 'line' }, aes: { y: 'lifeExp' } }], heightRatio: 2 },
{ name: 'Population', layers: [{ geom: { type: 'line' }, aes: { y: 'pop' } }], yScale: { type: 'log' } }
]
});
// 単一パネルの構成に戻す
await window.midas.tabs.configureGraph('tab_001', { panels: null });
brush でブラシ選択の方向を設定できます。ブラシ選択は、グラフツールバーの Select モードで矩形を描いて点を選ぶ操作です。direction が 'xy' なら 2 次元の矩形で、'x' なら X 軸方向の範囲で、'y' なら Y 軸方向の範囲で選びます。省略時は 'xy' です。brush: null を渡すと既定に戻ります。
await window.midas.tabs.configureGraph('tab_001', { brush: { direction: 'x' } });
facets を省略すると既存の設定が保持されます。
Facet wrap のプロパティ:
| プロパティ | 型 | 説明 |
|---|---|---|
type | 'wrap' | Facet wrap モード |
variable | string | 分割するカラム名またはカラム ID(必須) |
ncol | number | 列数。1 以上の整数(省略時は自動計算) |
nrow | number | 行数。1 以上の整数(省略時は自動計算) |
complete | boolean | 全組み合わせのパネルを表示して欠損を補完する |
scales | 'fixed' | 'free_x' | 'free_y' | 'free' | パネル間の軸スケール共有方法(デフォルト: 'fixed') |
Facet grid のプロパティ:
| プロパティ | 型 | 説明 |
|---|---|---|
type | 'grid' | Facet grid モード |
rows | string | 行方向の分割カラム名またはカラム ID |
cols | string | 列方向の分割カラム名またはカラム ID |
complete | boolean | 全組み合わせのパネルを表示して欠損を補完する |
scales | 'fixed' | 'free_x' | 'free_y' | 'free' | パネル間の軸スケール共有方法(デフォルト: 'fixed') |
Facet grid では rows と cols の少なくとも一方が必要です。
graphType に histogram、scatter、timeseries、bar、pairplot、datetime_histogram を指定すると、そのタイプ固有のフィールドを設定できます。layers、globalAes、scales、coordinates、facets は custom でのみ有効です。
await window.midas.tabs.configureGraph('tab_001', {
graphType: 'histogram',
datasetId: 'ds_001',
column: 'sepal_length',
bins: 20
});
column や xColumn、categoryColumn などの列を指定するフィールドは、カラム名またはカラム ID のどちらでも指定できます。タイプ固有のフィールドは次のとおりです。
| グラフタイプ | フィールド |
|---|---|
histogram | column、bins、relativeFrequency、showDensity、orientation、groupByColumn、groupMode、facetNcol、showAnnotations |
scatter | xColumn、yColumn、colorColumn、sizeColumn、referenceLines、xScaleType、yScaleType、密度可視化系(displayMode、densityVisualization、densityBandwidth、contourLevels、densityColorScale) |
timeseries | xColumn、yColumns、rangeColumns、rangeOpacity |
bar | categoryColumn、valueColumns、aggregations、orientation、showValues、stackMode、sortOrder、topN |
pairplot | columns |
datetime_histogram | column、interval、showTrend |
histogram の bins は 1 以上 100 以下の整数です。範囲外の値や整数でない値を指定すると、範囲内へ丸めた値を保存し、warnings で報告します。数値でない値や非有限の値は保存せず、同じく warnings で報告します。
bar の valueColumns には集計対象のカラムのほか、行数を数える '$count' を指定できます。aggregations はカラムごとの集計方法(sum・average・median・min・max)を指定します。行数のカウントは集計方法ではなく valueColumns の '$count' で表し、aggregations に count を指定すると INVALID_INPUT エラーになります。
グラフタイプとしての boxplot と heatmap は設定できません。指定すると INVALID_GRAPH_TYPE エラーを返します。箱ひげ図は graphType: "custom" で geom: { type: "boxplot" } と stats: [{ type: "boxplot" }] のレイヤーを指定して作成します。
設定可能なすべてのグラフタイプで共通の lineageTargetDatasetId(ID または名前)を指定できます。datasetId が派生データセット(たとえば GROUP BY 集計、または元データのフィルタや再形成)のとき、これに祖先を指定すると、グラフ要素のクリックは元データの行を選択し、ダブルクリックは元データの寄与行を Contributing rows タブで開きます。指定値は datasetId の祖先(contributing rows で辿れるデータセット)である必要があり、候補は getGraphBuilder の availableLineageTargets で確認できます。空文字または null で既定(グラフ自身のデータセット)に戻します。
祖先として有効な値でも、datasetId から対象までの経路に window 関数や集合演算を使うホップがあると、実行時には遡れません。この場合も呼び出し自体は成功し、warnings に辿れないホップとその理由が入ります。
models
models.list()
プロジェクトに保存されているモデルの一覧を取得します。再推定を待っているモデルも含みます。
const result = await window.midas.models.list();
// result.data: [{ id, type, name, datasetId, family, estimationState, estimationError }, ...]
type は 'glm'、'glmm'、'random_forest'、'arima'、'linear_regression'、'anova' のいずれかです。
family は GLM・GLMM・線形回帰のモデルに入ります。分布族はモデルの設定であって推定結果ではないため、estimationState が 'estimated' でも 'pending' でも同じ値が入ります。
estimationState はモデルが推定値を持っているかを表します。推定値を持つモデルは 'estimated'、適合元データセットが変わって推定値が破棄され、再推定を待っているモデルは 'pending' です。
推定値を使うメソッドは 'pending' のモデルを受け付けません。'pending' のモデルの ID を models.describe()、models.predict()、models.saveAsDataset()、reports.addModelSummary() に渡すと INVALID_INPUT エラーが返ります。
estimationError には再推定が失敗した理由が入ります。再推定が失敗して推定値がないまま止まっているモデルにだけ付くため、estimationError がない 'pending' のモデルは再推定の実行中です。
models.run(config)
モデルを実行します。config.type で 'glm'、'glmm'、'random_forest'、'arima'、'linear_regression'、'anova'、'pca'、'kaplan_meier'、'cox_regression' を指定します。datasetId にはデータセット ID またはデータセット名(大文字小文字を区別しない)を指定できます。primary または derived データセットが対象です(ephemeral データセットの ID を直接指定すると INVALID_INPUT エラーになります)。カラムは名前で指定でき、大文字小文字を区別しません。結果はタブを開かず直接返されます。models.list() や models.describe() で後から参照するには、返された runId を models.save() に渡してモデルを保存してください。未保存の実行結果はメモリ上に最大 20 件保持されます。上限を超えると最も古い未保存の結果から順に破棄され、破棄された runId は models.save() に渡せなくなります。ページリロードでもすべて消失します。
GLM、GLMM、線形回帰、Random Forest が受け付けるカラムは、対応するタブのセレクタで選べるカラムに限ります。説明変数(xColumns)、応答変数(yColumn)、GLM の offsetColumn・successesColumn・trialsColumn は数値列でなければなりません。数値列とは、int64・float64・boolean 型のうち 測定尺度 が interval または ratio の列です。Random Forest の応答変数は例外で、分類は型を問わずに受け付け、回帰だけが数値列を要求します。GLMM の groupColumn は nominal または ordinal の列に限ります。また、1 つの列は 1 つのモデルの中で 2 つの役割を兼ねられません。応答変数を説明変数にも指定することはできず、GLM の offsetColumn は応答変数とも説明変数とも別の列にします。successesColumn と trialsColumn は互いに異なり、説明変数でもない列にします。これらに反する列を渡した場合と、同じ説明変数を 2 回渡した場合は INVALID_INPUT エラーになり、エラーメッセージにはその列の名前と拒否の理由が入ります。カテゴリカルな列を説明変数に使うには、datasets.dummyCode() でダミー変数を作り、生成された列を渡します。拒否された説明変数がダミー変数化できる場合は、エラーの suggestion がその手順を案内します。Random Forest の回帰が応答変数を拒否した場合は、suggestion が taskType: 'classification' への切り替えを案内します。
GLM (type: 'glm'):
const result = await window.midas.models.run({
type: 'glm',
datasetId: 'ds_001',
yColumn: 'sepal_length',
xColumns: ['sepal_width', 'petal_length'],
family: 'gaussian'
});
// result.data:
// {
// type: 'glm',
// runId: '...',
// family: 'gaussian',
// link: 'identity',
// coefficients: [
// { variable: '(Intercept)', estimate: 2.25, se: 1.02, ciLower: 0.23, ciUpper: 4.27, expEstimate: null, expCiLower: null, expCiUpper: null },
// ...
// ],
// inference: { distribution: 't', df: 147 },
// fit: { deviance: 42.3, nullDeviance: 234.7, aic: 183.94, bic: 193.47, iterations: 5, converged: true },
// inSampleAccuracy: { kind: 'continuous', n: 150, r2: 0.82, rmse: 0.53, mae: 0.42 },
// diagnosticSummary: { nObservations: 150, nIncomplete: 0, degreesOfFreedom: 147, dispersionParameter: 0.29 },
// warnings: []
// }
inSampleAccuracy は当てはめに使ったデータ自身に対する予測精度指標で、GLM タブが Run 直後に表示する 当てはめデータでの予測精度指標 と同じ計算です。kind は family で決まります。gaussian は 'continuous'(r2・rmse・mae)、binomial は 'binary'(brier・auc。n は試行数の合計)、gamma・poisson・negative-binomial は 'deviance'(rmse・mae・meanDeviance)です。計算できない値は null になり、有効な行が 1 つも無い場合はフィールド全体が null です。in-sample の ROC 曲線のデータは API から参照できるデータセットが無いため返されません。
coefficients の各フィールド:
| フィールド | 説明 |
|---|---|
estimate | リンクスケールの係数推定値 |
se | 推定値の標準誤差 |
ciLower / ciUpper | Wald 信頼区間の下限と上限。参照分布は inference フィールドが示します。family ごとの対応は後述の表を参照してください |
expEstimate / expCiLower / expCiUpper | 推定値と信頼区間を exp() で変換した値。解釈と null になるリンクは後述の説明を参照してください |
diagnosticSummary.dispersionParameter は分散パラメータ φ の推定値です。gaussian では deviance を残余自由度 n−p で除した値、gamma では Pearson χ² を n−p で除した値で、これらの family では SE と信頼区間の計算に使われます。poisson と binomial では SE の計算に φ = 1 を使い、このフィールドには過分散の診断指標として deviance/(n−p) が入ります。残余自由度が 0 の場合は null です。negative-binomial では θ を自動推定した場合は 1.0、θ を固定した場合は Pearson χ²/(n−p) です。
GLMM (type: 'glmm'):
groupColumn でランダム切片のグループ変数を指定します。family は 'gaussian'、'binomial'、'poisson'、'gamma' から選択します(デフォルト 'gaussian')。link、includeIntercept、confidenceLevel も GLM と同じ意味で指定できます。maxIterations のデフォルトは 100、tolerance のデフォルトは 1e-6 です。この 2 つが決めるのは、相対共分散パラメータ の探索のうち黄金分割法の反復上限と許容差です。探索範囲に置いた点での評価は点の数が決まっていて、反復上限に数えません。 ごとに固定効果とランダム効果を求める反復には別の上限があります。モデルの背景は GLMM を参照してください。
const result = await window.midas.models.run({
type: 'glmm',
datasetId: 'ds_001',
yColumn: 'sepal_length',
xColumns: ['sepal_width', 'petal_length'],
groupColumn: 'species',
family: 'gaussian'
});
// result.data:
// {
// type: 'glmm',
// runId: '...',
// family: 'gaussian',
// link: 'identity',
// fixedEffects: [
// { variable: '(Intercept)', estimate: 2.35, se: 0.87, df: 2.31, ciLower: -0.94, ciUpper: 5.64, ... },
// ...
// ],
// inference: { distribution: 't-per-coefficient', method: 'kenward-roger' },
// randomEffects: {
// groupColumn: 'species',
// variance: 0.42,
// residualVariance: 0.14,
// icc: 0.75,
// blup: [{ groupId: 'setosa', estimate: -0.31, standardError: 0.12, rank: 3 }, ...]
// },
// fit: { logLikelihood: -72.1, aic: 154.2, bic: 169.3, iterations: 8, converged: true },
// diagnosticSummary: { nObservations: 150, nGroups: 3, nFixedEffects: 3, nIncomplete: 0, groupSizes: [...] },
// warnings: []
// }
GLMM の固定効果の信頼区間の参照分布は family と link で異なります。gaussian + identity(LMM)では標準誤差が Kenward-Roger 法で補正され、inference は { distribution: 't-per-coefficient', method: 'kenward-roger' }、各係数の df にその係数の t 分布の自由度が入ります。df が null の係数は自由度を計算できず、信頼区間も null になります。補正が数値的に計算できない場合は warnings にその旨が入り、未調整の標準誤差と { distribution: 'normal', df: null } に切り替わります。それ以外の組み合わせでは標準正規分布に基づく Wald 近似で、inference は { distribution: 'normal', df: null } です。グループ数が少ない場合、標準正規近似による信頼区間は名目の被覆確率を下回ることがあります。詳細は GLMM の基礎: 固定効果の推測 を参照してください。
推定の反復を続けられず推定値を定められない場合、GLMM は結果を返さず NUMERICAL_ERROR になります。この失敗は、たとえば gamma に inverse link を当てて線形予測子を正に保てないときや、最適な相対共分散パラメータの近くで固定効果とランダム効果を求める反復が収束しないときに起きます。詳細は GLMM タブ: 収束の問題 を参照してください。
randomEffects の各フィールド:
variance— ランダム切片の分散 σ²_u ですresidualVariance—gaussianでは残差分散 σ²_e、gammaでは推定された分散パラメータ φ です。binomialとpoissonでは φ が理論的に 1 に固定されるため返されませんicc— 級内相関係数 σ²_u / (σ²_u + σ²_e) です。σ²_e はgaussian+identityでは REML で推定した残差分散、binomial+logitでは π²/3、binomial+probitでは 1 で、後の 2 つは潜在尺度の値です。それ以外の family と link の組み合わせでは潜在尺度の残差分散が定義できないためnullになりますblup— グループ別ランダム切片の予測値です。LMM(gaussian+identity)では BLUP(Best Linear Unbiased Prediction)で、固定効果による予測値からの残差(y − Xβ̂)のグループ平均を 0 に向けて縮小した値です。それ以外の family と link の組み合わせでは、推定した固定効果と分散成分のもとでのランダム切片の条件付きモードです。どちらも観測数が少ないグループほど 0 に向けた縮小の度合いが大きくなります。standardErrorは予測の不確実性を表し、LMM では条件付き予測誤差の標準偏差、それ以外の組み合わせでは Laplace 近似に基づく近似値です。rankはestimateの降順順位です
LMM(gaussian + identity)では fit.logLikelihood は REML 対数尤度で、fit.aic と fit.bic もこれに基づきます。REML に基づく AIC/BIC は固定効果の構成が異なるモデル間の比較には使えません。それ以外の family と link の組み合わせでは Laplace 近似による対数尤度です。
Random Forest (type: 'random_forest'):
taskType で 'classification' または 'regression' を指定します。それ以外の値は INVALID_INPUT エラーになります。metrics には適合データに対する評価指標(resubstitution metrics)が含まれます。汎化性能の推定には oobScore を使用してください。
const result = await window.midas.models.run({
type: 'random_forest',
datasetId: 'ds_001',
yColumn: 'species',
xColumns: ['sepal_length', 'sepal_width', 'petal_length', 'petal_width'],
taskType: 'classification',
nEstimators: 100,
randomState: 42
});
// result.data:
// {
// type: 'random_forest',
// runId: '...',
// taskType: 'classification',
// tuningParameters: { nEstimators: 100, maxDepth: null, minSamplesSplit: 2, minSamplesLeaf: 1, maxFeatures: 'sqrt', randomState: 42 },
// featureImportances: [{ feature: 'petal_length', importance: 0.45 }, ...],
// permutationImportances: [{ feature: 'petal_length', importance: 0.38 }, ...],
// metrics: { taskType: 'classification', accuracy: 0.96, precision: 0.96, recall: 0.96, f1Score: 0.96, nClasses: 3 },
// nSamples: 150,
// oobScore: 0.95,
// responseDegenerate: false,
// warnings: []
// }
Random Forest の metrics は taskType によって構造が変わります。'regression' の場合は { taskType: 'regression', mse, rmse, mae, r2 } が返されます。metrics は適合データに対する値であり、models.describe() では取得できません(永続化されないため)。汎化性能の推定には oobScore を使用してください(分類では OOB accuracy、回帰では OOB R²)。回帰で応答変数に実質的な変動がない場合、R² は定義できないため r2 と回帰の oobScore は null になります。OOB 予測を持つサンプルが 1 件もない場合と 1 件しかない場合は、分類・回帰とも oobScore が null になります。これはサンプルサイズが極端に小さいときに起こりえます。回帰では OOB サンプルの応答に実質的な変動がない場合も null になります。いずれの場合も warnings に理由が入ります。分類で応答が 1 クラスしかない場合、metrics の各値は自明に 100% になり、oobScore も前述の理由で null にならない限り 100% になり、重要度は全て 0 になります。このことは warnings で報告されます。退化した応答(回帰では変動がない応答、分類ではクラスが 1 つだけの応答)のどちらの場合も responseDegenerate が true になるため、警告文の文字列照合をしなくても退化を判別できます。permutationImportances は各 predictor をシャッフルした際の OOB 予測精度の平均低下量です。値は負になることがあります。これはシャッフルしても OOB 予測精度が低下しなかったことを意味します。
| パラメータ | 型 | デフォルト | 説明 |
|---|---|---|---|
nEstimators | number | 100 | 決定木の本数 |
maxDepth | number | null | null | 最大深度(null で無制限) |
minSamplesSplit | number | 2 | ノード分割に必要な最小サンプル数 |
minSamplesLeaf | number | 1 | 葉ノードの最小サンプル数 |
maxFeatures | 'sqrt' | 'log2' | null | number | 'sqrt' | 各分割で検討する説明変数の数 |
randomState | number | 42 | 乱数シード |
models.run() の Random Forest 実行は Web Worker 上で行われ、メインスレッドをブロックしません。models.predict() の Random Forest の予測も同じです。Random Forest の設定には signal パラメータがないため、開始した実行を中断することはできません。
inference は ciLower、ciUpper の計算に使われた参照分布を表します。distribution: 't' のとき自由度 df の t 分布、distribution: 'normal' のとき標準正規分布で、後者では df は null になります。GLMM の LMM(gaussian + identity)だけは自由度が係数ごとに異なるため distribution: 't-per-coefficient' となり、自由度はモデルレベルではなく各係数エントリの df に入ります。
family ごとの対応は次のとおりです。β̂/SE が t(n−p) に厳密に従うのは Gaussian + identity link のみで、他の分散パラメータ推定族は有限標本補正の慣習として t 分布を適用します。漸近と書かれた family は標準正規近似です。
| family | link | 参照分布 | 性質 |
|---|---|---|---|
gaussian | identity | t(n−p) | 厳密 |
gaussian | 非 identity | t(n−p) | 有限標本補正の慣習 |
gamma | 任意 | t(n−p) | 有限標本補正の慣習 |
negative-binomial | 任意(θ 固定) | t(n−p) | 有限標本補正の慣習 |
poisson | 任意 | 標準正規 | 漸近 |
binomial | 任意 | 標準正規 | 漸近 |
negative-binomial | 任意(θ 推定) | 標準正規 | 漸近 |
ciLower と ciUpper は各係数の Wald 信頼区間 estimate ± criticalValue × se です。信頼水準は confidenceLevel パラメータ(デフォルト 95)に従います。臨界値は inference の参照分布の (1 + confidenceLevel/100) / 2 分位点を使います。
expEstimate、expCiLower、expCiUpper は link スケールの推定値と信頼区間を exp() で変換した値です。logit リンクではオッズ比 (OR)、Poisson・Negative Binomial の log リンクでは率比 (IRR)、Gamma・Gaussian の log リンクでは乗法的効果に対応します。identity、inverse、probit リンクでは null になります。
fit.aic と fit.bic は number | null です。対数尤度の定数項が定義できない場合(Binomial の非整数重み、飽和モデルなど)に null になります。
レスポンスには2種類の warnings が含まれる場合があります。トップレベルの result.warnings にはデータ準備段階の警告(欠測行の除外など)、result.data.warnings にはモデル実行時の警告(収束の問題など)が格納されます。応答変数と説明変数のいずれかに欠測がある行は分析から除外されます。除外された行数は diagnosticSummary.nIncomplete で確認できます。
最大反復回数までに収束しなかった場合もエラーにはならず、結果は fit.converged: false で返されます。message にも did not converge と表示されます。完全分離・準完全分離が疑われる場合は data.warnings に警告が含まれます。結果が返る場合、係数の se が null になることはありません。SE が計算できない場合(分散共分散行列が正定値でない、計画行列のランク落ち、説明変数や応答変数が極端な値域を持ち分散がオーバーフローまたは未定義になるなど)は結果を返さず NUMERICAL_ERROR エラーになります。極端な値域が原因の場合は、説明変数と応答変数をリスケールまたは標準化してから再適合してください。適合した平均が family の有効範囲外になる場合(例: Poisson や Gamma に identity link を当てた場合)も結果を返さず NUMERICAL_ERROR になります。適合した平均が範囲内に収まる link(log など)を検討してください。反復が発散した場合と、線形予測子がリンク関数の定義域を外れた場合も、結果を返さず NUMERICAL_ERROR になります。反復の発散は、係数の絶対値が 1e10 を超えたとき、または Negative Binomial の反復中に適合した平均が有効範囲を外れたときに判定します。線形予測子の定義域外は、たとえば Gamma に inverse link を当てて線形予測子が 0 以下になったときに起きます。
family は 'gaussian'(デフォルト)、'binomial'、'poisson'、'gamma'、'negative-binomial' から選択します。各 family の選択指針と使い分けは GLM を参照してください。link でリンク関数を指定できます。省略した場合は family に応じたデフォルトが使われます。指定できる link は下表の「利用可能な link」に限られ、それ以外の組み合わせは INVALID_INPUT エラーになります。
| family | デフォルト link | 利用可能な link |
|---|---|---|
gaussian | identity | identity, log |
binomial | logit | logit, probit |
poisson | log | log, identity |
gamma | inverse | inverse, log, identity |
negative-binomial | log | log |
オプションパラメータ:
| パラメータ | 型 | デフォルト | 説明 |
|---|---|---|---|
includeIntercept | boolean | true | 切片の有無 |
maxIterations | number | 100 | 最大反復回数 |
tolerance | number | 1e-6 | 収束判定の許容誤差 |
binomialResponse | object | - | 二項応答の形式。下記参照 |
theta | number | - | 負の二項分布の形状パラメータ θ。正の有限値で指定し、それ以外は INVALID_INPUT エラーになる。省略した場合はプロファイル尤度で自動推定される |
offsetColumn | string | - | オフセット列(ポアソン回帰での exposure 等) |
confidenceLevel | number | 95 | 信頼区間の信頼水準(50〜99.99) |
theta を省略して自動推定した場合、係数の SE と信頼区間は推定された θ を固定値として扱って計算されます。θ 自体の推定不確実性は SE に反映されません。
binomialResponse の指定:
family: 'binomial' の場合に応答変数の形式を指定します。binomialResponse を省略した場合は binary として扱われます。
{ format: 'binary' }-- 0/1 の二値データ。yColumnで応答変数を指定します{ format: 'grouped', successesColumn: '...', trialsColumn: '...' }-- 成功数/試行数のペア。この場合yColumnは省略できます
// Grouped Binomial の例
const result = await window.midas.models.run({
type: 'glm',
datasetId: 'ds_001',
binomialResponse: { format: 'grouped', successesColumn: 'defects', trialsColumn: 'inspected' },
xColumns: ['temperature', 'pressure'],
family: 'binomial',
link: 'logit'
});
ARIMA (type: 'arima'):
単一の時系列列に ARIMA(p,d,q) モデルを適合します。order に [p, d, q] を指定するか、autoSelect で自動次数選択を行います。seasonalPeriod を 2 以上にすると、季節次数を加えた ARIMA(p,d,q)(P,D,Q)[s](SARIMA)になります。自動選択では差分次数を検定で先に決め、残りの次数をその差分次数のもとで AIC または BIC で選びます。差分次数 d は KPSS 検定で決めます。季節モデルでは、まず季節差分次数 D を OCSB 検定で決め、KPSS は季節差分後の系列に適用します。差分次数を AIC/BIC でまたいで選ばない理由は ARIMA の自動次数選択 を、タブでの操作は ARIMA タブ を参照してください。
| パラメータ | 型 | デフォルト | 説明 |
|---|---|---|---|
seriesColumn | string | (必須) | 時系列データの列名。尺度が interval または ratio の int64・float64・boolean 列に限ります |
order | [number, number, number] | — | [p, d, q] — AR 次数、差分次数、MA 次数。省略時は autoSelect を使用 |
seasonalPeriod | number | 1 | 季節周期 s。1 周期あたりの観測数で、月次データの年周期なら 12。1〜366 の整数。1 は非季節モデル |
seasonalOrder | [number, number, number] | [0, 0, 0] | [P, D, Q] — 季節 AR 次数、季節差分次数、季節 MA 次数。P と Q は 0〜2、D は 0〜1。seasonalPeriod が 2 以上かつ order 指定時に使用 |
autoSelect | object | { maxP: 3, maxD: 1, maxQ: 3, maxSeasonalP: 1, maxSeasonalQ: 1, criterion: 'aic' } | 自動次数選択。order 省略時に使用 |
autoSelect.maxP | number | 3 | 探索する AR 次数の上限。0〜5 |
autoSelect.maxD | number | 1 | 差分次数の上限。0〜2。KPSS による d の選択はこの値を超えません |
autoSelect.maxQ | number | 3 | 探索する MA 次数の上限。0〜5 |
autoSelect.maxSeasonalP | number | 1 | 探索する季節 AR 次数の上限。0〜2。seasonalPeriod が 2 以上のとき有効 |
autoSelect.maxSeasonalQ | number | 1 | 探索する季節 MA 次数の上限。0〜2。seasonalPeriod が 2 以上のとき有効 |
autoSelect.criterion | 'aic' | 'bic' | 'aic' | 同一の差分次数のもとで残りの次数を選ぶ情報量基準 |
includeIntercept | boolean | true | 定数項を含める。d + D = 0 では平均、d + D = 1 ではドリフト。d + D が 2 以上では多項式トレンドに相当するため外れる |
includeTrend | boolean | false | 決定論的線形トレンド項を含める。時間の回帰項は有効観測の連番(t = 1, 2, ...)から内部生成し、傾きを推定するのは d + D = 0 のときだけ(切片は t = 0 の水準になる)。d + D = 1 では定数項を含めていれば傾きがドリフトとして表現され、2 以上では差分でトレンドが消えるため、どちらも別個には推定せず warnings で報告する。自動選択では、季節差分を取らない場合(D = 0)に限り、差分前の系列への KPSS がトレンド定常性を帰無仮説とする変種(判定閾値 0.146)になる |
confidenceLevel | number | 95 | 係数の信頼区間の信頼水準 |
signal | AbortSignal | — | 実行中の中断用 |
models.run() の ARIMA 実行は Web Worker 上で行われ、メインスレッドをブロックしません。signal に AbortSignal を渡すと実行中の中断を要求でき、中断すると USER_CANCELLED エラーを返します。
レスポンスには coefficients(AR/MA/SAR/SMA/Intercept/Trend と CI)、seasonalOrder、fit(AIC, BIC, 対数尤度, σ², 収束状態)、residualDiagnostics(残差の ACF と PACF)、nObservations が含まれます。適合が収束しなかった場合、尤度が最大化されていないため fit.aic と fit.bic は null になります。標準誤差を計算できなかった係数は se と CI が null になります。係数が定常・可逆の境界に張り付いて分散共分散行列が得られない場合などに起こります。autoSelect 使用時は、KPSS で選んだ差分次数の記録が differencingSelection(選んだ d、各階数の KPSS 統計量、使った変種と判定閾値)に、その差分次数のもとで探索した全 (p, q, P, Q) 候補の AIC/BIC が orderSearch に含まれます。orderSearch の候補はすべて同一の (d, D) を持ちます。各候補の status は converged、not-converged、failed のいずれかです。not-converged は反復が収束の基準を満たす前に止まった候補で、次数や差分次数を変えれば収束することがあります。failed は差分後の観測数不足や分散ゼロなどで適合そのものが成立しなかった候補で、理由が error に入ります。converged 以外の候補は尤度が最大化されていないため、aic と bic が null になります。非収束候補の件数は orderSearchNonConvergedCount に、適合できなかった候補の件数は orderSearchFailedCount に含まれます。seasonalPeriod が 2 以上のときは、OCSB で選んだ季節差分次数の記録が seasonalDifferencingSelection(選んだ D、OCSB 統計量、判定閾値)にも含まれます。
residualDiagnostics の acf と pacf はラグ 0 から始まる配列で、標本自己相関を計算できないラグは null になります。残差の分散がゼロのときは、標本自己相関の分子と分母がどちらもゼロになるため、ラグ 0 を含む全要素が null です。偏自己相関は、Durbin-Levinson の再帰で革新分散がゼロに達したラグ以降も null になります。
観測数が不足している、または差分後の系列の分散がゼロで適合が縮退した場合は、fit.error にメッセージが入ります。このとき係数や σ² などは無意味な値(ゼロ)になり、fit.aic と fit.bic は null、residualDiagnostics の acf と pacf は空配列です。これは最適化が収束しなかった場合(converged: false で fit.error なし)とは区別されます。
系列中の非有限値(NaN, Infinity, null)は除外されます。除外が発生した場合、レスポンスの warnings に報告されます。除外後の有効な観測が 10 未満の場合は INSUFFICIENT_DATA エラーを返します。これは ARIMA タブが要求する観測数と同じです。差分の合計 d + D が 2 以上で定数項が外れた場合、includeTrend を有効にしたのに d + D が 1 以上でトレンド項を傾きとして推定しなかった場合、係数の標準誤差を計算できなかった場合、自己回帰または移動平均の根が単位円に近い場合(near-unit-root。推定値と正規近似の信頼区間が信頼しにくくなり、移動平均の根が可逆境界に近いときは過剰差分の可能性があります)、報告された係数と大きく異なる係数の組がほぼ同等にデータへ適合し係数が弱くしか識別されない場合も warnings に報告されます。収束しなかった適合も warnings に報告され、fit.error があればそのメッセージが、なければ非収束を伝える定型文が入ります。保存済みモデルでは models.describe() が同じ注記を返します。
// 手動で次数を指定
const result = await window.midas.models.run({
type: 'arima',
datasetId: 'ds_001',
seriesColumn: 'temperature',
order: [1, 1, 1]
});
// 自動次数選択
const result2 = await window.midas.models.run({
type: 'arima',
datasetId: 'ds_001',
seriesColumn: 'temperature',
autoSelect: { maxP: 5, maxD: 2, maxQ: 5, criterion: 'bic' }
});
Linear Regression (type: 'linear_regression'):
最小二乗法による線形回帰を適合します。
| パラメータ | 型 | デフォルト | 説明 |
|---|---|---|---|
yColumn | string | (必須) | 応答変数の列名 |
xColumns | string[] | (必須) | 説明変数の列名 |
includeIntercept | boolean | true | 切片の有無 |
confidenceLevel | number | 95 | 信頼区間の信頼水準 |
レスポンスの coefficients は GLM と同形式で、inference は常に t 分布です。fit には GLM と同じフィールドに加えて rSquared、adjustedRSquared、residualStdError、mae が含まれます。residualStdError は残差平方和を残差自由度 n−p で除した値の平方根、mae は残差絶対値の平均(分母は n)です。residualStdError は、GLM の予測精度指標が返す rmse(残差平方和を観測数 n で除した値の平方根)とは別の量です。応答変数に実質的な変動がないとき(responseDegenerate: true)は rSquared、adjustedRSquared、residualStdError、mae が null になり、このとき係数の se と信頼区間も null になります。理由は warnings に示されます。Type I の平方和が丸め誤差の範囲を超えて数値誤差で負になり 0 に置き換えられた場合も warnings で報告し、該当する説明変数名を文中に示します(条件は Linear Regression ページの ANOVA Table の説明と同じです)。説明変数の数が観測数と等しい飽和モデルでは、分散パラメータを推定できず、結果を返さずエラーになります。切片を含まないモデルでは rSquared は未中心 R² であり、切片ありモデルの中心 R² とは比較できません。mae は実行結果だけが持つ値で、保存したモデルの models.describe() には含まれません。
const result = await window.midas.models.run({
type: 'linear_regression',
datasetId: 'ds_001',
yColumn: 'sepal_length',
xColumns: ['sepal_width', 'petal_length']
});
// result.data: { type: 'linear_regression', runId, coefficients, inference,
// fit: { ..., rSquared: 0.84, adjustedRSquared: 0.84, residualStdError: 0.33, mae: 0.26 }, diagnosticSummary, warnings }
ANOVA (type: 'anova'):
一元配置または二元配置の分散分析を実行します。factorColumns の要素数でどちらかが決まります。
| パラメータ | 型 | デフォルト | 説明 |
|---|---|---|---|
responseColumn | string | (必須) | 応答変数の列名 |
factorColumns | string[] | (必須) | 因子列。1 要素で一元配置、2 要素で二元配置 |
includeInteraction | boolean | true | 二元配置で交互作用項を含める |
ssType | 'I' | 'III' | 'III' | 二元配置の平方和の分解タイプ |
confidenceLevel | number | 95 | Tukey HSD の信頼水準(50〜99.99) |
postHoc | boolean | true | Tukey HSD を計算する(一元配置のみ。二元配置で true を指定すると INVALID_INPUT になる) |
列の適格性は ANOVA タブのセレクタと同じ 測定尺度 で決まります。responseColumn は尺度が interval または ratio の列を、factorColumns は nominal または ordinal の列を受け付けます。要件を満たさない列を指定すると INVALID_INPUT になり、エラーメッセージにその列の現在の尺度が入ります。date 型と datetime 型の列は尺度が interval でも responseColumn には使えません。string 型と enum 型の列は値が文字列として保存されているため responseColumn には使えず、尺度を interval や ratio へ変更することもできません。これらの場合のエラーメッセージは尺度ではなくデータ型を示します。
レスポンスには mode('one-way' または 'two-way')、anovaTable(各効果の平方和・自由度・平均平方と効果量 η²・ω²(二元配置では partial η²・partial ω²)、残差、合計)、groupStatistics(グループ別の n、平均、標準偏差、最小値、最大値)、nObservations、nExcluded、exclusions が含まれます。一元配置で postHoc が有効な場合は tukeyHSD(ペアごとの平均差、SE、信頼区間)も含まれます。postHoc の指定は models.save で保存したモデルに保持され、データセットの再読み込みに伴う再推定でも維持されます。二元配置は Tukey HSD を計算しないため、二元配置モデルの保存値は常に false になります。
モデルが応答の値をすべて正確に再現すると誤差分散を推定できないため、誤差分散に依存する量は null になります。残差平方和が応答の変動に対して浮動小数点精度を下回る場合を正確な再現とみなすので、各群の値が群内で同一の応答もこれに含まれます。このとき anovaTable.residuals.ms と効果量は null になり、postHoc が有効でも tukeyHSD は省略され、平方和と群平均は返り、理由は warnings に示されます。
exclusions は欠損・無効値による除外の内訳です。byGroup は群(一元配置は因子の水準、二元配置は水準の組み合わせ)ごとの除外行数、factorMissing は因子の値が欠損していて群に帰属できない除外行数です。除外によってある水準の行がすべて消えた場合は droppedLevelsA・droppedLevelsB に、両因子の水準が残っているのにセルの行がすべて消えた場合は droppedCells に、ラベルと行数が入ります。これらの消滅は warnings にも警告文として入ります。ただし交互作用ありの二元配置では、除外でセルが空になると実行自体が空セルのエラーになるため、droppedCells と警告が返るのは交互作用なしの場合だけです。
const result = await window.midas.models.run({
type: 'anova',
datasetId: 'ds_001',
responseColumn: 'sepal_length',
factorColumns: ['species']
});
// result.data: { type: 'anova', runId, mode: 'one-way',
// anovaTable: { ssType, rows: [{ source, ss, df, ms, etaSquared, omegaSquared }, ...], residuals, total },
// groupStatistics: [{ label, n, mean, std, min, max }, ...],
// tukeyHSD: { comparisons: [{ group1, group2, meanDiff, se, ciLower, ciUpper }, ...], confidenceLevel },
// nObservations: 150, nExcluded: 0,
// exclusions: { byGroup: [], factorMissing: 0, droppedLevelsA: [], droppedLevelsB: [], droppedCells: [] },
// warnings: [] }
PCA (type: 'pca'):
主成分分析を実行します。指定した列のいずれかが欠損している行は除外し、その数を nExcluded で返します。
| パラメータ | 型 | デフォルト | 説明 |
|---|---|---|---|
columns | string[] | (必須) | 主成分を求める数値列。2 列以上を指定する |
preprocessing | 'standardize' | 'center' | 'none' | 'standardize' | 前処理 |
nComponents | number | 全成分 | 返す成分数の上限 |
レスポンスには components(主成分ごとの固有値・寄与率・累積寄与率)と loadings(変数ごとの各主成分への係数)が含まれます。主成分得点は行数と同じ長さの配列になるため返しません。得点が必要な場合は PCA タブの Save as Dataset でデータセットにしてください。
const result = await window.midas.models.run({
type: 'pca',
datasetId: 'ds_001',
columns: ['sepal_length', 'sepal_width', 'petal_length', 'petal_width']
});
// result.data: { type: 'pca', runId, nObservations: 150, nVariables: 4, nComponents: 4,
// nExcluded: 0, preprocessing: 'standardize',
// components: [{ component: 1, eigenvalue, explainedVarianceRatio, cumulativeVarianceRatio }, ...],
// loadings: [{ variable: 'sepal_length', values: [...] }, ...], warnings: [] }
Kaplan-Meier (type: 'kaplan_meier'):
Kaplan-Meier 法で生存関数を推定します。eventColumn には int64 型または boolean 型の列を指定し、1 または true をイベント発生として扱います。eventColumn に 0/1(boolean 型では false/true)以外の値が含まれる場合と、timeColumn に負値またはゼロが含まれる場合は、該当する値と行数を示す INVALID_INPUT エラーを返します。groupColumn を指定すると群ごとに推定し、指定しない場合は 'All' という 1 群になります。groupColumn は尺度が nominal または ordinal の列を受け付けます。群の値が欠損している行は 'Unknown' という群にまとめます。
| パラメータ | 型 | デフォルト | 説明 |
|---|---|---|---|
timeColumn | string | (必須) | 観察時間の列名 |
eventColumn | string | (必須) | イベント指標の列名 |
groupColumn | string | なし | 群を表す列名 |
confidenceLevel | number | 95 | 信頼水準(50〜99.99) |
tau | number | 群ごとの最大観察時間の最小値 | RMST の制約時点(正の数) |
レスポンスの groups には、群ごとに観測数、イベント数、中央生存時間とその信頼区間、イベント時点の並び(times)と対応する生存確率・信頼区間・リスク集合の大きさ・イベント数・打ち切り数が入ります。
rmst には制限平均生存時間(RMST。0 から tau までの生存曲線の面積)が入ります。tau は実際に使った制約時点、defaultTau はその既定値です。groups は群ごとの RMST 推定値・標準誤差・信頼区間で、tau 以下にイベント時点がない群では推定値・標準誤差・信頼区間が null になります。differences は群のすべてのペアについて group1 から group2 を引いた差とその標準誤差・信頼区間で、群が 1 つなら空です。この差は多重比較の調整をしていません。標準誤差は Greenwood 分散に基づき、信頼区間はどちらも正規近似の Wald 区間です。tau が既定値を超えると、最後の観察時間より後の生存曲線を一定として外挿するため、RMST を過大に、その不確かさを過小に見積もることがあります。この場合 warnings に警告が入ります。tau が正の数でない場合は INVALID_INPUT エラーを返します。
const result = await window.midas.models.run({
type: 'kaplan_meier',
datasetId: 'ds_001',
timeColumn: 'time',
eventColumn: 'DEATH_EVENT',
groupColumn: 'sex'
});
// result.data: { type: 'kaplan_meier', runId, confidenceLevel: 95, nExcluded: 0,
// groups: [{ group: '0', nObservations, nEvents, medianSurvivalTime, medianSurvivalTimeCI,
// times: [...], survival: [...], survivalCILower: [...], survivalCIUpper: [...],
// nRisk: [...], nEvent: [...], nCensor: [...] }, ...],
// rmst: { tau, defaultTau,
// groups: [{ group: '0', rmst, se, ciLower, ciUpper }, ...],
// differences: [{ group1: '0', group2: '1', difference, se, ciLower, ciUpper }] },
// warnings: [] }
Cox 回帰 (type: 'cox_regression'):
Cox 比例ハザードモデルを当てはめます。eventColumn には int64 型または boolean 型の列を、共変量には尺度が interval または ratio の列を指定します。eventColumn に 0/1(boolean 型では false/true)以外の値が含まれる場合と、timeColumn に負値またはゼロが含まれる場合は、該当する値と行数を示す INVALID_INPUT エラーを返します。時間・イベント・共変量のいずれかが欠損している行は除外し、その数を nExcluded で返します。内訳は exclusions が持ちます。時間変数またはイベント変数の欠損で落ちた行数が missingTimeOrEvent、共変量の欠損で落ちた行数が missingCovariates です。この 2 つは排他に数えるため、和が nExcluded に一致します。同時発生イベントは Efron 法で扱います。tiesMethod を渡すと INVALID_INPUT エラーを返します。
| パラメータ | 型 | デフォルト | 説明 |
|---|---|---|---|
timeColumn | string | (必須) | 観察時間の列名 |
eventColumn | string | (必須) | イベント指標の列名 |
covariates | string[] | (必須) | 共変量の数値列。1 列以上を指定する |
maxIterations | number | 100 | Newton-Raphson の最大反復数 |
tolerance | number | 1e-9 | 収束判定の許容誤差 |
confidenceLevel | number | 95 | ハザード比の信頼水準(50〜99.99) |
レスポンスの coefficients には共変量ごとの対数ハザード比、標準誤差、ハザード比とその信頼区間が入ります。あわせて対数部分尤度、AIC、Concordance index とその標準誤差、収束状態と反復回数を返します。信頼区間は対数ハザード比の Wald 区間を指数変換して求めます。warnings には推定値が発散に向かっている兆候(準分離)を検出した場合の警告が入ります。
反復が収束判定を満たす前に止まった場合は、converged: false の結果を返します。この結果では、最大部分尤度推定を前提とする係数ごとの coefficient、standardError、hazardRatio、hazardRatioCILower、hazardRatioCIUpper と、logPartialLikelihood、aic、concordance、concordanceSE、diagnostics、baseline がすべて null になります。反復が止まった時点の係数は lastIterateCoefficient に、そこでの対数部分尤度は lastIterateLogPartialLikelihood に入ります。どちらも推定値ではありません。反復が止まった理由は stopReason が示し、値は 'max-iterations'(maxIterations に到達)、'step-halving-failed'(更新の方向に試した 10 通りの幅のいずれでも、部分対数尤度が受理の許容幅を超えて下がった。許容幅は直前の反復での部分対数尤度の絶対値に 1 を足した値の 1e-10 倍)、'direction-unsolvable'(情報行列を解けず更新の方向を求められなかった)のいずれかです。収束した場合の stopReason は null です。warnings には、止まった理由と、止まった時点で係数が極端な値だった共変量を述べた警告が 1 件入ります。止まった時点で分離、情報行列の特異、有限の正の値にならない分散のいずれかが判明した場合は、未収束の結果ではなく NUMERICAL_ERROR エラーを返します。
diagnostics には比例ハザード性の診断が入ります。proportionalHazards は共変量ごとの rho で、スケーリング済み Schoenfeld 残差と時間変換 g(t) = 1 − KM(t−) の Pearson 相関です。イベント数が 2 未満の場合と、残差または時間変換の分散がゼロの場合は null になります。rho だけでは比例ハザード性からの逸脱の程度やパターンは分からないため、schoenfeldResiduals と合わせて判断してください。schoenfeldResiduals はイベントごとの生の残差(raw)とスケーリング済み残差(scaled)で、どちらも covariates と同じ並びです。timeTransform はイベントごとの g(t) です。Cox 回帰タブの Diagnostics が描く Schoenfeld 残差の散布図は、schoenfeldResiduals の time を横軸、scaled を縦軸に取ったものです。schoenfeldTrends は共変量ごとに、scaled を time に対して LOESS で平滑化した曲線で、タブはこの曲線を散布図に重ねて描きます。LOESS はトリキューブ重みの局所線形回帰で、スパンは 0.75 です。各要素は共変量名 name、時点 time、その時点での LOESS の予測値 value を持ちます。time は相異なるイベント時点です。相異なるイベント時点が 101 を超える場合、time は 200 時点以下で、昇順の順位が等間隔な 101 時点と、最初から最後のイベント時点までを 100 等分した各点に最も近いイベント時点を合わせたものです。同じタブの log(−log S) 図は、タブで選んだ 1 つの共変量で観測を群に分けて描く表示専用の図で、その描画用データは返しません。群は、共変量の異なる値が 5 個以下なら値ごとに作り、6 個以上なら中央値で 2 つに分けます。
baseline にはベースライン生存関数が入ります。イベント時点 times ごとの累積ベースラインハザード cumHazard(H₀(t))、ベースライン生存関数 survival(S₀(t) = exp(−H₀(t)))、リスク集合の大きさ nRisk、イベント数 nEvent です。cumHazardCILower/cumHazardCIUpper と survivalCILower/survivalCIUpper は confidenceLevel での pointwise 信頼区間で、log H₀ の尺度(S₀ では log(−log S₀) の尺度)で構成し、分散はベースラインハザードの増分と推定係数の両方の不確実性を合わせたものです(定式化)。各時点で個別に構成した区間であり同時信頼帯ではありません。区間を計算できない時点は上下限とも null になります。ベースラインは共変量がすべて 0 の観測に対する推定です。年齢のように 0 が観測範囲の外にある共変量では S₀(t) は外挿になるため、標本平均などの現実的な共変量値 X について S(t | X) = exp(−H₀(t)·exp(β'X)) を cumHazard から計算して確認してください。survival からではなく cumHazard から計算するのは、H₀(t) が 1e-16 程度より小さいと S₀(t) が厳密に 1 に丸まり、べき乗 S₀(t)^exp(β'X) がどの X でも 1 になるためです。共変量の原点 X = 0 が観測データから遠いと S₀(t) がすべての時点で小数点以下 6 桁の表示で 0 または 1 になり、その場合は survivalDegenerate が true になります。
const result = await window.midas.models.run({
type: 'cox_regression',
datasetId: 'ds_001',
timeColumn: 'time',
eventColumn: 'DEATH_EVENT',
covariates: ['age', 'ejection_fraction']
});
// result.data: { type: 'cox_regression', runId, confidenceLevel: 95,
// coefficients: [{ name: 'age', coefficient, standardError, hazardRatio,
// hazardRatioCILower, hazardRatioCIUpper }, ...],
// logPartialLikelihood, aic, concordance, concordanceSE, converged, stopReason: null, iterations,
// nObservations, nEvents, nExcluded,
// exclusions: { missingTimeOrEvent, missingCovariates },
// diagnostics: { proportionalHazards: [{ name: 'age', rho }, ...],
// schoenfeldResiduals: [{ time, raw: [...], scaled: [...] }, ...], timeTransform: [...],
// schoenfeldTrends: [{ name: 'age', time: [...], value: [...] }, ...] },
// baseline: { times: [...], cumHazard: [...], cumHazardCILower: [...], cumHazardCIUpper: [...],
// survival: [...], survivalCILower: [...], survivalCIUpper: [...], nRisk: [...], nEvent: [...],
// survivalDegenerate: false },
// warnings: [] }
PCA、Kaplan-Meier、Cox 回帰の結果はモデルとして保存しません。これらの runId を models.save() に渡すと INVALID_INPUT が返ります。結果は models.run() の戻り値から直接読んでください。
models.save(runId, name?)
モデルの実行結果をプロジェクトに保存します。保存後、models.list() や models.describe() で参照できます。PCA、Kaplan-Meier、Cox 回帰の実行結果は保存の対象外で、その runId を渡すと INVALID_INPUT が返ります。
const run = await window.midas.models.run({ ... });
const saved = await window.midas.models.save(run.data.runId, 'My Model');
// saved.data: { id: '...', name: 'My Model' }
診断データセットは GLM Diagnostics タブを開いた時点で自動作成されます。含まれる主な列は fitted_values、deviance_residuals、pearson_residuals、standardized_residuals、leverage、cooks_distance です。これらを reports.addGraph() や Graph Builder で可視化して残差分析や診断プロットに使用できます。
models.saveAsDataset(id, artifact, options?)
モデルの成果物を派生データセットとして保存します。保存したデータセットは SQL・グラフ・レポートからそのまま参照できます。
保存できる成果物は coefficients(GLM、線形回帰、GLMM の固定効果)、covariance(GLM、線形回帰の分散共分散行列)、blup(GLMM のランダム効果)です。モデルが持たない成果物を指定すると UNSUPPORTED_MODEL_TYPE が返ります。
| オプション | 型 | デフォルト | 説明 |
|---|---|---|---|
name | string | モデル名と成果物から生成 | 出力する派生データセットの名前。同名が既にある場合は連番が付く |
confidenceLevel | number | 95 | 係数テーブルの信頼区間の水準(50〜99.99)。covariance と blup では使いません |
作成したデータセットは GUI の Save as Dataset と同じ operation を持つため、モデルからの再導出も同じ経路を通ります。当てはめ値と予測値はここでは扱いません。models.predict() を使ってください。
const result = await window.midas.models.saveAsDataset('model_001', 'coefficients', {
confidenceLevel: 99,
});
// result.data: { id: 'derived_...', name: 'My GLM Coefficients', rowCount: 3,
// columnCount: 7, artifact: 'coefficients', modelType: 'glm' }
models.predict(id, config)
保存済みモデルで新しいデータを予測し、結果を派生データセットとして作成します。対応するのは GLM、線形回帰、Random Forest で、それ以外のモデルには UNSUPPORTED_MODEL_TYPE が返ります。datasetId にはデータセット ID またはデータセット名を指定でき、モデルが適合に使った予測子の列をすべて含む必要があります。
| パラメータ | 型 | デフォルト | 説明 |
|---|---|---|---|
datasetId | string | (必須) | 予測対象のデータセット |
name | string | モデル名から生成 | 出力する派生データセットの名前。同名が既にある場合は連番が付く |
includeOriginalData | boolean | true | 予測対象データセットの列を出力に含める |
confidenceLevels | number[] | [95] | 平均の信頼区間の水準(50〜99.99) |
predictionLevels | number[] | [95] | 個々の新しい観測に対する予測区間の水準(50〜99.99) |
GLM と線形回帰では、予測値・線形予測子・標準誤差の列に加えて、confidenceLevels と predictionLevels の水準ごとに上下限の列が付きます。予測子または offset が欠損している行は各値が null になり、行そのものは残ります。Binomial の GLM では、予測先のデータセットに応答列(成功数と試行数の形式では試行数列も)がある場合、includeOriginalData の指定に関わらず観測値の列も付きます。二値応答では glm_observed、成功数と試行数の形式では glm_observed_proportion と glm_trials です。
includeOriginalData が true のとき、予測対象データセットに出力が追加する列と同じ名前の列があると、INVALID_INPUT を返して予測しません。同名の列が並ぶデータセットを作らないためです。エラーメッセージには衝突した列名が入ります。予測結果のデータセットをもう一度予測の対象にする場合は、includeOriginalData を false にするか、衝突する列の名前を変えてください。
Random Forest では、モデルが適合に使った予測子の列と予測値の列(分類ではクラスごとの確率列も)を持つデータセットを作ります。応答列など予測子以外の列は残りません。行は元のデータセットと同じ数で、予測子が欠損している行は予測値が null になり、その行数を nSkipped で返します。confidenceLevels、predictionLevels、includeOriginalData は Random Forest では意味を持たないため無視し、無視した旨を warnings で返します。
const result = await window.midas.models.predict('model_001', {
datasetId: 'New Patients',
confidenceLevels: [95],
predictionLevels: [90, 95],
});
// result.data: { id: 'ds_...', name: 'GLM Predictions', rowCount: 40,
// columnCount: 12, modelType: 'glm', nSkipped: 0,
// accuracy: { kind: 'continuous', n: 40, r2: 0.78, rmse: 0.61, mae: 0.47 },
// onFittingData: false, warnings: [] }
accuracy は予測先のデータセットの応答列に対する予測精度指標で、GLM Prediction タブが表示する 予測精度指標と同じ計算です。GLM と線形回帰で、予測先のデータセットに応答列(成功数と試行数の形式では試行数列も)がある場合に、応答と予測値がともに有効な行から計算して返します。形は GLM の models.run() が返す inSampleAccuracy と同じです。gaussian は 'continuous'(r2・rmse・mae)、binomial は 'binary'(brier・auc。n は試行数の合計)、gamma・poisson・negative-binomial は 'deviance'(rmse・mae・meanDeviance)です。計算できない値は null になります。rmse の分母は行数 n です。線形回帰の models.run() が返す fit.residualStdError の分母は残差自由度 n - p なので、同じデータでも両者の値は異なります。予測先のデータセットに応答列が無い場合、Random Forest の場合、有効な行が 1 つも無い場合、試行数列が無い場合は accuracy 全体が null で、後の 2 つの場合は warnings に理由が入ります。ROC 曲線は kind が 'binary' で auc が null でないときに描けます。曲線のデータは作成したデータセットの glm_predicted 列と観測値の列にあり、グラフの roc stat でタブと同じ曲線を描けます。
onFittingData は、予測先のデータセットがモデルの当てはめに使ったデータセットそのものであるとき true になります。このとき accuracy は当てはめデータでの指標(in-sample)で、GLM Prediction タブが指標の下に注記を出すのと同じ状況です。当てはめに使っていないデータでの指標は、これより悪い値になるのが普通です。
models.describe(id)
モデルの詳細を取得します。GLM、GLMM、Random Forest、ARIMA、Linear Regression、ANOVA に対応しています。レスポンス構造はモデルタイプにより異なります(result.data.type で判別)。モデルは models.run() + models.save() で API から作成するか、GUI から作成できます。
GLM: 係数、適合度指標(AIC, BIC, deviance)、診断サマリー、メタデータを返します。
GLMM: 固定効果(GLM の係数と同形式)、ランダム効果(グループ変数、分散、ICC、BLUP)、適合度指標(対数尤度、反復回数、収束状態)、診断サマリーを返します。適合時の警告は warnings に入ります。singular fit、分散成分の推定値が探索範囲の上限に達した場合、 の探索や固定効果の最適化の非収束、Kenward-Roger 補正が計算できず正規近似に切り替わった場合が該当します。警告がないモデルと、この情報の保存が始まる前に保存されたモデルでは省略されます。
Random Forest: タスクタイプ(classification/regression)、チューニングパラメータ、OOB スコア、MDI 変数重要度(保存されている場合)、OOB Permutation Importance(計算済みの場合)を返します。oobScore は分類では OOB accuracy、回帰では OOB R² です。計算できない場合は null になり、理由は warnings に入ります。null になる条件は models.run() の Random Forest の説明と同じです。responseDegenerate は適合時に応答が退化していた(回帰では変動がない、分類ではクラスが 1 つだけ)場合に true になります。このフィールドが永続化される前に保存されたモデルでは省略されます。
ARIMA: 次数(p, d, q と季節次数)、係数(AR/MA/SAR/SMA/Intercept/Trend と CI)、適合度指標(AIC, BIC, 対数尤度, σ², 収束状態)、residualDiagnostics(残差の ACF と PACF)を返します。models.run() の残差診断と fit.error は保存時に残るため、再適合せずに取得できます。acf と pacf が空配列になるのは、この機能の追加前に保存されたモデルか、適合が縮退したモデル(fit.error あり)で、自己相関を計算できないラグは null になります。fit.error が設定されているときの係数や適合度指標の扱いと、null になるラグの条件は models.run() の ARIMA の説明を参照してください。
Linear Regression: 係数(GLM と同形式、inference は常に t 分布)、適合度指標(R², Adjusted R², Residual Std. Error, AIC, BIC)、診断サマリー、メタデータ、responseDegenerate を返します。responseDegenerate が true のときは models.run() と同じく rSquared、adjustedRSquared、residualStdError と係数の se・信頼区間が null になります。
ANOVA: 分散分析表(平方和、自由度、平均平方、効果量 η²・ω²。二元配置では partial η²・partial ω²)、グループ別統計量、Tukey HSD(計算済みの場合のみ)、メタデータを返します。レスポンス構造は models.run() の ANOVA の説明と同じです。exclusions が省略されるのは、この情報の保存が始まる前に保存されたモデルです。
const result = await window.midas.models.describe('model_001');
// GLM の例 - result.data:
// {
// type: 'glm',
// family: 'gaussian',
// link: 'identity',
// id: 'model_001',
// name: 'My Model',
// metadata: {
// createdAt: '2025-01-15T10:30:00Z',
// fittingDatasetId: 'ds_001',
// predictors: ['sepal_width', 'petal_length'],
// response: 'sepal_length',
// sampleSize: 150
// },
// coefficients: [
// { variable: '(Intercept)', estimate: 2.25, se: 1.02, ciLower: 0.23, ciUpper: 4.27, expEstimate: null, expCiLower: null, expCiUpper: null },
// { variable: 'sepal_width', estimate: 0.60, se: 0.24, ciLower: 0.13, ciUpper: 1.07, expEstimate: null, expCiLower: null, expCiUpper: null },
// ...
// ],
// inference: { distribution: 't', df: 147 },
// fit: { deviance: 42.3, nullDeviance: 234.7, aic: 183.94, bic: 193.47, iterations: 5, converged: true },
// diagnosticSummary: { ... }
// }
GLMM の場合は fixedEffects 配下の係数が GLM の coefficients と同形式になります。inference は models.run() と同じ規則で決まり、Kenward-Roger 推測で推定された LMM では { distribution: 't-per-coefficient', method: 'kenward-roger' } と係数ごとの df、それ以外の family と、Kenward-Roger 導入前に保存されたモデルでは { distribution: 'normal', df: null } です。Random Forest には inference、coefficients、fit フィールドはありません。
// GLMM の例 - result.data:
// {
// type: 'glmm',
// family: 'gaussian',
// link: 'identity',
// id: 'model_002',
// name: 'Mixed Model',
// metadata: { createdAt: '2025-01-15T10:30:00Z', fittingDatasetId: 'ds_001', predictors: ['x1'], response: 'y', sampleSize: 200 },
// fixedEffects: [
// { variable: '(Intercept)', estimate: 3.14, se: 0.85, df: 8.7, ciLower: 1.21, ciUpper: 5.07, expEstimate: null, expCiLower: null, expCiUpper: null },
// { variable: 'x1', estimate: 0.52, se: 0.18, df: 182.4, ciLower: 0.16, ciUpper: 0.88, expEstimate: null, expCiLower: null, expCiUpper: null }
// ],
// inference: { distribution: 't-per-coefficient', method: 'kenward-roger' },
// randomEffects: {
// groupColumn: 'school',
// variance: 1.23,
// residualVariance: 4.56,
// icc: 0.212,
// blup: [{ groupId: 'A', estimate: 0.45, standardError: 0.21, rank: 1 }, { groupId: 'B', estimate: -0.32, standardError: 0.19, rank: 2 }]
// },
// fit: { logLikelihood: -447.05, aic: 902.1, bic: 915.3, iterations: 12, converged: true },
// diagnosticSummary: { nObservations: 200, nGroups: 10, nFixedEffects: 2, nIncomplete: 0, groupSizes: [{ groupId: 'A', size: 20 }, { groupId: 'B', size: 15 }, { groupId: 'C', size: 25 }] }
// }
// Random Forest の例 - result.data:
// {
// type: 'random_forest',
// id: 'model_003',
// name: 'RF Classifier',
// metadata: { createdAt: '2025-01-15T10:30:00Z', fittingDatasetId: 'ds_001', predictors: ['x1', 'x2', 'x3'], response: 'species', sampleSize: 150 },
// taskType: 'classification',
// tuningParameters: {
// nEstimators: 100,
// maxDepth: null,
// minSamplesSplit: 2,
// minSamplesLeaf: 1,
// maxFeatures: 'sqrt',
// randomState: 42
// },
// featureImportances: [
// { feature: 'x1', importance: 0.45 },
// { feature: 'x2', importance: 0.35 },
// { feature: 'x3', importance: 0.20 }
// ],
// permutationImportances: [
// { feature: 'x1', importance: 0.38 },
// { feature: 'x2', importance: 0.42 },
// { feature: 'x3', importance: 0.12 }
// ]
// }
featureImportances は MDI(Mean Decrease in Impurity)です。permutationImportances は OOB permutation importance(各 predictor をシャッフルした際の OOB 予測精度の平均低下量)で、未計算の場合は undefined になります。値は負になることがあります。これはシャッフルしても OOB 予測精度が低下しなかったことを意味します。両配列とも metadata.predictors と同じ順序です。
models.remove(id)
モデルをプロジェクトから削除します。削除対象を参照しているタブを閉じたあと、関連する診断データセットや ANOVA テーブル、係数テーブルなどの派生データセットと、それらから派生したデータセット、およびその派生データセットで学習されたモデルをカスケード削除します。削除されたデータセットやモデルを参照するレポート要素も取り除かれます。
await window.midas.models.remove('model_001');
models.configure(tabId, config)
モデルタブを設定します。config.type にモデルの種別を指定し、タブの種別と一致させます。指定できる種別は glm、glmm、random_forest、arima、linear_regression、anova、pca、kaplan_meier、cox_regression です。type 以外の項目はすべて省略でき、渡した項目だけが変わります。datasetId に渡すデータセット名とカラム名は大文字小文字を区別せずに解決されます。
設定できる項目は、同じ種別の models.run() が受け取る設定のうち、タブが設定として持つものです。データセット、変数の選択、モデル設定、収束制御、信頼水準を指定できます。タブに対応する設定がない項目は models.run() の実行時にだけ指定します。この API に渡すと無視されず、INVALID_INPUT エラーになります。ANOVA の postHoc がこれにあたり、Tukey HSD を計算するかは models.run() で決めます。Cox 回帰の maxIterations と tolerance も同様で、Cox 回帰タブは収束制御の入力を持ちません。負の二項分布の GLM タブでは theta を渡すと手動 theta の使用(useManualTheta: true)に切り替わり、useManualTheta: false を渡すと theta の自動推定へ戻ります。GLM と GLMM のタブで link を渡さずに family を変えると、UI で family を選び直したときと同じく、link はその family のデフォルトに戻ります。設定後の family と link の組み合わせが models.run() の対応表にない場合は INVALID_INPUT エラーになり、タブの設定は変わりません。
指定するカラムは、GUI のセレクタで選べる種類のものに限ります。PCA の columns、Cox 回帰の covariates、生存分析の timeColumn は数値列、eventColumn は int64 または boolean 列、Kaplan-Meier の groupColumn はカテゴリカル列です。GLM、GLMM、線形回帰、Random Forest、ARIMA、ANOVA のカラムは models.run() と同じ規則に従います。選べない種類の列を渡した場合と、同じ列を 2 回渡した場合は INVALID_INPUT エラーになります。カラムを指定した呼び出しでは、1 つの列が 2 つの役割を兼ねられないという規則を更新後のタブ設定に対して確かめます。そのため、タブの説明変数に含まれている列を yColumn だけで渡した場合も INVALID_INPUT エラーになります。confidenceLevel だけの変更のようにカラムを指定しない呼び出しには、この規則を適用しません。Random Forest のタブでは更新後の taskType で応答変数を確かめるため、タブの応答変数が数値列でないまま taskType だけを 'regression' に変えた場合も INVALID_INPUT エラーになります。
PCA の nComponents は保持する成分数の上限で、null を渡すと上限を外して全成分に戻ります。Kaplan-Meier の tau は RMST の制約時点(正の数)で、null を渡すと既定値(群ごとの最大観察時間の最小値)に戻ります。timeColumn を変えると tau は既定値に戻ります。groupColumn に null を渡すと群分けをやめて 1 本の曲線を推定します。
分析を実行済みのタブに対して結果を変える設定を変えると、表示中の結果は現在の設定のものではなくなるため、画面から外れて再実行を促すメッセージに変わります。設定を元に戻すと結果は再び表示されます。結果を得るには models.run() を使うか、GUI で再実行してください。どの設定が結果を変えるかは各タブのページと同じで、GLM・GLMM・線形回帰・Cox 回帰・ARIMA の confidenceLevel は区間の表示だけを変えるため結果を保持します。
await window.midas.models.configure('glm_001', {
type: 'glm',
family: 'binomial',
link: 'logit',
yColumn: 'outcome',
xColumns: ['age', 'treatment'],
});
await window.midas.models.configure('arima_001', {
type: 'arima',
seriesColumn: 'sales',
order: [1, 1, 1],
seasonalPeriod: 12,
});
reports
レポートのテキスト内容は 2 つのメソッドで変更できます。addContent() は既存の内容の末尾に Markdown を追記し、setContent() は内容全体を置換します。どちらもレポートの elements には影響しません。
reports.create(name, description?)
レポートを新規作成します。
const result = await window.midas.reports.create('Analysis Report');
// result.data: { id: 'report_...', name: 'Analysis Report' }
reports.list()
レポートの一覧を取得します。
const result = await window.midas.reports.list();
// result.data: [{ id, name, elementCount }, ...]
reports.getContent(reportId)
レポートの内容を取得します。
const result = await window.midas.reports.getContent('report_001');
// result.data: { content: '## Analysis Results\n...', elements: [{ id, type, title, renderStatus, renderStatusMessage?, renderWarnings? }, ...] }
renderStatus はすべての要素に付与されます。'ok' は描画を妨げる問題が検出されなかったこと、'empty' はデータ行はあるが描画可能なポイントがないこと、'error' はデータセット未発見・データ未ロード・設定の検証エラー(軸が受け付けない列型、スケール種別と非互換なパレット等)、またはファセットのパネル数が上限(Settings の Max Facet Panels)を超えたことで描画できないことを示します。描画ポイント単位の事前チェックの対象は Custom Graph 要素(graphConfig.type === 'custom')だけです。非 custom のグラフ要素はデータセットの存在とロード状態のみを検証し、問題がなければ 'ok' を返します。この 'ok' は描画内容を検証した結果ではありません。
Custom Graph 要素には、診断があれば renderWarnings も付与されます。診断の種類は tabs.getGraphBuilder() と同じです。同じ診断はレポート画面でもグラフの上に警告として表示されます。
reports.setContent(reportId, content)
レポートのテキスト内容を全体置換します。addContent() や addModelSummary() で追加済みのテキストも置き換えられます。content に {{type:id}} 形式の要素参照が含まれていて、その要素 ID がレポートの elements に登録されていない場合、result.warnings で通知されます。
content から {{type:id}} 参照を削除しても、対応する要素は自動削除されません。要素はレポートの elements に残り続け、再び {{type:id}} を content に記述すれば表示されます。要素を完全に削除するには reports.removeElement() を使用してください。
const result = await window.midas.reports.setContent('report_001', '## Updated Results\n...');
// result.data: { contentLength: 42 }
// result.warnings: ['Element reference {{data_table:xxx}} not found in report elements'] // 未登録の参照がある場合
reports.addContent(reportId, markdown)
レポートの末尾に Markdown テキストを追記します。
await window.midas.reports.addContent('report_001', '## Analysis Results\n\nThe model shows...');
reports.addDataTable(reportId, datasetId, options?)
データセットをデータテーブル要素としてレポートに追加します。datasetId にはデータセット ID またはデータセット名(大文字小文字を区別しない)を指定できます。要素は type: 'data_table' として report.elements に登録され、本文に {{data_table:elementId}} の参照が追記されます。
const result = await window.midas.reports.addDataTable('report_001', 'Species Averages', {
columns: ['species', 'avg_sl'],
maxRows: 10
});
// result.data: { elementId, reportId, renderStatus, renderStatusMessage? }
オプション:
columns(string[] | 'all') — 表示する列。カラム名またはカラム ID の配列で指定します。'all'を指定すると、要素は描画時点のデータセットの全列を表示し、後からの列の追加・改名・削除に自動で追従します。省略時は追加時点の全列の明示リストになり、以後の列の変化には追従しません。同じ列を列名と列 ID のように重ねて指定しても、初出の位置に 1 回だけ表示しますmaxRows(number) — 表示する最大行数。1 以上の整数で、上限は 1000 です。省略時は全行(最大 1000 行)を表示します
まだ評価されていない派生データセットは、評価してから追加します。renderStatus はデータセットに行がない場合に 'empty'、それ以外は 'ok' になります。
reports.updateDataTable(reportId, elementId, options)
既存の data_table 要素の表示列と最大行数を変更します。要素 ID と本文中の位置はそのまま維持されます。この API は、レポート編集画面の要素メニューから開く編集モーダルに対応します。
const result = await window.midas.reports.updateDataTable('report_001', 'table-xxx', {
columns: 'all'
});
// result.data: { elementId, reportId }
オプション:
columns(string[] | 'all') — 表示する列。意味はaddDataTable()と同じです。配列で指定した場合、列名は要素が参照するデータセットの現在のスキーマに対して検証されますmaxRows(number) — 表示する最大行数。1 以上の整数で、上限は 1000 です
columns と maxRows の少なくとも一方を指定します。両方を省略すると INVALID_INPUT エラーになります。data_table 以外の要素タイプを指定するとエラーになります。graph_builder 要素の変更には updateElement() を使います。
reports.addModelSummary(reportId, modelId)
モデルのサマリーをレポートに追加します。GLM、GLMM、Linear Regression、Random Forest、ARIMA、ANOVA に対応しています。
全モデルタイプで要素参照方式を使用します(addGraph と同じ方式)。GLM / GLMM / Linear Regression の係数テーブルは type: 'data_table' の要素として report.elements に追加され、レポート本文には {{data_table:elementId}} の参照が挿入されます。Random Forest の Feature Importance も featureImportances がある場合に type: 'data_table' の要素(Feature, MDI の 2 列、Permutation Importance がある場合は Permutation 列を加えた 3 列、Permutation がある場合は Permutation 降順、なければ MDI 降順でソート)として追加されます。テーブルの実体は派生データセットとして project.datasets に登録されるため、Data タブの一覧にも表示されます。このメソッドが登録する data_table 要素(後述の BLUP、ANOVA Type I/III、Prediction Intervals、ARIMA の係数テーブル、ANOVA の各表を含むすべて)の表示列は 'all' で、描画時点の派生データセットの全列を表示します(addDataTable() の columns: 'all' と同じ扱いです)。モデルを削除すると関連する係数の派生データセットも自動的に削除され、削除された dataset / model を参照するレポート要素(data_table / model_stats / graph_builder / crosstab / statistics_summary / anova)がレポートから取り除かれます。引数 modelId が実在する保存済みモデルを指していないと APIResult.success === false でエラーが返ります。
GLM / GLMM / Linear Regression の Model Fit / Random Effects / OLS Fit は、type: 'model_stats' の要素として report.elements に登録され、本文には {{model_stats:elementId}} の参照が挿入されます。要素はモデル ID のみ保持し、描画時に project.models[modelId] から値を動的に解決します。したがって、同じモデル ID で再適合して project.models が上書きされた場合、既存のレポートも自動で新しい値を表示します。レポート作成後にモデルを削除すると、model_stats 要素は "Model not found" プレースホルダを表示します。
GLM と GLMM の係数テーブルは共通の基本列を持ちます: Variable, Estimate, Std. Error, Lower N%, Upper N%。Kenward-Roger 推測で推定された LMM(gaussian + identity の GLMM)では Std. Error の後に df 列が入ります。logit リンクと log リンクでは exp 変換列(OR / IRR / exp(Est.)、exp(Lower N%)、exp(Upper N%))が family/link の組み合わせに応じて追加されます。N はモデル保存時の信頼水準(confidenceLevel、デフォルト 95)です。GLM の係数テーブルは末尾に VIF 列を持ちます。切片行と切片なしモデルでは null になり、係数の相関行列が特異なモデルでは全 predictor 行が null になります。Linear Regression の係数テーブルは基本列に加えて Std. Coef. と VIF を持ちます。Std. Coef. は切片行で null になり、切片なしモデル・退化応答・標準偏差を倍精度で計算できないモデルでは全 predictor 行が null になります。信頼区間はすべて Wald 型(estimate ± criticalValue × SE)です。臨界値の参照分布は GLM では family と link から決まり(models.run() の節の対応表を参照)、GLMM の固定効果は Kenward-Roger 推測の LMM では係数ごとの自由度の t 分布、それ以外は標準正規分布、Linear Regression は常に t 分布を用います。
モデル別の描画内容:
- GLM:
model_stats要素の Model Fit セクションに AIC, BIC, Residual Deviance, Null Deviance, Convergence(反復回数を併記)を表示します - GLMM: BLUP データがある場合は BLUP テーブル(Group, Conditional Mode, Std. Error, Rank の 4 列、estimate 降順でソート済み)を
data_table要素として追加登録し、本文に### Random Effects (BLUP)見出しと{{data_table:blupElementId}}参照を挿入します(result.data.blupElementIdで ID を取得できます)。model_stats要素の Random Effects セクションに Group Variable, Number of Groups, Random Intercept Variance, ICC と、分散パラメータを推定する族では残差分散の行を、Model Fit セクションに Log-Likelihood, AIC, BIC, Convergence(反復回数を併記), Observations, N incomplete(欠損で除外した行がある場合のみ)を表示します。LMM(Gaussian + identity link)では REML Log-Likelihood, ICC と表記し、それ以外の family+link では Log-Likelihood (Laplace), ICC (latent scale) と表記します。ICC の値を表示するのは LMM と Binomial + logit/probit だけです。Poisson、Gamma、Gaussian + log では理論的根拠のある潜在尺度残差分散が存在しないため、ICC の行に N/A (ICC not defined) と表示します。残差分散の行は Gaussian と Gamma で表示します。Gaussian ではリンクによらずこの行の値が応答の条件付き分散 の推定値なので、ラベルは Residual Variance です。Gamma ではこの行の値は分散パラメータ の推定値で、応答の条件付き分散は なので、ラベルは Dispersion (φ) です。モデルに警告(singular fit、分散成分が探索範囲の上限に達した場合、非収束、Kenward-Roger 補正の縮退)がある場合は Warnings セクションを続けて表示します - Linear Regression: 5 つの要素を登録します — 係数テーブル、ANOVA Type I、ANOVA Type III、Prediction Intervals (per-observation 予測区間/信頼区間)、
model_stats要素。model_stats要素の OLS Fit セクションに R², Adjusted R², Residual Std. Error, Observations を、Information Criteria セクションに AIC, BIC を表示します。Convergence は OLS では自明なので表示しません - Random Forest: featureImportances がある場合は Feature Importance の
data_table要素(Feature, MDI の 2 列、Permutation Importance がある場合は Permutation 列を加えた 3 列、Permutation がある場合は Permutation 降順、なければ MDI 降順でソート)を登録します。Model Configuration(Task Type, Number of Trees, Max Depth, Min Samples Split, Min Samples Leaf, Max Features)と OOB Accuracy(分類)/ OOB R²(回帰)はmodel_stats要素として登録します - ARIMA: 係数テーブル(AR, MA, SAR, SMA, Intercept または Drift, Trend の各項と信頼区間)を
data_table要素として登録し、model_stats要素の Model Fit セクションに Order(季節モデルでは (P, D, Q)[s] 部を含む), Log-Likelihood, AIC, BIC, σ², Converged, Observations を表示します - ANOVA: ANOVA Table と Group Statistics を
data_table要素として登録します。一元配置で Tukey HSD が計算済みの場合は Tukey HSD テーブルも追加します。model_stats要素の ANOVA Fit セクションには Design(一元配置か二元配置か、二元配置では交互作用の有無), Sum of Squares(二元配置のみ、Type I か Type III か), Observations, N excluded(除外行がある場合のみ)を表示し、モデルに警告(退化応答、条件数超過、水準の消滅など)がある場合は Warnings セクションを続けて表示します。N excluded には、Group Statistics のどの行にも現れない除外(因子値が欠損した行、有効観測が残らなかった群の行)の内訳を注記として添えます。Group Statistics は Group, N, Excluded(除外行がある場合のみ), Mean, Std. Dev., Lower/Upper N% (Individual)(ANOVA 表のプールされた MSE を使う各群単独の信頼区間で、多重比較の調整はしていません), Min, Max の列を持ちます。Tukey HSD は Group 1, Group 2, Mean Diff, Std. Error, Lower/Upper N% (Simultaneous)(Tukey-Kramer 法による同時信頼区間)に加え、q Critical, MSE, DF(区間の計算に使った値で全行同じ)の列を持ち、本文には Std. Error が平均差の標準誤差であり区間の半幅が q_critical × Std. Error / √2 である旨と、Tukey HSD が等分散を仮定する旨の注記が挿入されます
const result = await window.midas.reports.addModelSummary('report_001', 'model_001');
// result.data: { reportId, addedText, elementId?, statsElementId?, anovaTypeIElementId?, anovaTypeIIIElementId?, groupStatisticsElementId?, tukeyHSDElementId?, predictionIntervalsElementId?, blupElementId? }
// - elementId: 係数 / Feature Importance / ANOVA Table の data_table 要素の id (RF: featureImportances が非空のときのみ)
// - statsElementId: Model Fit / Random Effects / OLS Fit / Model Configuration / ANOVA Fit を描画する model_stats 要素の id
// - blupElementId: GLMM のとき、BLUP テーブルの data_table 要素の id (BLUP データがある場合のみ)
// - anovaTypeIElementId / anovaTypeIIIElementId / predictionIntervalsElementId: Linear Regression のみ
// - groupStatisticsElementId: ANOVA の Group Statistics テーブルの id
// - tukeyHSDElementId: ANOVA かつ Tukey HSD が計算済みのときの id
同一モデルに対して複数回呼び出した場合、係数の派生データセットは名前と操作定義が完全一致する既存の派生データセットがあれば再利用されます。同一モデルの fit 条件を変えて再実行した後に呼ぶと、派生データセットが同名で操作定義が一致しなくなるため Dataset with name "X" already exists エラーで APIResult.success === false が返ります。設定違いのサマリーを並存させたい場合は、旧モデルを削除するか、新モデルを別名で保存してから呼んでください。レポート要素とテキストは毎回新規追加されます。
reports.addGraph(reportId, config)
レポートにグラフをレポート要素として追加します。タブを開かずに Custom Graph を宣言的に作成します。datasetId にはデータセット ID またはデータセット名を指定できます(大文字小文字を区別しません)。カラム名も大文字小文字を区別せずに解決されます。AddGraphInput や LayerDefInput に存在しないプロパティが渡された場合は result.warnings で通知されます。レイヤーの検証で出る警告の先頭には、configureGraph と同じ形式でレイヤーの呼び名が付きます。軸スケール(scales)、レイヤーごとのスケール(layers[].scales)、レイヤーごとの Tooltip(layers[].tooltip。詳細は addGraphLayer を参照)、ファセット(facets)、ブラシ選択の方向(brush)を指定できます。layers の代わりに panels を渡すとマルチパネル構成のグラフになります。各パネルには 1 つ以上のレイヤーが必要です。yScale を省略したパネルの Y 軸スケールは scales.y で、scales.y も省略した場合はそのパネルの先頭レイヤーに割り当てた y 列の型から推論されます。facets、panels、brush のプロパティ詳細は configureGraph を参照してください。globalAes には全レイヤーで共有する aes を指定します。filterExpression にはグラフ全体の行を絞り込むフィルタ式を指定します。構文は Data Table タブのフィルタ入力欄と同じです。中間集計を描くグラフでは lineageTargetDatasetId(datasetId の祖先)を指定して、選択・ドリルダウンの相手を元データにできます(configureGraph を参照)。
const result = await window.midas.reports.addGraph('report_001', {
datasetId: 'ds_001',
layers: [
{ geom: { type: 'point' }, aes: { x: 'weight', y: 'height' } }
],
title: 'Weight vs Height',
aspectRatio: 'custom',
height: 500,
});
// result.data: { elementId, reportId, renderStatus, renderStatusMessage?, renderWarnings? }
renderStatus はグラフのレンダリング結果です。'ok' はデータポイントが存在し、指定した aes がすべて適用されて描画されます。'partial' はデータポイントが存在し描画されますが、geom が対応していない aes プロパティが無視されたことを示します(意図した描画と異なる可能性があります)。'empty' はデータ行はあるが描画可能なポイントがないことを示します(フィルタ除外等)。'error' は設定の検証エラー(軸が受け付けない列型、スケール種別と非互換なパレット、必須 aesthetic の欠落等)で描画不能です。renderStatusMessage には 'ok' 以外の場合に原因の説明が入ります。診断があれば renderWarnings も付与されます。診断の種類は tabs.getGraphBuilder() と同じで、同じ内容がレポート画面でもグラフの上に警告として表示されます。
ファセットを指定したグラフは、実際の描画と同じデータ処理で評価されます。MIDAS はデータをパネルへ分割し、全パネル共通のドメインを計算してから、各パネルを個別に評価します。パネル分割後にだけ現れる状態もこの評価で検出されるため、renderStatus と renderWarnings は描画結果と一致します。renderWarnings の各行には警告が出たパネルのタイトルが付き、全パネルで同一の警告は All panels: を付けた 1 行にまとめられます。パネル数が設定の上限(Settings の Max Facet Panels)を超えるとグラフは描画されないため、renderStatus は 'error' になります。
グラフはレポート要素として保存され、レポートの content に {{graph_builder:elementId}} の参照が追記されます。
利用可能な geom、stat、position の一覧は Custom Graph リファレンスを参照してください。各 Statistic の params は指定可能な値とデフォルト値とともに同ページに掲載しています。ファセット、座標系などグラフレベルのオプションは Custom Graph を参照してください。
coordinates には 'flipped' または 'cartesian' を指定できます。'flipped' を指定すると X 軸と Y 軸が入れ替わります(例: 縦棒グラフが横棒グラフになります)。デフォルトは 'cartesian' です。
aspectRatio には '16:9'、'4:3'、'1:1'、'3:4'、'9:16'、'custom' を指定できます。デフォルトは '16:9' です。'custom' 以外のプリセット値を指定した場合、アスペクト比が表示時の高さを決定するため height は描画に使用されません。'custom' の場合は height で高さを指定します。height のデフォルトは 400、最小値は 200、最大値は 5000 です。
reports.updateElement(reportId, elementId, config)
既存の graph_builder 要素のグラフ設定を全置換します。要素 ID と本文中の位置はそのまま維持されます。config は addGraph と同じ構造です(datasetId にはデータセット ID または名前を指定できます)。要素の幅(width)と配置(layout)は config に含まれないため、更新後も維持されます。
const result = await window.midas.reports.updateElement('report_001', 'graph-xxx', {
datasetId: 'ds_001',
layers: [
{ geom: { type: 'bar' }, aes: { x: 'category', y: 'count' } }
],
title: 'Updated Chart',
});
// result.data: { elementId, reportId, renderStatus, renderStatusMessage?, renderWarnings? }
renderStatus、renderStatusMessage、renderWarnings の意味は addGraph() と同じです。
graph_builder 以外の要素タイプ(data_table、model_stats 等)を指定するとエラーになります。data_table 要素の表示列と最大行数は updateDataTable() で変更できます。
reports.removeElement(reportId, elementId)
レポートから要素を削除し、本文中の {{type:elementId}} 参照も除去します。全要素タイプ(graph_builder、data_table、model_stats、crosstab、statistics_summary、anova)に対応しています。関連リソース(derived dataset、モデル等)は削除されません。
await window.midas.reports.removeElement('report_001', 'graph-xxx');
// result.data: { elementId, reportId }
reports.scrollTo(reportId, target)
レポートの表示位置を要素または見出しへ移動します。見出しへの移動は、UI のレポートヘッダーにある Contents メニューから見出しを選ぶ操作と同じです。target には elementId と heading のどちらか一方だけを指定します。heading はアンカー名(model-fit 等)でも見出しのテキストでも解決します。移動後は、上方にある表の評価が終わって高さが変わっても、ユーザーがスクロール操作を始めるまで移動先を画面内に保ちます。
対象レポートがタブで開かれている必要があります。開かれていない場合は NOT_FOUND を返し、tabs.open() の案内を suggestion に含めます。開かれている場合は、そのタブを前面に出してからスクロールします。
指定した見出しが存在しない場合と、対象が描画されていない場合は NOT_FOUND を返します。要素が存在しても本文に {{type:elementId}} 参照がない場合は描画されないため INVALID_INPUT を返します。
reports.addGraph()・reports.addDataTable()・reports.addModelSummary() で追加した要素は、次にそのレポートが表示された時点で自動的に画面へ入ります。このメソッドは任意の位置へ移動するために使います。
await window.midas.reports.scrollTo('report_001', { heading: 'Model Fit' });
// result.data: { reportId, anchor: 'model-fit' }
await window.midas.reports.scrollTo('report_001', { elementId: 'graph-xxx' });
// result.data: { reportId, elementId: 'graph-xxx' }
reports.remove(reportId)
レポートをプロジェクトから削除します。対象レポートを参照しているタブを閉じてからレポートを削除します。
await window.midas.reports.remove('report_001');
layout
layout.split(config)
ペインを分割して新しい領域を作成します。
const result = await window.midas.layout.split({
tabId: 'tab_001',
direction: 'horizontal' // 'horizontal' または 'vertical'
});
// result.data: { newPaneId: 'pane_...', originalPaneId: 'pane_...' }
返された newPaneId を tabs.moveToPane() に渡すことで、タブを新しいペインに配置できます。
layout.get()
ペインの構成を取得します。layout.split() で自分が作ったのではないペインへ tabs.moveToPane() でタブを移すときは、ここで得たペイン ID を使います。
const result = await window.midas.layout.get();
// result.data: { rootPane, activePaneId }
rootPane はペインのツリーです。ノードは分割かペインのどちらかで、type が 'split' なら分割、'container' ならペインです。
分割ノードは分割の方向と比率を表します。direction が 'horizontal' なら左右分割、'vertical' なら上下分割です。splitRatio は children の 1 つ目が占める割合です。children は 2 要素の配列で、左右分割なら左・右の順、上下分割なら上・下の順に並びます。
ペインはタブを持ちます。tabs の各要素は tabs.list() と同じ形式です。activeTabId は前面に表示されているタブの ID で、タブがなければ null です。最後に操作されたペインの ID は activePaneId に入るため、ペインがアクティブかどうかは id と activePaneId を比べて判定します。
どちらのノードも rect を持ちます。これはレイアウト領域全体を幅 1・高さ 1 としたときの位置とサイズで、原点は左上です。分割比から計算した値のため、ペイン間のリサイザーが占める幅は含みません。
ペインはさらに viewportRect を持ちます。これは DOM 要素を実測したビューポート座標上の位置とサイズで、単位は px、基準は getBoundingClientRect() と同じです。ペインがまだ描画されていない場合は null になります。ウィンドウのリサイズやリサイザーのドラッグで変わる値のため、スクリーンショットと突き合わせるときは取得しなおしてください。
// 左右分割の右側が上下に分かれているレイアウトで、その下側にタブを移す
const { rootPane } = (await window.midas.layout.get()).data;
const [, right] = rootPane.children;
const [, rightBottom] = right.children;
await window.midas.tabs.moveToPane('tab_001', rightBottom.id);
エラーコード
| コード | 説明 |
|---|---|
INTERNAL_ERROR | 内部エラー(想定外の例外) |
NO_PROJECT | プロジェクトが読み込まれていない |
NOT_FOUND | 指定したリソースが見つからない |
DATASET_NOT_FOUND | テーブル名に一致するデータセットが見つからない |
COLUMN_NOT_FOUND | カラムが見つからない |
INVALID_TAB_TYPE | タブタイプが無効 |
INVALID_TAB_TYPE_FOR_OPERATION | タブタイプがこの操作に対応していない |
INVALID_GRAPH_TYPE | カスタムグラフ以外でレイヤー操作を試みた |
INVALID_INPUT | 入力パラメータが無効。入力自体は正しくても、対象がその操作に必要な状態にない場合にも返る。再推定を待っているモデルを指定した場合が該当する |
INDEX_OUT_OF_RANGE | レイヤーインデックスが範囲外 |
DATASET_ALREADY_EXISTS | 同名(大文字小文字を区別しない)のデータセットが既に存在する(overwrite: false 時) |
SELF_REFERENCE | 上書き対象が操作自身の依存先(祖先)である |
NAME_CONFLICT | 派生系メソッドの出力名が既存プライマリデータセットと衝突する |
OPERATION_TYPE_MISMATCH | 上書き対象の派生データセットが異なるメソッドで作成されている。各派生メソッド(derive、addColumns、setColumnSchema、addOrthogonalPolynomials、reshapeWideToLong、reshapeLongToWide、dummyCode、filter)はそれぞれ固有の operation type を書き込む。異なるタイプ間での上書きは拒否される(例: addColumns() で作成したデータセットを derive() で上書き、derive() で作成したデータセットを addColumns() で上書き) |
AMBIGUOUS_TABLE_NAME | テーブル名に case-insensitive で複数のデータセットがマッチした |
EXECUTION_ERROR | SQL 実行エラー |
UNSUPPORTED_MODEL_TYPE | 未対応のモデルタイプ |
MODEL_EXECUTION_ERROR | モデル実行エラー |
PREDICTION_DATASET_FAILED | 予測結果からのデータセット作成に失敗 |
NUMERICAL_ERROR | 数値計算エラー(行列の特異性、反復の発散など) |
INSUFFICIENT_DATA | 分析に必要なデータが不足(有効な観測数の不足、因子水準の不足など) |
NO_DATA | データセットにデータがロードされていない |
NO_CONTAINER | アクティブなコンテナがない |
NO_TARGET | SQL にテーブル参照がない |
SQL_PARSE_ERROR | DuckDB が SQL を解析できない。message に DuckDB のパーサーが返したメッセージが入る |
NO_CONFIG | Graph Builder 設定がない |
SPLIT_FAILED | ペイン分割に失敗 |
DUPLICATE_FAILED | タブの複製に失敗 |
SANDBOX_MODE | サンドボックスモードで保存不可 |
NO_SIGNING_KEY | 署名鍵が未設定でエクスポート・ダウンロードできない |
ENUM_ALREADY_EXISTS | enum 定義が既に存在する |
ENUM_NOT_FOUND | enum 定義が見つからない |
ENUM_IN_USE | enum 定義が列から参照されている |
ENUM_VALUE_MISMATCH | enum 定義外の値がデータに存在する |
FETCH_ERROR | URL フェッチ失敗(ネットワークエラー、タイムアウト、HTTP エラー) |
USER_CANCELLED | ユーザーまたは呼び出し元が操作をキャンセルした(未保存変更の確認ダイアログで拒否、models.run() の ARIMA 実行を signal で中断など) |
EDIT_MODE_ACTIVE | Data Table タブがデータセットを Edit Mode で開いているため、行の除外・復元を受け付けない |
参考
- ライブリファレンス: プロジェクト画面で
window.midas.help()を実行
このページの Markdown 版もあります。