Agent API (window.midas)

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

概要

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

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

  • プロジェクト画面: すべてのメソッドが利用可能
  • ランチャー画面: help() のみ利用可能。他のメソッドは NO_PROJECT エラーを返す

プロジェクトの作成と開始は GUI で行います。Playwright で自動化する場合は、GUI 操作でプロジェクトを開いた後に API を使用してください。

使い方

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() メソッドで、利用可能なメソッドの一覧とシグネチャを確認できます。

const help = window.midas.help();
console.log(help);

レスポンス形式

help() を除くすべてのメソッドは非同期で、APIResult<T> 型の統一されたレスポンスを返します。help() のみ同期メソッドで、HelpInfo オブジェクトを直接返します。

// 成功時
{
  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"],
    ...
  }
}

メソッド一覧

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'
// }

project

project.save()

プロジェクトをブラウザストレージに保存します。保存先の詳細はプライバシーとセキュリティを参照してください。

await window.midas.project.save();

サンドボックスモード(デモやトライアルなど、永続化が無効なプロジェクト)では SANDBOX_MODE エラーを返します。

project.exportMds()

プロジェクトを MDS(MIDAS のプロジェクトファイル形式)バイナリとしてエクスポートします。エクスポートされたデータは ArrayBuffer として返されます。

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

project.downloadMds()

プロジェクトを MDS ファイルとしてブラウザからダウンロードします。

const result = await window.midas.project.downloadMds();
// result.data: { filename: 'MyProject.mds' }

datasets

datasets.list()

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

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

type'primary'(読み込んだデータ)、'derived'(SQL やその他の操作で作成)、'ephemeral'(一時的)のいずれかです。parentIds は派生データセットの場合に、元となったデータセットの ID を含みます。

datasets.describe(id)

データセットの詳細情報を取得します。

const result = await window.midas.datasets.describe('ds_001');
// 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: 'string', scale: 'nominal', enumName: 'species_enum' },
//     ...
//   ]
// }

columns の各要素には idnametype が含まれます。scaleenumName はオプショナルです。enumName は列の型が enum の場合に、対応する enum 定義の名前を返します。

datasets.query(sql, name, options?)

SQL クエリを実行し、結果を新しい派生データセットとして保存します。SQL は DuckDB の構文に従います。

const result = await window.midas.datasets.query(
  'SELECT species, AVG(sepal_length) as avg_sl FROM Iris GROUP BY species',
  'Species Averages'
);
// result.data: { datasetId: 'derived_...', name: 'Species Averages', rowCount: 3, columnCount: 2, overwrote: false }

テーブル名はデータセット名から自動解決されます(大文字小文字を区別しません)。日本語やスペースを含むデータセット名は、SQL 内でダブルクォートで囲んでください(例: SELECT * FROM "売上データ")。デフォルトでは同名の派生データセットが存在する場合に in-place で更新します。既存のデータセット ID が維持されるため、そのデータセットを参照しているタブや依存する派生データセットは影響を受けません。options.overwritefalse にすると、同名の派生データセットが既に存在する場合にエラーを返します。

出力名が SQL の FROM / JOIN で参照しているデータセット、またはそれらの祖先(参照先データセットの派生元)のいずれかと同じ ID に解決される場合、依存関係の循環を生む操作になるため SELF_REFERENCE エラーを返します(例: query('SELECT species, COUNT(*) FROM Iris GROUP BY species', 'Iris')、または Iris → A → B のチェーンで query('SELECT * FROM B', 'A'))。また、出力名がプライマリデータセットの名前と一致する場合は NAME_CONFLICT エラーを返します(プライマリを派生で上書きしません)。同名の派生データセットが異なるメソッドで作成されている場合(例: addColumns で作成したデータセットを query で上書きしようとした場合)は OPERATION_TYPE_MISMATCH エラーを返します。

受け付けられるのは単一の SELECT 文のみです。セミコロン区切りの複数ステートメントや DML/DDL は拒否されます。外部からデータを取り込む場合は datasets.importFromURL または datasets.importFromBuffer を使ってください。

datasets.importFromURL(url, options?)

外部 URL から CSV/TSV ファイルをフェッチしてデータセットとして取り込みます。

const result = await window.midas.datasets.importFromURL(
  'https://example.com/data.csv'
);
// result.data: { datasetId: 'ds_...', name: 'data', rowCount: 100, columnCount: 5 }

optionsname プロパティで取り込み後のデータセット名を指定できます。省略した場合は URL から推測されます。同名のデータセットが既に存在する場合はエラー(DATASET_ALREADY_EXISTS)を返します。options.overwritetrue にすると、既存のデータセットを in-place で置き換えます(ID が維持されます)。importFromURL / importFromBuffer はプライマリデータセットも上書きできます(派生系メソッドとの非対称性)。

CSV パースに失敗した場合(空データ、ヘッダー行が空、行ごとの列数が食い違う、URL バリデーション失敗、Content-Type 不正など)は INVALID_INPUT エラーを返します。ネットワーク障害やタイムアウトは EXECUTION_ERROR を返します。

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: { datasetId: 'ds_...', name: 'Sales', rowCount: 500, columnCount: 7 }

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

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

区切り文字は PapaParse が自動判定するため、CSV と TSV のどちらも渡せます。データセットには MIDAS が自動で行番号列(Row#)を追加するため、返却される columnCount は元ファイルの列数に 1 を加えた値になります。

同名のデータセットが既に存在する場合はエラー(DATASET_ALREADY_EXISTS)を返します。overwrite: true で既存を in-place で置き換えられます(ID 維持)。importFromBuffer はプライマリデータセットも上書きできます(派生系メソッドとの非対称性)。CSV パースに失敗した場合(空データ、ヘッダー行が空、行ごとの列数が食い違う、など)は INVALID_INPUT エラーを返します。

datasets.addColumns(datasetId, input)

計算列をデータセットに追加します。結果は新しい派生データセットとして作成されます。expression は DuckDB の SQL 式構文に従います。CASE WHENCAST 等の SQL 関数も使用できます。

const result = await window.midas.datasets.addColumns('ds_001', {
  columns: [
    { name: 'bmi', expression: 'weight / (height * height)' }
  ]
});
// result.data: { datasetId: 'derived_...', name: '...', rowCount: 150, columnCount: 6 }

outputName で出力データセット名を指定できます。同名の派生データセットが存在する場合は in-place で更新し、既存のデータセット ID を維持します。outputName がソース datasetId またはその祖先(派生元のデータセット)のいずれかに解決される場合、依存関係の循環を防ぐため SELF_REFERENCE エラーを返します。同名のプライマリデータセットと衝突する場合は NAME_CONFLICT エラーを返します。同名の派生データセットが異なるメソッドで作成されている場合は OPERATION_TYPE_MISMATCH エラーを返します。

datasets.addOrthogonalPolynomials(datasetId, input)

直交多項式列をデータセットに追加します。多項式回帰の説明変数として使用します。

const result = await window.midas.datasets.addOrthogonalPolynomials('ds_001', {
  column: 'temperature',
  degree: 3
});
// result.data: { datasetId: '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 エラーを返します。

datasets.setColumnSchema(datasetId, columnId, schema)

列のデータ型、測定尺度、enum 定義を変更します。

const result = await window.midas.datasets.setColumnSchema('ds_001', '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 エラーを返します。測定尺度のみの変更はメタデータの更新のみで、派生データセットは作成されません。

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

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 を参照している場合は警告が返されます。

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

tabs

tabs.list()

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

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

tabs.open(config)

新しいタブを開きます。

// 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 Editor を開く
const result2 = await window.midas.tabs.open({
  type: 'sql-editor',
  initialQuery: 'SELECT * FROM Iris LIMIT 10',
  initialOutputName: 'Preview'
});

利用可能なタブタイプ:

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

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 }

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 を指定します。カラム名は大文字小文字を区別せずに解決されます。利用可能なプロパティは xycolorfillstrokesizeshapealphalinetypeyminymaxgroup です。すべてのプロパティがすべての geom type で使えるわけではありません。例えば Point と Line は fill に対応していません。固定色を使う場合は { fixedColor: '#FF0000' } 形式で、固定サイズは数値で指定できます。stats を省略した場合はデフォルトで identity が設定されます。

利用可能な geom、stat、position の一覧は Custom Graph リファレンスを参照してください。各 Statistic の params は TypeScript 型とデフォルト値とともに同ページに掲載しています。

tabs.updateGraphLayer(tabId, layerIndex, layer)

既存のレイヤーを部分更新します。

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

tabs.removeGraphLayer(tabId, layerIndex)

レイヤーを削除します。

await window.midas.tabs.removeGraphLayer('tab_001', 0);

tabs.moveToPane(tabId, toPaneId)

タブを別のペインに移動します。layout.split() で作成したペインの ID を指定します。

await window.midas.tabs.moveToPane('tab_001', 'pane_002');

tabs.setDataset(tabId, datasetId)

タブのデータセットを切り替えます。

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

tabs.configureGraph(tabId, config)

Graph Builder タブを一括設定します。グラフタイプ、データセット、レイヤー、アスペクト比などを一度に指定できます。カラム名は大文字小文字を区別せずに解決されます。

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'
});

models

models.list()

訓練済みモデルの一覧を取得します。

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

models.run(config)

GLM を実行します。カラムは名前で指定でき、大文字小文字を区別しません。結果はタブを開かず直接返されます。models.list()models.describe() で後から参照するには、返された runIdmodels.save() に渡してモデルを保存してください。未保存の実行結果はメモリ上に最大 20 件保持され、ページリロードで消失します。

現在は 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:
// {
//   runId: '...',
//   coefficients: [
//     { variable: '(Intercept)', estimate: 2.25, se: 1.02, testStatistic: 2.21, p: 0.029, ciLower: 0.23, ciUpper: 4.27 },
//     ...
//   ],
//   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: []
// }

係数の testStatistic フィールドは Wald 検定統計量 estimate / se です。inferencetestStatisticpciLowerciUpper の計算に使われた参照分布を表します。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 は各係数の 95% Wald 信頼区間 estimate ± criticalValue × se です。臨界値は inference の参照分布の 0.975 分位点を使います。

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

family'gaussian'(デフォルト)、'binomial''poisson''gamma''negative-binomial' から選択します。link でリンク関数を指定できます。省略した場合は family に応じたデフォルトが使われます。

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

オプションパラメータ:

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

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'
});

models.save(runId, name?)

モデルの実行結果をプロジェクトに保存します。保存後、models.list()models.describe() で参照できます。

const run = await window.midas.models.run({ ... });
const saved = await window.midas.models.save(run.data.runId, 'My Model');
// saved.data: { modelId: '...', name: 'My Model' }

診断データセットは GLM Diagnostics タブを開いた時点で自動作成されます。含まれる主な列は fitted_valuesdeviance_residualspearson_residualsstandardized_residualsleveragecooks_distance です。これらを reports.addGraph() や Graph Builder で可視化して残差分析や診断プロットに使用できます。

models.describe(id)

モデルの詳細を取得します。GLM、GLMM、Random Forest に対応しています。レスポンス構造はモデルタイプにより異なります(result.data.type で判別)。GLMM と Random Forest のモデルは GUI から作成し、API では describe() で結果を参照できます。

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

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

Random Forest: タスクタイプ(classification/regression)、ハイパーパラメータ、変数重要度(保存されている場合)を返します。

const result = await window.midas.models.describe('model_001');
// GLM の例 - result.data:
// {
//   type: 'glm',
//   id: 'model_001',
//   name: 'My Model',
//   metadata: {
//     createdAt: '2025-01-15T10:30:00Z',
//     trainingDatasetId: 'ds_001',
//     predictors: ['sepal_width', 'petal_length'],
//     response: 'sepal_length',
//     sampleSize: 150
//   },
//   coefficients: [
//     { variable: '(Intercept)', estimate: 2.25, se: 1.02, testStatistic: 2.21, p: 0.029, ciLower: 0.23, ciUpper: 4.27 },
//     { variable: 'sepal_width', estimate: 0.60, se: 0.24, testStatistic: 2.50, p: 0.014, ciLower: 0.13, ciUpper: 1.07 },
//     ...
//   ],
//   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 配下の係数が ModelCoefficientInfo と同形式になり、inference は常に { distribution: 'normal', df: null } です。Random Forest には inference フィールドはありません。

// GLMM の例 - result.data:
// {
//   type: 'glmm',
//   id: 'model_002',
//   name: 'Mixed Model',
//   metadata: { createdAt: '2025-01-15T10:30:00Z', trainingDatasetId: 'ds_001', predictors: ['x1'], response: 'y', sampleSize: 200 },
//   fixedEffects: [
//     { variable: '(Intercept)', estimate: 3.14, se: 0.85, testStatistic: 3.69, p: 0.0002, ciLower: 1.47, ciUpper: 4.81 },
//     { variable: 'x1', estimate: 0.52, se: 0.18, testStatistic: 2.89, p: 0.004, ciLower: 0.17, ciUpper: 0.87 }
//   ],
//   inference: { distribution: 'normal', df: null },
//   randomEffects: {
//     groupColumn: 'school',
//     variance: 1.23,
//     residualVariance: 4.56,
//     icc: 0.212,
//     blup: [{ groupId: 'A', value: 0.45 }, { groupId: 'B', value: -0.32 }]
//   },
//   fit: { deviance: 892.1, aic: 902.1, bic: 915.3, logLikelihood: -447.05, iterations: 12, converged: true },
//   diagnosticSummary: { nObservations: 200, nGroups: 10, nFixedEffects: 2, degreesOfFreedom: 198, nIncomplete: 0, groupSizes: { min: 15, max: 25, mean: 20 } }
// }

models.configure(tabId, config)

GLM タブを設定します。family、link 関数、目的変数、説明変数を指定できます。カラム名は大文字小文字を区別せずに解決されます。

await window.midas.models.configure('glm_001', {
  family: 'binomial',
  link: 'logit',
  yColumn: 'outcome',
  xColumns: ['age', 'treatment'],
});

reports

reports.create(name, description?)

レポートを新規作成します。

const result = await window.midas.reports.create('Analysis Report');
// result.data: { reportId: '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 }, ...] }

reports.setContent(reportId, content)

レポートのテキスト内容を全体置換します。addContent()addModelSummary() で追加済みのテキストも置き換えられます。

const result = await window.midas.reports.setContent('report_001', '## Updated Results\n...');
// result.data: { contentLength: 42 }

reports.addContent(reportId, markdown)

レポートの末尾に Markdown テキストを追記します。

await window.midas.reports.addContent('report_001', '## Analysis Results\n\nThe model shows...');

reports.addModelSummary(reportId, modelId)

モデルのサマリーをレポートに追加します。GLM、GLMM、Linear Regression、Random Forest に対応しています。

全モデルタイプで要素参照方式を使用します(addGraph と同じ方式)。GLM / GLMM / Linear Regression の係数テーブルは DataTableElement として report.elements に追加され、レポート本文には {{data_table:elementId}} の参照が挿入されます。Random Forest の Feature Importance も DataTableElement(2 列: Feature, Importance、重要度降順ソート済み)として追加されます(featureImportances がある場合)。テーブルの実体は DerivedDataSet として project.datasets に登録されるため、Data タブの一覧にも表示されます。同一モデルに対して複数回呼び出した場合、係数 DerivedDataSet は name と operation が完全一致する既存 DerivedDataSet があれば再利用されます。同名で operation が異なる場合(fit 条件を変えた後に呼ぶなど)は Dataset with name "X" already exists エラーで APIResult.success === false が返ります。設定違いのサマリーを並存させたい場合は、旧モデルを削除するか、新モデルを別名で Save してから呼んでください。レポート要素(DataTableElementModelStatsElement 等)とテキストは毎回新規追加されます。モデルを削除すると関連する係数 DerivedDataSet も自動的に削除され、削除された dataset / model を参照するレポート要素 (DataTableElement / ModelStatsElement / GraphBuilderElement / CrosstabElement / CrossDatasetComparisonElement / StatisticsSummaryElement) がレポートから取り除かれます。reports.addModelSummary() を呼ぶ際、引数 modelId が実在する model を指していないと APIResult.success === false でエラーが返ります。

GLM / GLMM / Linear Regression の Model Fit / Random Effects / OLS Fit は、ModelStatsElement (type: 'model_stats') として report.elements に登録され、本文には {{model_stats:elementId}} の参照が挿入されます。要素はモデル ID のみ保持し、描画時に project.models[modelId] から値を動的に解決します。したがって、同じモデル ID で再学習して project.models が上書きされた場合、既存のレポートも自動で新しい値を表示します。レポート作成後にモデルを削除すると、ModelStatsElement は "Model not found" プレースホルダを表示します。

GLM と GLMM の係数テーブルは共通の列構成です: Variable, Estimate, Std. Error, Test Statistic, Distribution, DF, P-value, Lower 95%, Upper 95%。Linear Regression の係数テーブルはこれに加えて Std. Coef. と VIF を持ちます。Distribution 列は検定統計量と p 値の参照分布(t または normal)を、DF 列は t 分布参照時の自由度を示します(normal のときは null)。GLM の参照分布は family と link から決まります(models.run() の節の対応表を参照)。GLMM の固定効果は、MIDAS の実装選択として常に漸近正規分布(normal)を用います。Linear Regression は常に t 分布を用います。信頼区間はすべて Wald 型(estimate ± criticalValue × SE、臨界値は Distribution/DF 列が示す分布の 0.975 分位点)です。

モデル別の描画内容:

  • GLM: ModelStatsElement の Model Fit セクションに AIC, BIC, Deviance, Null Deviance, Converged, iterations を表示します
  • GLMM: ModelStatsElement の Random Effects セクションに Group Variable, Number of Groups, Random Intercept Variance, Residual Variance (LMM のみ), ICC を、Model Fit セクションに AIC, BIC, Deviance, Log-Likelihood, Converged, iterations を表示します。LMM(Gaussian + identity link)では AIC (REML), BIC (REML), REML Log-Likelihood, ICC と表記し、それ以外の GLMM では AIC, BIC, Log-Likelihood (Laplace), ICC (latent scale) と表記します
  • Linear Regression: 5 つの要素を登録します — 係数テーブル、ANOVA Type I、ANOVA Type III、Prediction Intervals (per-observation 予測区間/信頼区間)、ModelStatsElement。ModelStatsElement の OLS Fit セクションに R², Adjusted R², F-statistic, F p-value, RMSE, N observations を、Information Criteria セクションに AIC, BIC を表示します。Converged / iterations は OLS では自明なので表示しません
  • Random Forest: featureImportances がある場合は Feature Importance DataTableElement(2 列: Feature, Importance、重要度降順ソート済み)を、Model Configuration(Task Type, Number of Estimators, Max Depth, Min Samples Split, Min Samples Leaf, Max Features)と OOB Score を ModelStatsElement として登録します
const result = await window.midas.reports.addModelSummary('report_001', 'model_001');
// result.data: { reportId, addedText, elementId?, statsElementId?, anovaTypeIElementId?, anovaTypeIIIElementId?, predictionIntervalsElementId? }
// elementId / statsElementId は GLM / GLMM / Linear Regression / Random Forest のときに返される
// - elementId: 係数 / Feature Importance DataTableElement の id (RF: featureImportances が非空のときのみ)
// - statsElementId: Model Fit / Random Effects / OLS Fit / Model Configuration を描画する ModelStatsElement の id
// anovaTypeIElementId / anovaTypeIIIElementId / predictionIntervalsElementId は Linear Regression のみ

reports.addGraph(reportId, config)

レポートにグラフをレポート要素として追加します。タブを開かずに Custom Graph を宣言的に作成します。カラム名は大文字小文字を区別せずに解決されます。

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',
  height: 500,
});
// result.data: { elementId, reportId }

グラフはレポート要素として保存され、レポートの content に {{graph_builder:elementId}} の参照が追記されます。height パラメータはグラフの高さをピクセル単位で指定します。デフォルトは 400、最小値は 200、最大値は 5000 です。

aspectRatio には '16:9''4:3''1:1''3:4''9:16''custom' を指定できます。'custom' 以外のプリセット値を指定した場合、アスペクト比が表示時の高さを決定するため height は描画に使用されません。'custom' の場合は height で高さを指定します。

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() に渡すことで、タブを新しいペインに配置できます。

エラーコード

コード説明
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上書き対象の派生データセットが異なるメソッド(operation type)で作成されている
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サンドボックスモードで保存不可
ENUM_ALREADY_EXISTSenum 定義が既に存在する
ENUM_NOT_FOUNDenum 定義が見つからない
ENUM_IN_USEenum 定義が列から参照されている

参考

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