Agent API (window.midas)

AI エージェントや Playwright などの外部ツールから MIDAS をプログラムで操作するための API です。

概要

window.midas は、ブラウザの DevTools コンソールや Playwright などの自動化ツールから MIDAS の機能にアクセスするための JavaScript API です。データセットの操作、タブの管理、統計モデルの実行、レポートの編集などを行えます。

API が利用可能なタイミング

  • プロジェクト画面: すべてのメソッドが利用可能
  • ランチャー画面: help() と、プロジェクトを開く・新規作成するメソッド(project.openFile()project.openUrl()project.createFromCsv()project.createFromCsvUrl()project.openSample()project.listSamples())が利用可能。他のメソッドは NO_PROJECT エラーを返す

Playwright で自動化する場合は、これらのメソッドでプロジェクトを開くか新規作成してから他の API メソッドを使用してください。

AI エージェント向けクイックスタート

  1. status() でプロジェクトの状態を確認します(データセット数、タブ数、モデル数)
  2. datasets.list()datasets.describe(id) でデータの構成を把握します
  3. データモデルで永続化、データセットの種類、グラフ仕様の構造を理解します
  4. 目的に応じてメソッド一覧から操作を選びます

使い方

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() メソッドで、利用可能なメソッド名の一覧を確認できます。メソッド名を渡すと、そのメソッドの説明・シグネチャ・使用例を返します。戻り値には 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);

レスポンス形式

help() を除くすべてのメソッドは非同期で、APIResult<T> 型の統一されたレスポンスを返します。help() のみ同期メソッドで、メソッド名の一覧、またはメソッド名を指定した場合はそのメソッドの詳細を直接返します。

// 成功時
{
  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 に格納されます。

// 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() を呼ばずにページをリロードすると、そのセッションの変更はすべて失われます。

// データセットのスキーマを変更
await window.midas.datasets.setColumnSchema('ds_001', { ... });

// この時点ではメモリ上だけに反映されている

await window.midas.project.save();
// ブラウザストレージに書き込まれた

DataSet の種類

datasets.list() が返すデータセットには 2 つの種類があります。

Primary — CSV などからインポートした元データです。データ本体をプロジェクトファイル内に保持します。

Derived — SQL やクロス集計などの変換操作から作成されたデータです。データ本体ではなく操作の定義(どの SQL を実行したか等)をプロジェクトファイルに保存します。データはキャッシュであり、プロジェクトファイルには含まれません。プロジェクトを開くたびに操作を再実行して再計算されるため、親を参照する派生ではその時点の親データが反映されます。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.rundatasets.describefetchtabs.opensetDatasetreports.addDataTableaddGraph など)に渡すと 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)など、グラフ全体に関わる設定です。tabs.configureGraph()reports.addGraph() で指定します。

レイヤー — 幾何要素(geom: 散布図の点、折れ線など)、統計変換(stats)、aesthetic mapping(aes: どの列を X 軸・色・サイズに対応させるか)を組み合わせた描画単位です。1 つのグラフに複数のレイヤーを重ねられます。tabs.addGraphLayer() で追加します。各レイヤーは scales で aesthetic ごとのスケールを個別に設定できます。

グラフレベルの globalAes は全レイヤーの既定値になり、各レイヤーの aes で上書きできます。

設定の詳細は Custom GraphCustom 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 エラーを返します。

project.exportMds()

プロジェクトを MDS(MIDAS のプロジェクトファイル形式)バイナリとしてエクスポートします。エクスポートされたデータは ArrayBuffer として返されます。エクスポートには署名鍵が必要です。鍵が未設定の場合は NO_SIGNING_KEY エラーを返すので、Settings の Signing Keys で鍵を作成してください。

const result = await window.midas.project.exportMds();
// result.data: { data: ArrayBuffer, size: 12345, suggestedFilename: 'MyProject.mds' }

project.downloadMds()

プロジェクトを MDS ファイルとしてブラウザからダウンロードします。exportMds() と同じく、鍵が未設定の場合は NO_SIGNING_KEY エラーを返します。

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 に含まれ、設定で「信頼されていないドメインへの接続をブロック」を有効にしている場合はエラーになります。詳細は プライバシーとセキュリティ を参照してください。ネットワークエラー・タイムアウトのいずれの場合も 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' }

オプション:

  • name (string, デフォルト: "Untitled") — データセット名を指定します。プロジェクト名にもなります
  • hasHeader (boolean, デフォルト: true) — 先頭行をヘッダーとして扱うかを指定します
  • encoding ("utf-8" | "shift_jis" | "euc-jp") — 文字エンコーディングを指定します。省略時はバイト列から自動判定します

現在のプロジェクトに未保存の変更がある場合、確認ダイアログが表示されます。ユーザーがキャンセルすると 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' }

オプション:

  • name (string) — データセット名を指定します。省略時は URL から推測します。プロジェクト名にもなります
  • hasHeader (boolean, デフォルト: true) — 先頭行をヘッダーとして扱うかを指定します
  • encoding ("utf-8" | "shift_jis" | "euc-jp") — 文字エンコーディングを指定します。省略時はバイト列から自動判定します
  • signal (AbortSignal) — フェッチの中断に使用します

現在のプロジェクトに未保存の変更がある場合、確認ダイアログが表示されます。ユーザーがキャンセルすると USER_CANCELLED を返します。URL のバリデーションとセキュリティ制限は datasets.importFromURL() と同じです。ネットワークエラー・タイムアウトの場合は 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 }, ...] }

datasets

datasets.list()

プロジェクト内のデータセット一覧を取得します。

const result = await window.midas.datasets.list();
// result.data: [{ id, name, rows, columns, type, parentIds? }, ...]

type'primary'(読み込んだデータ)または 'derived'(SQL やその他の操作で作成)のいずれかです。parentIds は派生データセットが依存する元データセットの ID です。どのデータセットも参照しない SQL(generate_series など)から作成した派生データセットでは空配列になります。一時的な内部データセット(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 の各要素には idnametype が含まれます。scaleenumName はオプショナルです。enumName は列の型が enum の場合に、対応する enum 定義の名前を返します。MIDAS が内部で追加する行番号列(Row#)は columns に含まれません。columns の数は datasets.list()columns と一致します。

datasets.profile(id)

データセットの各列について基本統計量を返します。データセット ID またはデータセット名(大文字小文字を区別しない)を指定できます。まだ評価されていない派生データセットには NO_DATA エラーを返します。保存済みプロジェクトを開いた直後や、依存元のデータセットを上書きした直後がこれに当たります。Data Table タブで開いて評価するか、datasets.query() で行を直接読みます。

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, nonFiniteCount: 0,
//       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 }
//       ]
//     },
//     ...
//   ]
// }

全列に nullCountuniqueCount が含まれます。uniqueCount は null 以外の全ユニーク値数で、非有限値(Infinity、NaN)も含みます。数値列(int64float64)には nonFiniteCount(Infinity や NaN の件数)、minmaxmeanmediansd(標本標準偏差、n-1 で除算)が追加されます。非有限値は統計量の計算から除外されます。有効な数値が存在しない場合は minsd の値が null になります。sd は有効な値が 1 件のみ(n < 2)の場合も 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: [...] }

テーブル名はデータセット名から自動解決されます(大文字小文字を区別しません)。日本語やスペースを含むデータセット名は、SQL 内でダブルクォートで囲んでください(例: SELECT * FROM "売上データ")。options.limitoptions.offset でページネーションを制御できます。limit を省略すると全行が返されます。SELECT * でも、MIDAS が内部で追加する行番号列(Row#)は結果に含まれません。行番号が必要な場合は SELECT ROW_NUMBER() OVER () などで明示的に列を作成してください。

SQL の出力列名が予約プレフィックス __midas_(MIDAS 内部列のために予約)で始まる場合は INVALID_INPUT エラーを返します。予約されていない名前にエイリアスしてください。

受け付けられるのは単一の 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 }

テーブル名はデータセット名から自動解決されます(大文字小文字を区別しません)。日本語やスペースを含むデータセット名は、SQL 内でダブルクォートで囲んでください(例: SELECT * FROM "売上データ")。derive() の完了時点で結果データはメモリ上で評価済みであり、直後に datasets.fetch()datasets.profile() で参照できます。デフォルトでは同名の派生データセットが存在する場合に in-place で更新します。既存のデータセット ID が維持されるため、そのデータセットを参照しているタブや依存する派生データセットの参照は壊れません。上書き対象に依存する派生データセットのキャッシュと依存モデルの推定結果は無効化され、次回アクセス時に新しいデータで再評価されます。options.overwritefalse にすると、同名の派生データセットが既に存在する場合にエラーを返します。

出力名が 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 エラーを返します。予約されていない名前にエイリアスしてください。

SQL が複数のテーブルを参照している場合(JOIN やサブクエリ)、参照された全データセットの ID が派生データセットの parentIds として保存されます。datasets.list() で取得できる各派生データセットのエントリに parentIds 配列が含まれます。Project 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)' }

戻り値の idname は分析対象となる変換後のデータセットを指します。raw 側は sourceDatasetIdsourceDatasetName で参照できます(変換後のデータセットが作られた場合のみ含まれます)。以降の datasets.query やグラフ・モデルの対象には name のデータセットを使ってください。

options のプロパティは次のとおりです。

  • name: 取り込み後のデータセット名。省略した場合は URL から推測されます。
  • hasHeader: 先頭行をヘッダーとして扱うかどうか。デフォルトは true です。false の場合、列名は Column1Column2 のように自動生成されます。
  • encoding: 文字エンコーディング("utf-8""shift_jis""euc-jp")。省略時は utf-8 として読み込みます。URL からの取り込みではバイト列からの自動判定を行いません。
  • overwrite: 同名のデータセットが存在する場合に置き換えるかどうか。デフォルトは false です。

同名(大文字小文字を区別しない)のデータセットが既に存在する場合はエラー(DATASET_ALREADY_EXISTS)を返します。options.overwritetrue にすると、既存のデータセットを in-place で置き換えます(ID が維持されます)。過去のインポートで自動作成されたペア(変換後 + raw)を上書きする場合は、両方のデータセットが更新されます。既存のプライマリデータセットと同名で、かつ新しいデータで変換後のデータセットが作られる場合は上書きできず、NAME_CONFLICT エラーになります。返却される columnCount は元ファイルの列数と一致します。MIDAS が内部で追加する行番号列(Row#)はカウントに含まれません。

CSV パースに失敗した場合(空データ、ヘッダー行が空、行ごとの列数が食い違う、URL バリデーション失敗、Content-Type 不正など)は INVALID_INPUT エラーを返します。ネットワーク障害やタイムアウトは EXECUTION_ERROR を返します。サイズ警告閾値(デフォルト 10 MB、Settings で変更可能)を超えるファイルはインポートされますが、サイズ警告が result.warnings に含まれます。__midas_ で始まる列ヘッダー(MIDAS 内部列のために予約)は予約されていない名前に自動的にリネームされ、リネームしたヘッダーごとに警告が 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)' }

dataArrayBuffer または ArrayBufferViewUint8ArrayDataView、Node.js の Buffer 等)を受け付けます。options のプロパティは次のとおりです。

  • name: 取り込み後のデータセット名。省略時は "Untitled"
  • hasHeader: 先頭行をヘッダーとして扱うか。省略時は true
  • encoding: 文字エンコーディング("utf-8""shift_jis""euc-jp")。省略時はバイト列から自動判定
  • overwrite: 同名のデータセットが存在する場合に上書きするか。省略時は false

区切り文字は PapaParse が自動判定するため、CSV と TSV のどちらも渡せます。返却される columnCount は元ファイルの列数と一致します。MIDAS が内部で追加する行番号列(Row#)はカウントに含まれません。

データセットの作られ方は importFromURL と同じです。全列を文字列として読み込んだプライマリデータセット(名前に (raw))と、型判定に基づく変換を適用した派生データセット(指定した名前を継承)が作られ、戻り値の idname は変換後のデータセットを指します。同名(大文字小文字を区別しない)のデータセットが既に存在する場合はエラー(DATASET_ALREADY_EXISTS)を返します。overwrite: true で既存を in-place で置き換えられます(ID 維持)。過去のインポートで自動作成されたペアを上書きする場合は両方が更新され、既存のプライマリデータセットと同名で変換後のデータセットが作られる場合は NAME_CONFLICT エラーになります。__midas_ で始まる列ヘッダー(MIDAS 内部列のために予約)は予約されていない名前に自動的にリネームされ、リネームしたヘッダーごとに警告が result.warnings に含まれます。CSV パースに失敗した場合(空データ、ヘッダー行が空、行ごとの列数が食い違う、など)は 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 引数の explogsqrtlogisticabs と 2 引数の powminmax です
  • カテゴリ分岐: { type: 'cases', over, map, default? }
  • 過去参照: { type: 'lag', name, k }k は正の整数で、time があるときだけ使えます

語彙はタブのテキスト式と同じです。比較の返す値、caseslag の規則、生存時間データの構成は式の構文生存時間データの設定例を参照してください。

options のプロパティは次のとおりです。

  • name: データセット名(必須)
  • rows: 生成する行数(1 以上、上限 10,000,000)。spec.factorsspec.time がある場合は省略でき、そこから決まる行数が使われます。指定する場合はその行数と一致する必要があります。どちらも無い場合は必須です
  • seed: 乱数シード(必須)。符号付き 32bit 整数。同じ specrowsseed は同じデータを再現します
  • overwrite: 同名の合成データセットが存在する場合に上書きするか。省略時は false

生成したデータは MDS に保存せず、specseed を生成 operation に保持します。リロード時はこの operation からデータを再生成します。再現の範囲と値を固定する方法は保存したデータセットの編集を参照してください。

生成中にパラメータの式が定義域を外れた値になると、その時点で INVALID_INPUT を返して失敗します。sd が 0 以下になる場合や、p[0, 1] の外になる場合が該当します。線形予測子は logistic で 0 から 1 の範囲に、exp で正の値に写せます。ただし浮動小数点の限界を超える極端な線形予測子では exp の結果が 0 または無限大になり、生成は失敗します。

無効な specINVALID_INPUT を返します。次の場合が該当します。

  • 循環参照または未定義列の参照がある
  • sd が 0 以下になるなど、パラメータが定義域を外れる
  • cases が全水準を被覆せず、default も無い
  • by を持つ列の式が、群内で値の変わる列を参照する
  • rows または seed が範囲外である

同名のデータセットが既に存在し overwritefalse の場合は 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 の spec
  • rowCount: 因子から決まる行数

spec はそのまま、または編集してから generateSynthetic に渡せます。すべてのプリセットは factors を持ち行数が spec から決まるため、options.rows は不要です。各プリセットが作るデータの内容と、MIDAS 内で当てはめられるモデルの制約はプリセットの説明を参照してください。

datasets.reloadFromURL(options?)

URL から取り込んだデータセットを元の URL から再取得して更新します。

// すべての URL-sourced データセットを再取得
const result = await window.midas.datasets.reloadFromURL();
// result.data: { reloaded: [{ datasetId, name, rowCount, previousRowCount }], failed: [] }

// 特定のデータセットのみ再取得
const result = await window.midas.datasets.reloadFromURL({
  datasetId: 'primary_abc123',
});

options.datasetId を指定すると、そのデータセットだけを再取得します。省略すると、URL から取り込まれたすべてのプライマリデータセットが対象になります。指定した ID のデータセットが存在しない場合は DATASET_NOT_FOUND エラー、存在するが URL から取り込まれたものでない場合は INVALID_INPUT エラーを返します。

再取得ではデータセット ID、名前、派生データセット、モデルとの紐づけが維持されます。除外行と行コメントはクリアされます。再取得先の CSV から既存の列が消えた場合(削除や改名)や、列の型が変わった場合は、そのデータセットのリロードは失敗します。列の追加や順番の変更は許容されます。

result.data.reloaded には再取得に成功したデータセットの情報(datasetIdname、更新後の行数 rowCount、更新前の行数 previousRowCount)が含まれます。result.data.failed には失敗したデータセットの情報(datasetIdnamesourceUrlerror)が含まれます。一部のデータセットが失敗した場合でも successtrue になります。全件失敗した場合のみ success: false になります。

datasets.addColumns(datasetId, input)

計算列をデータセットに追加します。datasetId にはデータセット ID またはデータセット名(大文字小文字を区別しない)を指定できます。結果は新しい派生データセットとして作成されます。expression は DuckDB の SQL 式構文に従います。CASE WHENCAST 等の 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 内部列のために予約)で始まる場合は 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 またはデータセット名(大文字小文字を区別しない)を指定できます。idColumnsvalueColumns には列名または列 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 が空の場合、または variableNamevalueName が予約プレフィックス __midas_(MIDAS 内部列のために予約)で始まる場合は INVALID_INPUT エラーを返します。outputName で出力データセット名を指定できます。同名の派生データセットが存在する場合は in-place で更新し、既存のデータセット ID を維持します。outputName がソース datasetId またはその祖先のいずれかに解決される場合は SELF_REFERENCE、同名のプライマリデータセットと衝突する場合は NAME_CONFLICT、同名の派生データセットが異なるメソッドで作成されている場合は OPERATION_TYPE_MISMATCHoutputName に case-insensitive で複数の既存データセットがマッチする場合は AMBIGUOUS_TABLE_NAME エラーを返します。

datasets.reshapeLongToWide(datasetId, input)

データセットを Long 形式から Wide 形式へ変換(pivot)します。datasetId にはデータセット ID またはデータセット名(大文字小文字を区別しない)を指定できます。idColumnsvariableColumnvalueColumn には列名または列 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_MISMATCHoutputName に case-insensitive で複数の既存データセットがマッチする場合は AMBIGUOUS_TABLE_NAME エラーを返します。

datasets.dummyCode(datasetId, input)

カテゴリ変数を 0/1 のダミー変数(treatment coding)に変換します。datasetId にはデータセット ID またはデータセット名(大文字小文字を区別しない)を指定できます。columnsincludedColumnskeepOriginalColumns には列名または列 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 # を除くソースの全列を含めます。ここに無い列は出力から除外されます。keepOriginalColumnscolumns の部分集合)で指定した列は、ダミー変数化後も元の列を出力に残します。scaleOverrides は素通りする列の測定尺度を上書きします。ダミー変数の列自体は常に ratio 尺度として記録されます。columns に指定した列が名義・順序尺度以外または boolean 型の場合、ユニーク値が 2 未満の場合(データセットの行数が 0 の場合を含む)、referenceCategories に指定したカテゴリがデータに存在しない場合、または keepOriginalColumnscolumns に無い列が含まれる場合は INVALID_INPUT エラーを返します。outputName で出力データセット名を指定できます。同名の派生データセットが存在する場合は in-place で更新し、既存のデータセット ID を維持します。outputName がソース datasetId またはその祖先のいずれかに解決される場合は SELF_REFERENCE、同名のプライマリデータセットと衝突する場合は NAME_CONFLICT、同名の派生データセットが異なるメソッドで作成されている場合は OPERATION_TYPE_MISMATCHoutputName に 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 タブのフィルタ入力欄と同じです。expression が空、構文が不正、またはデータセットに無い列を参照している場合は INVALID_INPUT エラーを返します。outputName で出力データセット名を指定できます。同名の派生データセットが存在する場合は in-place で更新し、既存のデータセット ID を維持します。outputName がソース datasetId またはその祖先のいずれかに解決される場合は SELF_REFERENCE、同名のプライマリデータセットと衝突する場合は NAME_CONFLICT、同名の派生データセットが異なるメソッドで作成されている場合は OPERATION_TYPE_MISMATCHoutputName に 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 には typescaleenumName を指定できます。少なくとも1つは必須です。データ型の変更は SQL による型変換を伴うため、新しい派生データセットが作成されます。同名の出力データセットが既に存在する場合は in-place で更新し、既存のデータセット ID を維持します。outputName がソースデータセット自身またはその祖先(派生元のデータセット)を指す場合、依存関係の循環を防ぐため SELF_REFERENCE エラーを返します。同名のプライマリデータセットと衝突する場合は NAME_CONFLICT エラーを返します。同名の派生データセットが異なるメソッドで作成されている場合は OPERATION_TYPE_MISMATCH エラーを返します。outputName に case-insensitive で複数の既存データセットがマッチする場合は AMBIGUOUS_TABLE_NAME エラーを返します。測定尺度のみの変更はメタデータの更新のみで、派生データセットは作成されません。

enum 型への変換では、列の値が全て enum 定義内または NULL である必要があります。定義外の値が存在する場合は ENUM_VALUE_MISMATCH で拒否されます。事前に Convert Column Types タブで不要な値を NULL 化または除外するか、enums.update で定義に値を追加してください。

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 派生データセットのクエリは、新しい名前に書き換わります。データセット名は大文字小文字を区別せずに比較するため、Iris があるときに iris へは変更できません。

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 クエリは一致しなくなるため、リネーム後に自分で書き換えてください。リネームすると、このデータセットに依存する派生データセット、モデル、レポート要素のキャッシュは無効化され、再計算されます。

派生データセットの列名は、再評価のたびに operation から作り直されます。派生データセットの列をリネームしても、プロジェクトを開き直すと元の名前に戻ります。CSV インポートが作る型変換済みデータセットもこれにあたるため、列名を残すには生の値を持つ <名前> (raw) の側をリネームしてください。

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 では encodingutf-8shift_jiseuc-jp)と、UTF-8 のときの bom を指定できます。JSON は常に UTF-8 です。指定した文字コードで表現できない文字は HTML 文字参照(&#233; など)に置き換わります。置き換わった文字は 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: { datasetId: 'manual_...', name: 'Measurements', columnIds: ['col_0_...', 'col_1_...'], rowCount: 3 }

測定尺度は scale を省略すると列のデータ型から推論します。値の書き込みには datasets.setCellValues() を使います。列の type に指定できるのは stringint64float64booleandatedatetime です。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 は列のデータ型に合う値である必要があります。null はどの型でも欠損値として書き込めます。入力はすべて検証してから書き込むため、1 つでも不正な指定があれば何も書き換えません。

派生データセットの値は operation から導出されるため、セル単位では書き換えられません。CSV インポートが作る型変換済みデータセットもこれにあたるので、取り込んだ値を直すには生の値を持つ <名前> (raw) の側を指定してください。

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, ... }, ...]
// }

limitoffset で取得範囲を制御します。省略時は全行を返します。MIDAS が内部で追加する行番号列(Row#)は結果に含まれません。まだ評価されていない派生データセットには NO_DATA エラーを返します。保存済みプロジェクトを開いた直後や、依存元のデータセットを上書きした直後がこれに当たります。Data Table タブで開いて評価するか、datasets.query() で行を直接読みます。

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 で valuecanonical の変換を適用します。

const result = await window.midas.datasets.normalize('ds_001', 'city', mp.data.datasetId, {
  mode: 'replace'
});
// result.data: { id: 'derived_...', name: 'sales_normalized', rowCount: 100, columnCount: 5 }

mode'add'(デフォルト)で {column}_normalized 列を追加、'replace' で元列を COALESCE(canonical, 元値) で置き換えます。name で出力データセット名を指定できます(デフォルト: {source}_normalized)。マッピングデータセットは value 列と canonical 列を持つ任意のデータセットを指定できます。

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 を含む)、JOIN、FROM のサブクエリと CTE、素の射影と WHERE フィルタ、DISTINCT、テーブル全体の集計(全行が寄与)。列型変換で作った派生データセットも同じ形でたどれます。filter・crosstab・reshape(wide/long)で作った派生データセットも対象で、親の列値との一致で寄与行を集めます。

たどれない形のときは traceable: falsereason を返します。

  • window-function: ウィンドウ関数または QUALIFY 句を含む
  • set-operation: UNION などの集合演算を含む
  • nondeterministic: TABLESAMPLE や ORDER BY を伴わない LIMIT を含む
  • nested-aggregation: FROM のサブクエリや CTE がそれ自身集計している
  • ambiguous-group-keys: GROUP BY のキーが出力列に無く、行のキー値を読めない
  • 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 などです。

datasets.openContributingRows(datasetId, rowIndices, targetDatasetId?)

派生データセットの指定行に寄与した親(元データ)の行を traceRowLineage と同じ規則でたどり、寄与行だけを含む Contributing rows タブを開きます。JOIN では寄与した親ごとにタブを開きます。

targetDatasetId(データセットの ID または名前)を渡すと、来歴チェーン上の指定した祖先まで複数のホップを内部でまとめて処理し、その祖先の寄与行ビューだけを開きます(途中のタブは開きません)。targetDatasetId は対象データセットのたどれる祖先のいずれかである必要があり、そうでなければ INVALID_INPUT エラーを返します。省略すると直近の親へ 1 段だけたどります。

開いた Contributing rows ビューの行を指定してもう一度呼ぶと、親チェーンをもう 1 段さかのぼります(元データに向かって進みます)。チェーンが primary データセットか、辿る親を持たない派生に行き着くとそこで止まり、traceable: falsereason: 'no-parent-dataset' を返します。これを繰り返すと、集計表から元データまで段階的にたどれます。

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: falsereason を返します。タブを開くため、アクティブなタブコンテナが無い場合(プロジェクト画面の外から呼んだ場合など)は NO_CONTAINER エラーを返します。

開いたタブの ephemeral データセットは来歴を保持します。タブの「Save as Dataset」で、再評価のたびに寄与行をたどり直す永続データセット(RowLineageOperation)に昇格します。

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 化または除外するか、値を残したまま定義に保持してください。

enums.remove(name)

enum 定義を削除します。列がまだこの enum を参照している場合は ENUM_IN_USE エラーで拒否されます。

await window.midas.enums.remove('color');

tabs

tabs.list()

開いているタブの一覧を取得します。

const result = await window.midas.tabs.list();
// result.data: [{ id, type, title, paneId, isActive }, ...]

paneId はそのタブが置かれているペインの ID です。isActive はそのペインで前面に表示されているタブで true になります。ペインごとに 1 つのタブが前面にあるため、複数のペインが開いていれば isActivetrue のタブも複数あります。ペインの構成は layout.get() で取得します。

tabs.activate(tabId)

開いているタブを前面に出します。UI でタブをクリックしたときと同じ操作です。そのタブのあるペインがアクティブなペインになるため、以後の tabs.open() はそのペインに新しいタブを開きます。

await window.midas.tabs.activate('tab_001');

tabs.open(config)

新しいタブを開きます。datasetId にはデータセット ID またはデータセット名(大文字小文字を区別しない)を指定できます。graph-builder タブではデータセットがタブに紐づき、データセット選択欄と tabs.getGraphBuilder() に反映されます。

// Graph Builder を開く
const result = await window.midas.tabs.open({
  type: 'graph-builder',
  title: 'My Graph',
  datasetId: 'ds_001'
});
// result.data: { tabId: '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'
});

利用可能なタブタイプ:

タイプ説明
graph-builderGraph Builder
sql-editorSQL Query Editor
synthetic-data-generatorSynthetic Data Generator
glmGLM
glmmGLMM
random-forestRandom Forest
linear-regression線形回帰
pca主成分分析
statistics記述統計
crosstabクロス集計
anovaANOVA
kaplan-meierKaplan-Meier
cox-regressionCox 回帰
doe-analysis実験計画法
arimaARIMA
data-tableデータテーブル
reportレポート(reportId が必要)
computed-column計算列
dummy-codingダミーコーディング
orthogonal-polynomials直交多項式
reshapeデータ整形
column-type-conversion型変換
enum-definitionenum 定義
project-overviewプロジェクト概要
project-lineageProject Lineage
selected-rows選択行
excluded-rows除外行
filtered-dataフィルタ済みデータ
model-detailモデル詳細(modelId が必要)
glm-diagnosticsGLM 診断(modelId が必要)
glm-predictionGLM 予測(modelId が必要)
sql-query-viewerSQL クエリビューア
variant-normalization表記揺れ正規化
apply-mappingマッピング適用
project-diffプロジェクト差分
helpヘルプ

report タブには reportIdmodel-detailglm-diagnosticsglm-prediction タブには modelId の指定が必須です。modelId には models.list() で取得した保存済みモデルの ID を指定します。省略すると INVALID_INPUT エラーを返します。

// モデル詳細タブを開く
const result3 = await window.midas.tabs.open({
  type: 'model-detail',
  modelId: 'model_001'
});

glm-diagnostics タブは GLM と線形回帰(linear_regression)の両方のモデルを開けます。線形回帰モデルでは Deviance/Pearson 残差の切り替えを省き、見出しを Residual Diagnostics に変えて表示します。

models.run() が対応するモデルタイプは glmglmmrandom_forestarimalinear_regressionanovapcakaplan_meiercox_regression の 9 つです。対応するタブ(glmglmmrandom-forestarimalinear-regressionanovapcakaplan-meiercox-regression)およびその他の分析タブ(doe-analysiscrosstabstatistics)はすべて tabs.open() で開けますが、上記 9 タイプ以外は API から実行できず、設定と実行は GUI で行います。

tabs.duplicate(tabId)

分析タブを複製し、独立したコピーを隣に開きます。コピーは現在の設定(predictors・次数・応答変数など)を引き継ぎますが、実行結果とモデル保存状態は引き継ぎません。パラメータを変えて再フィットし、2 つの結果を並べて比較できます。複製できるのは分析タブ(glmglmmanovadoe-analysislinear-regressioncox-regressionkaplan-meierpcarandom-forestarima)に限られ、それ以外のタブタイプは INVALID_TAB_TYPE_FOR_OPERATION エラーを返します。UI ではタブを右クリックして Duplicate Tab を選ぶと同じ操作になります。

const result = await window.midas.tabs.duplicate('arima_001');
// result.data: { tabId, 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 メッセージです。例として、計算できなかった点の除外、集約の入力段での非有限値の除外、グループ内での同一 X 値の重複、shape や linetype のカテゴリ数が割り当てた形状・線種の種類数を超えたこと、position が stack または fill の Area レイヤーで系列が正負両方の値を持つことが入ります。これらの例に挙げた診断は描画自体を妨げません。唯一の例外はファセットのパネル数上限で、パネル数が上限(Settings の Max Facet Panels)を超えたことを示す警告が入ったときは、グラフは描画されていません。診断がなければこのフィールドは省略されます。評価するのは graphType'custom' でデータセットを選択している場合だけです。ファセットを設定したグラフでは、診断はパネル単位で評価され、プレビューの警告ストリップと同じ形式(警告が出たパネルのタイトルを前置し、全パネル共通の警告は All panels: の 1 行に集約)で入ります。

tabs.addGraphLayer(tabId, layer)

カスタムグラフにレイヤーを追加します。graphType'custom' のタブでのみ使用できます。

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 を指定します。カラム名は大文字小文字を区別せずに解決されます。利用可能なプロパティは xycolorfillstrokesizeshapealphalinetypeyminymaxlabelgroup です。すべてのプロパティがすべての geom type で使えるわけではありません。例えば Point と Line は fill に対応していません。aes はカラム参照のみを受け付けます。固定の色・サイズ・不透明度は aes ではなく geom.defaults で設定します。aes に固定値({ fixedColor: '#FF0000' } や数値)を渡すと INVALID_INPUT エラーになります。stats を省略した場合はデフォルトで identity が設定されます。position を省略した場合、bar geom では { type: "stack" }(積み上げ)、それ以外の geom では identity がデフォルトです。geom ごとに使用できる position type は異なります(例: line は identity のみ)。使用できない position を指定すると INVALID_INPUT エラーが返ります。scales でレイヤー固有のスケール(colorfillshapelinetypesizealpha)を設定できます。詳細は configureGraph のレイヤースケールの説明を参照してください。

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: { fun: 'mean' } }],
});

labelContent のプロパティ:

プロパティ説明
fieldstring表示するフィールド。$x$y$n 等の stat 変数またはカラム名
formatstringd3-format 形式の書式指定(例: .2f,.0f
prefixstring値の前に付ける文字列
suffixstring値の後に付ける文字列

labelContent が設定されている場合、aes.label は不要です。

Text geom ({ type: 'text' }) では aes.label が必須です。labelContent を参照するのは Label geom だけで、Text geom に指定しても表示されるテキストは変わりません。

レイヤーには以下のオプションプロパティも指定できます。

プロパティ説明
namestringレイヤーの表示名
filterstringレイヤーのデータを絞り込むフィルタ式。構文は Data Table タブのフィルタ入力欄と同じで(Data Table タブ を参照)、検証も同じ規則で行うため、構文の誤り・存在しない列名・列の型と噛み合わない値を含む式は INVALID_INPUT を返します
visiblebooleanレイヤーの表示/非表示(デフォルト true
yAxis'primary' | 'secondary'使用する Y 軸
showLegend'auto' | 'show' | 'hide'レイヤーの凡例表示
clickSelectionbooleanデータポイントのクリック選択を有効にする
tooltiparray | { content: 'encoding' }データポイントにカーソルを合わせたときの表示内容。詳細は後述

tooltip にフィールド定義の配列を指定すると、カーソルを合わせたときに指定した値を表示します。{ content: 'encoding' } を指定すると、レイヤーの aes からフィールドを自動生成します。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 フィールドのプロパティ:

プロパティ説明
fieldstring表示するフィールド。$x$y$n 等の stat 変数、またはカラム名/カラム ID
labelstringカスタムラベル(省略時はラベルなし、値のみ表示)
formatstringd3-format 形式の書式指定(例: .2f,.0f
type'datetime' | 'date'タイムスタンプを日付/日時文字列として表示

利用可能な geomstatposition の一覧は Custom Graph リファレンスを参照してください。各 Statistic の params は指定可能な値とデフォルト値とともに同ページに掲載しています。ファセット、座標系などグラフレベルのオプションは Custom Graph を参照してください。

tabs.updateGraphLayer(tabId, layerIndex, layer)

既存のレイヤーを部分更新します。指定したフィールドのみが変更され、省略したフィールドは既存の値を保持します。

await window.midas.tabs.updateGraphLayer('tab_001', 0, {
  geom: { type: 'line' }
});

geom を変更した際、現在の position が新しい geom で許可されていない場合は identity に自動リセットされ、warning が返ります。許可されない position を明示指定した場合は INVALID_INPUT エラーが返ります。

scales: null を渡すとレイヤー固有のスケールを削除し、既定のスケールに戻します。position: null で position をデフォルト(未設定)にリセットできます。tooltip: null を渡すと Tooltip を削除します。

tabs.removeGraphLayer(tabId, layerIndex)

レイヤーを削除します。

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() に反映されます。

await window.midas.tabs.setDataset('tab_001', 'ds_002');

tabs.configureGraph(tabId, config)

Graph Builder タブを一括設定します。graphType でグラフタイプを選びます。datasetId にはデータセット ID またはデータセット名(大文字小文字を区別しない)を指定でき、空文字を渡すとデータセットの紐づけを解除します。カラム名は大文字小文字を区別せずに解決されます。GraphConfigInputLayerDefInput に存在しないプロパティが渡された場合は result.warnings で通知されます。

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 で軸スケールを設定できます。configureGraphscales を渡すと、指定した軸のみ上書きし、指定しなかった軸の設定は保持されます。指定しなかった軸は、その軸に割り当てた列の型からスケールを推論します。date・datetime 列は time、カテゴリカル列は categorical、数値列は linear になります。明示的に指定したスケールが優先されます。

await window.midas.tabs.configureGraph('tab_001', {
  scales: { y: { type: 'log', title: 'Log scale' } }
});

scales の各軸(xyy2)には以下を指定できます。

プロパティ説明
type'linear' | 'log' | 'sqrt' | 'time' | 'categorical'スケールの種類
titlestring軸タイトル
domain{ min?, max? }連続スケールの範囲(categorical では無効)
tickCountnumber目盛りの数(categorical では無効)
limitsstring[]カテゴリの表示順(categorical 用)
breaksstring[]表示するカテゴリのサブセット(categorical 用)
labelsRecord<string, string>カテゴリのカスタム表示名(categorical 用)
labelRotation'auto' | 0 | 45 | 90ラベルの回転角度

レイヤーごとのスケールは layers[].scales で設定します。colorfillshapelinetypesizealpha の各 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'カラースケールの種類
paletteIdstringパレット ID。有効な値の一覧は Custom Graph リファレンス を参照
domain{ min?, max?, center? }連続スケールのドメイン
legendPosition'right' | 'left' | 'top' | 'bottom' | 'none'凡例の位置
legendTitlestring凡例のタイトル
thresholdsnumber[]閾値の配列(threshold 用)
thresholdColorsstring[]各領域の色(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'凡例の位置
legendTitlestring凡例のタイトル

並びの 1 番目が最初のカテゴリに対応します。カテゴリ数が並びの長さを超えると、並びの先頭から繰り返し割り当てられます。未知の形状名・線種名は取り除かれ、warnings で通知されます。凡例の位置はグラフ全体で 1 つです。凡例を表示する最初のレイヤーの設定を、colorfillshapelinetype の順で探して採用します。探す対象は列を割り当てている 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 });

facets を省略すると既存の設定が保持されます。

Facet wrap のプロパティ:

プロパティ説明
type'wrap'Facet wrap モード
variablestring分割するカラム名またはカラム ID(必須)
ncolnumber列数(省略時は自動計算)
nrownumber行数(省略時は自動計算)
completeboolean全組み合わせのパネルを表示して欠損を補完する
scales'fixed' | 'free_x' | 'free_y' | 'free'パネル間の軸スケール共有方法(デフォルト: 'fixed'

Facet grid のプロパティ:

プロパティ説明
type'grid'Facet grid モード
rowsstring行方向の分割カラム名またはカラム ID
colsstring列方向の分割カラム名またはカラム ID
completeboolean全組み合わせのパネルを表示して欠損を補完する
scales'fixed' | 'free_x' | 'free_y' | 'free'パネル間の軸スケール共有方法(デフォルト: 'fixed'

Facet grid では rowscols の少なくとも一方が必要です。

graphTypehistogramscattertimeseriesbarpairplotdatetime_histogram を指定すると、そのタイプ固有のフィールドを設定できます。layersglobalAesscalescoordinatesfacetscustom でのみ有効です。

await window.midas.tabs.configureGraph('tab_001', {
  graphType: 'histogram',
  datasetId: 'ds_001',
  column: 'sepal_length',
  bins: 20
});

columnxColumncategoryColumn などの列を指定するフィールドは、カラム名またはカラム ID のどちらでも指定できます。タイプ固有のフィールドは次のとおりです。

グラフタイプフィールド
histogramcolumnbinsshowDensityorientationgroupByColumngroupModefacetNcolshowAnnotations
scatterxColumnyColumncolorColumnsizeColumnreferenceLinesxScaleTypeyScaleType、密度可視化系(displayModedensityVisualizationdensityBandwidthcontourLevelsdensityColorScale
timeseriesxColumnyColumnsrangeColumnsrangeOpacity
barcategoryColumnvalueColumnsaggregationsorientationshowValuesstackModesortOrdertopN
pairplotcolumns
datetime_histogramcolumnintervalshowTrend

barvalueColumns には集計対象のカラムのほか、行数を数える '$count' を指定できます。aggregations はカラムごとの集計方法(sumaveragemedianminmax)を指定します。行数のカウントは集計方法ではなく valueColumns'$count' で表し、aggregationscount を指定すると INVALID_INPUT エラーになります。

グラフタイプとしての boxplotheatmap は設定できません。指定すると INVALID_GRAPH_TYPE エラーを返します。箱ひげ図は graphType: "custom"geom: { type: "boxplot" }stats: [{ type: "boxplot" }] のレイヤーを指定して作成します。

設定可能なすべてのグラフタイプで共通の lineageTargetDatasetId(ID または名前)を指定できます。datasetId が派生データセット(たとえば GROUP BY 集計、または元データのフィルタや再形成)のとき、これに祖先を指定すると、グラフ要素のクリックは元データの行を選択し、ダブルクリックは元データの寄与行を Contributing rows タブで開きます。指定値は datasetId の祖先(contributing rows で辿れるデータセット)である必要があり、候補は getGraphBuilderavailableLineageTargets で確認できます。空文字または null で既定(グラフ自身のデータセット)に戻します。

祖先として有効な値でも、datasetId から対象までの経路に window 関数や集合演算を使うホップがあると、実行時には遡れません。この場合も呼び出し自体は成功し、warnings に辿れないホップとその理由が入ります。

models

models.list()

適合済みモデルの一覧を取得します。

const result = await window.midas.models.list();
// result.data: [{ id, type, name, datasetId, family }, ...]

type'glm''glmm''random_forest''arima''linear_regression''anova''doe' のいずれかです。DoE モデルは DoE タブの Add to Report から作成され、models.run() では作成できません。

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() で後から参照するには、返された runIdmodels.save() に渡してモデルを保存してください。未保存の実行結果はメモリ上に最大 20 件保持されます。上限を超えると最も古い未保存の結果から順に破棄され、破棄された runIdmodels.save() に渡せなくなります。ページリロードでもすべて消失します。

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 },
//   diagnosticSummary: { nObservations: 150, nIncomplete: 0, degreesOfFreedom: 147, dispersionParameter: 0.29 },
//   warnings: []
// }

coefficients の各フィールド:

フィールド説明
estimateリンクスケールの係数推定値
se推定値の標準誤差
ciLower / ciUpperWald 信頼区間の下限と上限。参照分布は inference フィールドが示します。family ごとの対応は後述の表を参照してください
expEstimate / expCiLower / expCiUpper推定値と信頼区間を exp() で変換した値。解釈と null になるリンクは後述の説明を参照してください

diagnosticSummary.dispersionParameter は分散パラメータ φ の推定値です。gaussian では deviance を残余自由度 n−p で除した値、gamma では Pearson χ² を n−p で除した値で、これらの family では SE と信頼区間の計算に使われます。poissonbinomial では SE の計算に φ = 1 を使い、このフィールドには過分散の診断指標として deviance/(n−p) が入ります。残余自由度が 0 の場合は null です。negative-binomial では θ を自動推定した場合は 1.0、θ を固定した場合は Pearson χ²/(n−p) です。

GLMM (type: 'glmm'):

groupColumn でランダム切片のグループ変数を指定します。family'gaussian''binomial''poisson''gamma' から選択します(デフォルト 'gaussian')。linkincludeInterceptconfidenceLevel も GLM と同じ意味で指定できます。maxIterations のデフォルトは 100、tolerance のデフォルトは 1e-6 です(GLM とは異なります)。モデルの背景は 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, ciLower: 0.64, ciUpper: 4.06, ... },
//     ...
//   ],
//   inference: { distribution: 'normal', df: null },
//   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, iterations: 8, converged: true },
//   diagnosticSummary: { nObservations: 150, nGroups: 3, nFixedEffects: 3, nIncomplete: 0, groupSizes: [...] },
//   warnings: []
// }

GLMM の固定効果の信頼区間は標準正規分布に基づく Wald 近似で、inference は常に { distribution: 'normal', df: null } です。グループ数が少ない場合、この近似による信頼区間は名目の被覆率を下回ることがあります。

randomEffects の各フィールド:

  • variance — ランダム切片の分散 σ²_u です
  • residualVariancegaussian では残差分散 σ²_e、gamma では推定された分散パラメータ φ です。binomialpoisson では φ が理論的に 1 に固定されるため返されません
  • icc — 級内相関係数 σ²_u / (σ²_u + σ²_e) です。σ²_e は gaussian + identity では REML で推定した残差分散、binomial + logit では π²/3、binomial + probit では 1 で、後の 2 つは潜在尺度の値です。それ以外の family と link の組み合わせでは潜在尺度の残差分散が定義できないため null になります
  • blup — グループ別ランダム切片の予測値(Best Linear Unbiased Prediction)です。固定効果による予測値からの残差(y − Xβ̂)のグループ平均を 0 に向けて縮小した値で、観測数が少ないグループほど縮小の度合いが大きくなります。standardError は予測の不確実性を表し、LMM では条件付き予測誤差の標準偏差、それ以外の family では Laplace 近似に基づく近似値です。rankestimate の降順順位です

LMM(gaussian + identity)では fit.logLikelihood は REML 対数尤度で、fit.aicfit.bic もこれに基づきます。REML に基づく AIC/BIC は固定効果の構成が異なるモデル間の比較には使えません。それ以外の family では Laplace 近似による対数尤度です。

Random Forest (type: 'random_forest'):

taskType'classification' または 'regression' を指定します。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,
//   warnings: []
// }

Random Forest の metricstaskType によって構造が変わります。'regression' の場合は { taskType: 'regression', mse, rmse, mae, r2 } が返されます。metrics は適合データに対する値であり、models.describe() では取得できません(永続化されないため)。汎化性能の推定には oobScore を使用してください(分類では OOB accuracy、回帰では OOB R-squared)。回帰で応答変数に実質的な変動がない場合、R-squared は定義できないため r2 と回帰の oobScorenull になります。OOB 予測を持つサンプルが 1 件もない場合は、分類・回帰とも oobScorenull になります。これはサンプル数が極端に少ないときに起こりえます。回帰では OOB 予測を持つサンプルが 1 件しかない場合や、OOB サンプルの応答に実質的な変動がない場合も null になります。いずれの場合も warnings に理由が入ります。permutationImportances は各 predictor をシャッフルした際の OOB 予測精度の平均低下量です。値は負になることがあります。これはシャッフルしても OOB 予測精度が低下しなかったことを意味します。

パラメータデフォルト説明
nEstimatorsnumber100決定木の本数
maxDepthnumber | nullnull最大深度(null で無制限)
minSamplesSplitnumber2ノード分割に必要な最小サンプル数
minSamplesLeafnumber1葉ノードの最小サンプル数
maxFeatures'sqrt' | 'log2' | null | number'sqrt'各分割で検討する説明変数の数
randomStatenumber42乱数シード

inferenceciLowerciUpper の計算に使われた参照分布を表します。distribution: 't' のとき自由度 df の t 分布、distribution: 'normal' のとき標準正規分布で、後者では dfnull になります。

family ごとの対応は次のとおりです。β̂/SE が t(n−p) に厳密に従うのは Gaussian + identity link のみで、他の分散パラメータ推定族は有限標本補正の慣習として t 分布を適用します。漸近と書かれた family は標準正規近似です。

familylink参照分布性質
gaussianidentityt(n−p)厳密
gaussian非 identityt(n−p)有限標本補正の慣習
gamma任意t(n−p)有限標本補正の慣習
negative-binomial任意(θ 固定)t(n−p)有限標本補正の慣習
poisson任意標準正規漸近
binomial任意標準正規漸近
negative-binomial任意(θ 推定)標準正規漸近

ciLowerciUpper は各係数の Wald 信頼区間 estimate ± criticalValue × se です。信頼水準は confidenceLevel パラメータ(デフォルト 95)に従います。臨界値は inference の参照分布の (1 + confidenceLevel/100) / 2 分位点を使います。

expEstimateexpCiLowerexpCiUpper は link スケールの推定値と信頼区間を exp() で変換した値です。logit リンクではオッズ比 (OR)、Poisson・Negative Binomial の log リンクでは率比 (IRR)、Gamma・Gaussian の log リンクでは乗法的効果に対応します。identity、inverse、probit リンクでは null になります。

fit.aicfit.bicnumber | null です。対数尤度の定数項が定義できない場合(Binomial の非整数重み、飽和モデルなど)に null になります。

レスポンスには2種類の warnings が含まれる場合があります。トップレベルの result.warnings にはデータ準備段階の警告(欠測行の除外など)、result.data.warnings にはモデル実行時の警告(収束の問題など)が格納されます。応答変数と説明変数のいずれかに欠測がある行は分析から除外されます。除外された行数は diagnosticSummary.nIncomplete で確認できます。

最大反復回数までに収束しなかった場合もエラーにはならず、結果は fit.converged: false で返されます。message にも did not converge と表示されます。完全分離・準完全分離が疑われる場合は data.warnings に警告が含まれます。結果が返る場合、係数の senull になることはありません。SE が計算できない場合(分散共分散行列が正定値でない、計画行列のランク落ち、説明変数や応答変数が極端な値域を持ち分散がオーバーフローまたは未定義になるなど)は結果を返さず NUMERICAL_ERROR エラーになります。極端な値域が原因の場合は、説明変数と応答変数をリスケールまたは標準化してから再適合してください。適合した平均が family の有効範囲外になる場合(例: Poisson や Gamma に identity link を当てた場合)も結果を返さず NUMERICAL_ERROR になります。適合した平均が範囲内に収まる link(log など)を検討してください。

family'gaussian'(デフォルト)、'binomial''poisson''gamma''negative-binomial' から選択します。各 family の選択指針と使い分けは GLM を参照してください。link でリンク関数を指定できます。省略した場合は family に応じたデフォルトが使われます。

familyデフォルト link利用可能な link
gaussianidentityidentity, log
binomiallogitlogit, probit
poissonloglog, identity
gammainverseinverse, log, identity
negative-binomialloglog

オプションパラメータ:

パラメータデフォルト説明
includeInterceptbooleantrue切片の有無
maxIterationsnumber25最大反復回数
tolerancenumber1e-8収束判定の許容誤差
binomialResponseobject-二項応答の形式。下記参照
thetanumber-負の二項分布の過分散パラメータ。省略した場合はプロファイル尤度で自動推定される
offsetColumnstring-オフセット列(ポアソン回帰での exposure 等)
confidenceLevelnumber95信頼区間の信頼水準(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 タブ を参照してください。

パラメータデフォルト説明
seriesColumnstring(必須)時系列データの列名
order[number, number, number][p, d, q] — AR 次数、差分次数、MA 次数。省略時は autoSelect を使用
seasonalPeriodnumber1季節周期 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 指定時に使用
autoSelectobject{ maxP: 3, maxD: 1, maxQ: 3, maxSeasonalP: 1, maxSeasonalQ: 1, criterion: 'aic' }自動次数選択。order 省略時に使用
autoSelect.maxPnumber3探索する AR 次数の上限
autoSelect.maxDnumber1差分次数の上限。KPSS による d の選択はこの値を超えません
autoSelect.maxQnumber3探索する MA 次数の上限
autoSelect.maxSeasonalPnumber1探索する季節 AR 次数の上限。0〜2。seasonalPeriod が 2 以上のとき有効
autoSelect.maxSeasonalQnumber1探索する季節 MA 次数の上限。0〜2。seasonalPeriod が 2 以上のとき有効
autoSelect.criterion'aic' | 'bic''aic'同一の差分次数のもとで残りの次数を選ぶ情報量基準
includeInterceptbooleantrue定数項を含める。d + D = 0 では平均、d + D = 1 ではドリフト。d + D が 2 以上では多項式トレンドに相当するため外れる
includeTrendbooleanfalse決定論的線形トレンド項を含める。時間の回帰項は有効観測の連番(t = 1, 2, ...)から内部生成し、傾きを推定するのは d + D = 0 のときだけ(切片は t = 0 の水準になる)。d + D = 1 では定数項を含めていれば傾きがドリフトとして表現され、2 以上では差分でトレンドが消えるため、どちらも別個には推定せず warnings で報告する。自動選択では、季節差分を取らない場合(D = 0)に限り、差分前の系列への KPSS がトレンド定常性を帰無仮説とする変種(判定閾値 0.146)になる
confidenceLevelnumber95係数の信頼区間の信頼水準

レスポンスには coefficients(AR/MA/SAR/SMA/Intercept/Trend と CI)、seasonalOrderfit(AIC, BIC, 対数尤度, σ², 収束状態)、residualDiagnostics(残差の ACF と PACF)、nObservations が含まれます。標準誤差を計算できなかった係数は se と CI が null になります。係数が定常・可逆の境界に張り付いて分散共分散行列が得られない場合などに起こります。autoSelect 使用時は、KPSS で選んだ差分次数の記録が differencingSelection(選んだ d、各階数の KPSS 統計量、使った変種と判定閾値)に、その差分次数のもとで探索した全 (p, q, P, Q) 候補の AIC/BIC が orderSearch に含まれます。orderSearch の候補はすべて同一の (d, D) を持ちます。seasonalPeriod が 2 以上のときは、OCSB で選んだ季節差分次数の記録が seasonalDifferencingSelection(選んだ D、OCSB 統計量、判定閾値)にも含まれます。

観測数が不足している、または差分後の系列の分散がゼロで適合が縮退した場合は、fit.error にメッセージが入ります。このとき係数や AIC、σ² などは無意味な値(ゼロや無限大)になり、residualDiagnosticsacfpacf は空配列です。これは最適化が収束しなかった場合(converged: falsefit.error なし)とは区別されます。

系列中の非有限値(NaN, Infinity, null)は除外されます。除外が発生した場合、レスポンスの warnings に報告されます。差分の合計 d + D が 2 以上で定数項が外れた場合、includeTrend を有効にしたのに d + D が 1 以上でトレンド項を傾きとして推定しなかった場合、係数の標準誤差を計算できなかった場合、自己回帰または移動平均の根が単位円に近い場合(near-unit-root。推定値と正規近似の信頼区間が信頼しにくくなり、移動平均の根が可逆境界に近いときは過剰差分の可能性があります)も warnings に報告され、保存済みモデルでは 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'):

最小二乗法による線形回帰を適合します。

パラメータデフォルト説明
yColumnstring(必須)応答変数の列名
xColumnsstring[](必須)説明変数の列名
includeInterceptbooleantrue切片の有無
confidenceLevelnumber95信頼区間の信頼水準

レスポンスの coefficients は GLM と同形式で、inference は常に t 分布です。fit には GLM と同じフィールドに加えて rSquaredadjustedRSquaredrmse が含まれます。応答変数に実質的な変動がないとき(responseDegenerate: true)は rSquaredadjustedRSquaredrmsenull になり、このとき係数の se と信頼区間も null になります。理由は warnings に示されます。説明変数の数が観測数と等しい飽和モデルでは、分散パラメータを推定できず、結果を返さずエラーになります。切片を含まないモデルでは rSquared は未中心 R² であり、切片ありモデルの中心 R² とは比較できません。

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, rmse: 0.33 }, diagnosticSummary, warnings }

ANOVA (type: 'anova'):

一元配置または二元配置の分散分析を実行します。factorColumns の要素数でどちらかが決まります。

パラメータデフォルト説明
responseColumnstring(必須)応答変数の列名
factorColumnsstring[](必須)因子列。1 要素で一元配置、2 要素で二元配置
includeInteractionbooleantrue二元配置で交互作用項を含める
ssType'I' | 'III''III'二元配置の平方和の分解タイプ
confidenceLevelnumber95Tukey HSD の信頼水準(50〜99.99)
postHocbooleantrueTukey HSD を計算する(一元配置のみ。二元配置で true を指定すると INVALID_INPUT になる)

列の適格性は ANOVA タブのセレクタと同じ 測定尺度 で決まります。responseColumn は尺度が interval または ratio の列を、factorColumns は nominal または ordinal の列を受け付けます。要件を満たさない列を指定すると INVALID_INPUT になり、エラーメッセージにその列の現在の尺度が入ります。date 型と datetime 型の列は尺度が interval でも responseColumn には使えず、この場合のエラーメッセージは尺度ではなくデータ型を示します。

レスポンスには mode'one-way' または 'two-way')、anovaTable(各効果の平方和・自由度・平均平方と効果量 η²・ω²、残差、合計)、groupStatistics(グループ別の n、平均、標準偏差、最小値、最大値)、nObservationsnExcludedexclusions が含まれます。一元配置で postHoc が有効な場合は tukeyHSD(ペアごとの平均差、SE、信頼区間)も含まれます。postHoc の指定は models.save で保存したモデルに保持され、データセットの再読み込みに伴う再推定でも維持されます。二元配置は Tukey HSD を計算しないため、二元配置モデルの保存値は常に false になります。

exclusions は欠損・無効値による除外の内訳です。byGroup は群(一元配置は因子の水準、二元配置は水準の組み合わせ)ごとの除外行数、factorMissing は因子の値が欠損していて群に帰属できない除外行数です。除外によってある水準の行がすべて消えた場合は droppedLevelsAdroppedLevelsB に、両因子の水準が残っているのにセルの行がすべて消えた場合は 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 で返します。

パラメータデフォルト説明
columnsstring[](必須)主成分を求める数値列。2 列以上を指定する
preprocessing'standardize' | 'center' | 'none''standardize'前処理
nComponentsnumber全成分返す成分数の上限

レスポンスには 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' という群にまとめます。

パラメータデフォルト説明
timeColumnstring(必須)観察時間の列名
eventColumnstring(必須)イベント指標の列名
groupColumnstringなし群を表す列名
confidenceLevelnumber95信頼水準(50〜99.99)

レスポンスの groups には、群ごとに観測数、イベント数、中央生存時間とその信頼区間、イベント時点の並び(times)と対応する生存確率・信頼区間・リスク集合の大きさ・イベント数・打ち切り数が入ります。

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: [...] }, ...], warnings: [] }

Cox 回帰 (type: 'cox_regression'):

Cox 比例ハザードモデルを当てはめます。eventColumn には int64 型または boolean 型の列を、共変量には尺度が interval または ratio の列を指定します。eventColumn に 0/1(boolean 型では false/true)以外の値が含まれる場合と、timeColumn に負値またはゼロが含まれる場合は、該当する値と行数を示す INVALID_INPUT エラーを返します。時間・イベント・共変量のいずれかが欠損している行は除外し、その数を nExcluded で返します。比例ハザード性の診断は API では返しません。Cox 回帰タブの Diagnostics で確認してください。

パラメータデフォルト説明
timeColumnstring(必須)観察時間の列名
eventColumnstring(必須)イベント指標の列名
covariatesstring[](必須)共変量の数値列。1 列以上を指定する
tiesMethod'efron' | 'breslow''efron'同時発生イベントの扱い
maxIterationsnumber100Newton-Raphson の最大反復数
tolerancenumber1e-9収束判定の許容誤差
confidenceLevelnumber95ハザード比の信頼水準(50〜99.99)

レスポンスの coefficients には共変量ごとの対数ハザード比、標準誤差、ハザード比とその信頼区間が入ります。あわせて対数部分尤度、AIC、Concordance index とその標準誤差、収束状態と反復回数を返します。信頼区間は対数ハザード比の Wald 区間を指数変換して求めます。warnings には収束しなかった場合のほか、推定値が発散に向かっている兆候(準分離)を検出した場合の警告が入ります。

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, tiesMethod: 'efron',
//   coefficients: [{ name: 'age', coefficient, standardError, hazardRatio,
//     hazardRatioCILower, hazardRatioCIUpper }, ...],
//   logPartialLikelihood, aic, concordance, concordanceSE, converged, iterations,
//   nObservations, nEvents, nExcluded, warnings: [] }

PCA、Kaplan-Meier、Cox 回帰の結果はモデルとして保存しません。これらの runIdmodels.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_valuesdeviance_residualspearson_residualsstandardized_residualsleveragecooks_distance です。これらを reports.addGraph() や Graph Builder で可視化して残差分析や診断プロットに使用できます。

models.saveAsDataset(id, artifact, options?)

モデルの成果物を派生データセットとして保存します。保存したデータセットは SQL・グラフ・レポートからそのまま参照できます。

保存できる成果物は coefficients(GLM、線形回帰、GLMM の固定効果)、covariance(GLM、線形回帰の分散共分散行列)、blup(GLMM のランダム効果)です。モデルが持たない成果物を指定すると UNSUPPORTED_MODEL_TYPE が返ります。

オプションデフォルト説明
namestringモデル名と成果物から生成出力する派生データセットの名前。同名が既にある場合は連番が付く
confidenceLevelnumber95係数テーブルの信頼区間の水準(50〜99.99)。covarianceblup では使いません

作成したデータセットは GUI の Save as Dataset と同じ operation を持つため、モデルからの再導出も同じ経路を通ります。当てはめ値と予測値はここでは扱いません。models.predict() を使ってください。

const result = await window.midas.models.saveAsDataset('model_001', 'coefficients', {
  confidenceLevel: 99,
});
// result.data: { datasetId: '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 またはデータセット名を指定でき、モデルが適合に使った予測子の列をすべて含む必要があります。

パラメータデフォルト説明
datasetIdstring(必須)予測対象のデータセット
namestringモデル名から生成出力する派生データセットの名前。同名が既にある場合は連番が付く
includeOriginalDatabooleantrue予測対象データセットの列を出力に含める
confidenceLevelsnumber[][95]平均の信頼区間の水準(50〜99.99)
predictionLevelsnumber[][95]個々の新しい観測に対する予測区間の水準(50〜99.99)

GLM と線形回帰では、予測値・線形予測子・標準誤差の列に加えて、confidenceLevelspredictionLevels の水準ごとに上下限の列が付きます。予測子または offset が欠損している行は各値が null になり、行そのものは残ります。

Random Forest では、モデルが適合に使った予測子の列と予測値の列(分類ではクラスごとの確率列も)を持つデータセットを作ります。応答列など予測子以外の列は残りません。行は元のデータセットと同じ数で、予測子が欠損している行は予測値が null になり、その行数を nSkipped で返します。confidenceLevelspredictionLevelsincludeOriginalData は Random Forest では意味を持たないため無視し、無視した旨を warnings で返します。

const result = await window.midas.models.predict('model_001', {
  datasetId: 'New Patients',
  confidenceLevels: [95],
  predictionLevels: [90, 95],
});
// result.data: { datasetId: 'ds_...', name: 'GLM Predictions', rowCount: 40,
//   columnCount: 12, modelType: 'glm', nSkipped: 0, warnings: [] }

models.describe(id)

モデルの詳細を取得します。GLM、GLMM、Random Forest、ARIMA、Linear Regression、ANOVA に対応しています。レスポンス構造はモデルタイプにより異なります(result.data.type で判別)。DoE モデルは describe() では未対応です(DoE タブで確認してください)。モデルは models.run() + models.save() で API から作成するか、GUI から作成できます。

GLM: 係数、適合度指標(AIC, BIC, deviance)、診断サマリー、メタデータを返します。

GLMM: 固定効果(GLM の係数と同形式)、ランダム効果(グループ変数、分散、ICC、BLUP)、適合度指標(対数尤度、反復回数、収束状態)、診断サマリーを返します。

Random Forest: タスクタイプ(classification/regression)、チューニングパラメータ、MDI 変数重要度(保存されている場合)、OOB Permutation Importance(計算済みの場合)を返します。

ARIMA: 次数(p, d, q と季節次数)、係数(AR/MA/SAR/SMA/Intercept/Trend と CI)、適合度指標(AIC, BIC, 対数尤度, σ², 収束状態)、residualDiagnostics(残差の ACF と PACF)を返します。models.run() の残差診断と fit.error は保存時に残るため、再適合せずに取得できます。acfpacf が空配列になるのは、この機能の追加前に保存されたモデルか、適合が縮退したモデル(fit.error あり)です。fit.error が設定されているときの係数や適合度指標の扱いは models.run() の ARIMA の説明を参照してください。

Linear Regression: 係数(GLM と同形式、inference は常に t 分布)、適合度指標(R², Adjusted R², RMSE, AIC, BIC)、診断サマリー、メタデータを返します。

ANOVA: 分散分析表(平方和、自由度、平均平方、効果量 η²・ω²)、グループ別統計量、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 は常に { distribution: 'normal', df: null } です。Random Forest には inferencecoefficientsfit フィールドはありません。

// 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, ciLower: 1.47, ciUpper: 4.81, expEstimate: null, expCiLower: null, expCiUpper: null },
//     { variable: 'x1', estimate: 0.52, se: 0.18, ciLower: 0.17, ciUpper: 0.87, expEstimate: null, expCiLower: null, expCiUpper: null }
//   ],
//   inference: { distribution: 'normal', df: null },
//   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, 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 にモデルの種別を指定し、タブの種別と一致させます。指定できる種別は glmglmmrandom_forestarimalinear_regressionanova です。type 以外の項目はすべて省略でき、渡した項目だけが変わります。カラム名とデータセット名は大文字小文字を区別せずに解決されます。

設定できる項目は、同じ種別の models.run() が受け取る設定と同じです。データセット、変数の選択、モデル設定、収束制御、信頼水準を指定できます。ANOVA の postHoc だけは ANOVA タブに対応する設定がないため指定できません。Tukey HSD を計算するかは models.run() で決めます。

分析を実行済みのタブに対して呼ぶと、表示中の結果はここで変えた設定のものではなくなるため、画面から外れて再実行を促すメッセージに変わります。結果を得るには models.run() を使うか、GUI で再実行してください。

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[]) — 表示する列。カラム名またはカラム ID で指定します。省略時は全列を表示します
  • maxRows (number) — 表示する最大行数。1 以上の整数で、上限は 1000 です。省略時は全行(最大 1000 行)を表示します

データが評価されていないデータセットには NO_DATA エラーを返します。renderStatus はデータセットに行がない場合に 'empty'、それ以外は 'ok' になります。

reports.addModelSummary(reportId, modelId)

モデルのサマリーをレポートに追加します。GLM、GLMM、Linear Regression、Random Forest、ARIMA、ANOVA、DoE に対応しています。DoE は適合度指標の model_stats 要素のみを追加します(係数テーブルは未対応)。

全モデルタイプで要素参照方式を使用します(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 タブの一覧にも表示されます。モデルを削除すると関連する係数の派生データセットも自動的に削除され、削除された 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%。logit リンクと log リンクでは exp 変換列(OR / IRR / exp(Est.)、exp(Lower N%)、exp(Upper N%))が family/link の組み合わせに応じて追加されます。N はモデル保存時の信頼水準(confidenceLevel、デフォルト 95)です。Linear Regression の係数テーブルはこれに加えて Std. Coef. と VIF を持ちます。信頼区間はすべて Wald 型(estimate ± criticalValue × SE)です。臨界値の参照分布は GLM では family と link から決まり(models.run() の節の対応表を参照)、GLMM の固定効果は常に標準正規分布、Linear Regression は常に t 分布を用います。

モデル別の描画内容:

  • GLM: model_stats 要素の Model Fit セクションに AIC, BIC, Deviance, Null Deviance, Converged, iterations を表示します
  • 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, Residual Variance (LMM のみ), ICC を、Model Fit セクションに Log-Likelihood, AIC, BIC, Converged, iterations を表示します。LMM(Gaussian + identity link)では REML Log-Likelihood, ICC と表記し、Binomial + logit/probit では Log-Likelihood (Laplace), ICC (latent scale) と表記します。それ以外の family+link(Poisson, Gamma 等)では、理論的根拠のある潜在尺度残差分散が存在しないため ICC は表示されません(null)
  • Linear Regression: 5 つの要素を登録します — 係数テーブル、ANOVA Type I、ANOVA Type III、Prediction Intervals (per-observation 予測区間/信頼区間)、model_stats 要素。model_stats 要素の OLS Fit セクションに R², Adjusted R², RMSE, N observations を、Information Criteria セクションに AIC, BIC を表示します。Converged / iterations は 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 の各項と信頼区間)を data_table 要素として登録し、model_stats 要素の Model Fit セクションに Order(季節モデルでは (P, D, Q)[s] 部を含む), Log-Likelihood, AIC, BIC, σ², Converged, N observations を表示します
  • ANOVA: ANOVA Table と Group Statistics を data_table 要素として登録します。一元配置で Tukey HSD が計算済みの場合は Tukey HSD テーブルも追加します。model_stats 要素は登録しません
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 を描画する model_stats 要素の id (ANOVA では返されない)
// - 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 またはデータセット名を指定できます(大文字小文字を区別しません)。カラム名も大文字小文字を区別せずに解決されます。AddGraphInputLayerDefInput に存在しないプロパティが渡された場合は result.warnings で通知されます。軸スケール(scales)、レイヤーごとのスケール(layers[].scales)、レイヤーごとの Tooltip(layers[].tooltip。詳細は addGraphLayer を参照)、ファセット(facets)を指定できます。facets のプロパティ詳細は configureGraph を参照してください。中間集計を描くグラフでは lineageTargetDatasetIddatasetId の祖先)を指定して、選択・ドリルダウンの相手を元データにできます(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() と同じで、レポート画面には表示されないためこの API からのみ読み取れます。

ファセットを指定したグラフは、実際の描画と同じデータ処理で評価されます。MIDAS はデータをパネルへ分割し、全パネル共通のドメインを計算してから、各パネルを個別に評価します。パネル分割後にだけ現れる状態もこの評価で検出されるため、renderStatusrenderWarnings は描画結果と一致します。renderWarnings の各行には警告が出たパネルのタイトルが付き、全パネルで同一の警告は All panels: を付けた 1 行にまとめられます。パネル数が設定の上限(Settings の Max Facet Panels)を超えるとグラフは描画されないため、renderStatus'error' になります。

グラフはレポート要素として保存され、レポートの content に {{graph_builder:elementId}} の参照が追記されます。

利用可能な geomstatposition の一覧は 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 と本文中の位置はそのまま維持されます。configaddGraph と同じ構造です(datasetId にはデータセット ID または名前を指定できます)。

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? }

renderStatusrenderStatusMessagerenderWarnings の意味は addGraph() と同じです。

graph_builder 以外の要素タイプ(data_tablemodel_stats 等)を指定するとエラーになります。

reports.removeElement(reportId, elementId)

レポートから要素を削除し、本文中の {{type:elementId}} 参照も除去します。全要素タイプ(graph_builderdata_tablemodel_statscrosstabstatistics_summaryanova)に対応しています。関連リソース(derived dataset、モデル等)は削除されません。

await window.midas.reports.removeElement('report_001', 'graph-xxx');
// result.data: { elementId, reportId }

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_...' }

返された newPaneIdtabs.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' なら上下分割です。splitRatiochildren の 1 つ目が占める割合です。children は 2 要素の配列で、左右分割なら左・右の順、上下分割なら上・下の順に並びます。

ペインはタブを持ちます。tabs の各要素は tabs.list() と同じ形式です。activeTabId は前面に表示されているタブの ID で、タブがなければ null です。最後に操作されたペインの ID は activePaneId に入るため、ペインがアクティブかどうかは idactivePaneId を比べて判定します。

どちらのノードも 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);

エラーコード

コード説明
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上書き対象の派生データセットが異なるメソッドで作成されている。各派生メソッド(deriveaddColumnssetColumnSchemaaddOrthogonalPolynomialsreshapeWideToLongreshapeLongToWidedummyCodefilter)はそれぞれ固有の operation type を書き込む。異なるタイプ間での上書きは拒否される(例: addColumns() で作成したデータセットを derive() で上書き、derive() で作成したデータセットを addColumns() で上書き)
AMBIGUOUS_TABLE_NAMEテーブル名に case-insensitive で複数のデータセットがマッチした
EXECUTION_ERRORSQL 実行エラー
UNSUPPORTED_MODEL_TYPE未対応のモデルタイプ
MODEL_EXECUTION_ERRORモデル実行エラー
NUMERICAL_ERROR数値計算エラー(行列の特異性など)
INSUFFICIENT_DATA分析に必要なデータが不足(有効な観測数の不足、因子水準の不足など)
NO_DATAデータセットにデータがロードされていない
NO_CONTAINERアクティブなコンテナがない
NO_TARGETSQL にテーブル参照がない
NO_CONFIGGraph Builder 設定がない
SPLIT_FAILEDペイン分割に失敗
SANDBOX_MODEサンドボックスモードで保存不可
NO_SIGNING_KEY署名鍵が未設定でエクスポート・ダウンロードできない
ENUM_ALREADY_EXISTSenum 定義が既に存在する
ENUM_NOT_FOUNDenum 定義が見つからない
ENUM_IN_USEenum 定義が列から参照されている
ENUM_VALUE_MISMATCHenum 定義外の値がデータに存在する
FETCH_ERRORURL フェッチ失敗(ネットワークエラー、タイムアウト、HTTP エラー)
USER_CANCELLEDユーザーが操作をキャンセルした(未保存変更の確認ダイアログで拒否など)

参考

  • ライブリファレンス: プロジェクト画面で window.midas.help() を実行