---
title: Synthetic Data Generator タブ
description: Synthetic Data Generator タブでデータ生成過程を宣言し、回帰・群構造・時系列・パネル・生存時間のデータセットを再現可能に生成する方法を説明します。分布・式・因子・By・プリセットの仕様を含みます。
priority: 0.6
audience: Synthetic Data Generator タブで検証・学習用の合成データを作る読者。平均・標準偏差など分布のパラメータの意味は仮定する。混合モデル・生存時間分析・時系列の理論は仮定しない
criteria: タブの操作と、生成の定義を構成する要素（分布・式・因子・By・プリセット）の意味を扱い、要素の組み合わせ方は設定例の節で示す。式のテキスト構文の一覧はこのページを正とする。Agent API の JSON 形式・オプション・エラーコードは agent-api.md に委ねる。各モデルの理論は concepts ページに委ね、推定の一般論（推定値が真値の周りに散らばること等）は説明しない
---

# Synthetic Data Generator タブ {#synthetic-data-generator}

Synthetic Data Generator タブは、列ごとに分布を宣言したデータ生成過程（DGP: data generating process）からデータセットを作ります。回帰・群構造・時系列・パネル・生存時間のデータを、外部ファイルなしで用意できます。生成に使った真のパラメータが分かっているため、分析手法の挙動の確認や操作の練習に使えます。

同じ定義からのデータ生成は、Agent API の `datasets.generateSynthetic` でも実行できます。spec の JSON 形式・オプション・エラーコードは [Agent API](agent-api) を参照してください。

## データの生成 {#generating-data}

メニューバーの Data > Generate Synthetic Data... を選ぶと、タブが開きます。

フォームでは Dataset name・Rows・Seed を入力し、Columns に列を並べて 1 列ずつ分布とパラメータを決めます。Add Column で列を増やし、行末のごみ箱ボタンで列を消します。Seed は −2,147,483,648 から 2,147,483,647 までの整数です。Rows は 10,000,000 以下の正の整数です。

![Synthetic Data Generator のフォーム](../shared/images/synthetic-data-generator-form.webp)

Generate Preview は入力を検証し、データを生成して先頭 10 行を表示します。入力に誤りがあると、Generate Preview はエラーメッセージを表示し、それまでのプレビューを消します。

## プレビューの確認と保存 {#saving-a-dataset}

Save as Dataset を押すまで、プロジェクトのデータセットは増えません。Generate Preview を何度やり直しても、既存のデータセットは変わりません。

![プレビューと Save as Dataset ボタン](../shared/images/synthetic-data-generator-preview.webp)

Save as Dataset を押すとデータセットができ、Data Table タブが開いて Synthetic Data Generator タブは閉じます。

既存のデータセットと同じ名前で保存しようとすると、名前の変更・連番の付与・置換を選ぶダイアログが開きます。置換は、置換先も Synthetic Data Generator タブで作ったデータセットの場合にだけ選べます。それ以外の場合、ダイアログは置換の選択肢を無効にして理由を表示します。

## 列と分布 {#columns-and-distributions}

各列は分布を 1 つ持ちます。分布のパラメータは式で指定します。式は他の列を参照できるため、列の間の依存関係で生成過程を表現します。式の書き方は [式の構文](#expression-syntax) を参照してください。

選べる分布は 8 種類で、パラメータ欄は分布ごとに変わります。各パラメータの意味と分布の形は [確率分布の基礎](concepts-distributions) で説明しています。

| 分布 | パラメータ | 列のデータ型 |
|------|-----------|--------------|
| [Normal](concepts-distributions#normal) | Mean、SD | float64 |
| [Uniform](concepts-distributions#uniform) | Min、Max | float64 |
| [Bernoulli (0/1)](concepts-distributions#bernoulli) | P | int64 |
| [Categorical](concepts-distributions#categorical) | Levels、Weights | string |
| [Poisson](concepts-distributions#poisson) | Lambda | int64 |
| [Gamma](concepts-distributions#gamma) | Shape、Scale | float64 |
| [Weibull](concepts-distributions#weibull) | Shape、Scale | float64 |
| Deterministic | Value | float64[^indicator] |

[^indicator]: Deterministic 列は、式の最上位が比較のときだけ 0/1 の int64 列になります。[打ち切りのある生存時間](#example-survival) のイベント変数の列がこの例です。

Deterministic はノイズを持たず、式の値をそのまま列にします。[線形予測子](concepts-glm#model-formulation) の列や、他の列を変換した列を作るときに使います。

Categorical では、Levels にカンマ区切りで水準を並べ、Weights に水準ごとの重みを書きます。Weights を省くとすべての水準を同じ確率で選びます。Weights の各要素も式なので、行ごとに変わる重みを書けます。MIDAS は負の重みと、すべてが 0 になる重みを拒否します。

Gamma と Weibull は Shape と Scale でパラメータ化します。Gamma の平均は Shape × Scale、分散は Shape × Scale² です。Weibull の平均は Scale × Γ(1 + 1/Shape) です（Γ はガンマ関数）。

列のデータ型と測定尺度の対応は [データ型と測定尺度](concepts-data-types) を参照してください。

式の値がパラメータの定義域を外れると、生成は失敗します。Normal の SD が 0 以下になる、Poisson の Lambda が 0 以下になる、Uniform の Max が Min 以下になる、といった場合が該当します[^map-domain]。

[^map-domain]: 線形予測子を定義域へ写すには、logistic で 0 から 1 の範囲に、exp で正の値に変換します。

定義した列はすべて出力データセットの列になります。中間計算のための列だけを出力から外す設定はありません。

## 式の構文 {#expression-syntax}

式は、分布のパラメータに書くテキストで、評価すると数値になります。

式は同じ定義の中の他の列を名前で参照できます。参照に循環がなければ、列を並べる順は問いません。数値の列は名前をそのまま書いて参照します。文字列の列（Categorical の列と Add Factor で作る因子の列）は、後述の cases 経由でしか参照できません。

使える演算子は四則演算 `+` `-` `*` `/` と単項マイナス、比較 `<` `<=` `>` `>=` です。優先順位は乗除、加減、比較の順に低くなり、括弧で順序を明示できます。比較は真なら 1、偽なら 0 を返します[^nan-compare]。返り値が数値なので、比較を他の項と掛けて 0/1 の指示変数として使えます。

[^nan-compare]: 比較する 2 つの値のどちらかが NaN のときは、0 でも 1 でもなく NaN を返します。NaN をパラメータに使った時点で生成が失敗するため、定義域外の計算が 0 や 1 として列に紛れることはありません。

数学の記法のように比較を 2 つ続けて書くことはできず、`0 < x < 1` はパースエラーになります。区間は 2 つの比較の積として `(0 < x) * (x < 1)` と書きます。`=` と `==` は使えません[^no-eq]。単一の値との一致も `(t >= 6) * (t <= 6)` のように 2 つの比較の積で書きます。

[^no-eq]: 浮動小数点の等値比較は丸め誤差で意図しない結果を生むため、言語に含めていません。

使える関数と引数の個数は次のとおりです。

| 関数 | 引数の個数 | 意味 |
|------|-----------|------|
| exp(x) | 1 | 指数関数 |
| log(x) | 1 | 自然対数 |
| sqrt(x) | 1 | 平方根 |
| logistic(x) | 1 | ロジスティック関数 1/(1+exp(−x)) |
| pow(x, y) | 2 | べき乗 x^y |
| min(x, y) | 2 | 2 つの値の小さい方 |
| max(x, y) | 2 | 2 つの値の大きい方 |
| abs(x) | 1 | 絶対値 |

cases は文字列の列の値ごとに式を切り替えます。`cases(group){A: 0, B: 1.5, default: 0}` のように、参照する列名と、水準ごとの式を書きます。水準をすべて並べるか、default の項目を置く必要があります。水準名は、英字または `_` で始まり英数字と `_` が続く形であればそのまま書けます。それ以外の水準名は `cases(group){"Group A": 0, default: 1}` のように引用符で囲みます。

cases の返り値は水準ごとの値そのものです。`10 + cases(group){control: 0, treat: 1.5}` のように基準となる式に足すと、群ごとのずれを表せます。

cases は水準を量的な値へ写す用途にも使えます。Deterministic の Value に `cases(dose){low: 10, mid: 20, high: 40}` と書くと、用量を数値として持つ列ができます。

lag(列, k) は同じ系列の k 行前の値を返します。系列の定義は [因子と行の構造](#factors) を参照してください。lag は Time column を宣言したときだけ使えます。オフセット k は 1 以上、Time column の Length 未満の整数です。`0.3 + 0.5*lag(y, 1) + 0.2*lag(y, 2)` のように、複数の過去を参照する式も書けます。

因子列と、By に時刻列を含まない列は、値が系列の中で一定なので lag の対象にできません。例えば水準 A の系列では、因子列はどの行でも A で、k 行前の値も A のままです。MIDAS は、2 つの列が互いの lag を参照し合う定義を循環参照として拒否します。

系列の先頭より前を指す lag は 0 を返します。このため、自己回帰の系列は先頭の数行が以降の行と違う分布に従います。先頭の影響を避けたいときは、Length を長めにして先頭の時点を除いて使います。

### 式の例 {#expression-examples}

よく使う式を示します。

| 目的 | 書く場所 | 式 |
|------|---------|-----|
| 単回帰 | y の Mean | `1 + 2*x` |
| 交互作用 | y の Mean | `1 + 0.5*x1 + 0.3*x2 + 0.2*x1*x2` |
| ポアソン回帰 | Poisson の Lambda | `exp(0.5 + 0.3*x)` |
| 群ごとの切片のずれ | y の Mean | `10 + cases(group){control: 0, treat: 1.5}` |
| x で変わる散らばり | y の SD | `0.5 + 0.2*abs(x)` |
| 値の範囲の切り詰め | Deterministic の Value | `min(max(z, -2), 2)` |

## 因子と行の構造 {#factors}

Factors を宣言すると、行数は因子から決まります。Rows 欄は入力を受け付けなくなり、決まった行数を表示します。行数は、すべての因子の水準数を掛け合わせた値に、Rows per cell と Time column の Length を掛けた値です。10,000,000 行を超える定義は生成できません。

Add Factor で作る因子は、宣言した水準を値に持つ文字列の列を 1 本作ります。Name に列名、Levels にカンマ区切りで水準を書きます。因子を複数宣言すると、水準のすべての組み合わせが行として並びます。Rows per cell は 1 つの組み合わせあたりの行数を決めます。水準の全組み合わせに同じ行数を割り当てるため、均衡したデータを作れます。

Time column に名前を書くと、1 から Length までの整数を値に持つ列ができます。水準の組み合わせと Rows per cell で決まる 1 行ずつが、時刻 1 から Length までの行に展開されます。この展開でできた行のまとまりを系列と呼びます。行は系列ごとに時刻の順に並び、lag は同じ系列の中で過去を参照します。時刻の列は数値なので、`0.1*t` のように時刻を使った項を式に書けます。

因子の列と時刻の列も出力データセットの列になります。

因子を宣言せず Time column だけを使う場合、Rows per cell を 2 以上にすると、各時点に Rows per cell 個の観測を持つデータができます。By に時刻列を指定した列と組み合わせると、同じ時点の観測が共通の値を共有するデータを作れます。この構成では系列が Rows per cell 本でき、lag は系列ごとに独立に過去を参照します。どの行がどの系列に属するかを示す列はできないため、観測のまとまりを区別する列が必要なときは因子を宣言します。

## By と群ごとの値 {#by-groups}

By を指定した列は、群ごとに 1 回だけ値を生成し、その群のすべての行に同じ値を入れます。群ごとの切片のずれなど、群ごとに決まる値を作るのに使います。

群は By に並べた列の値の組で決まります。By に指定できるのは、因子・Time column・Categorical 列の名前だけです。連続値の列は指定できません。因子を指定すると、群の数は宣言どおりで、群の大きさは均等になります。Categorical 列を指定すると、各群の行数はサンプリングの結果で決まるため一定になりません。行数によっては 1 行も現れない水準が生じます。

因子の一部だけを By に並べた列は、その値を、並べなかった因子をまたいで共有します。たとえば school と class の 2 因子があるとき、By に class だけを書いた列は、同じ class の値をすべての school で共有します。school ごとに別の値を生成する入れ子の群にするには、By に school, class と両方を並べます。

By を持つ列の式が参照できるのは、By に並べた列と、その By がこの列の By の部分集合である列だけです。観測ごとに値が変わる列を参照すると生成が失敗します。By を持つ列では lag も使えません。

Time column の名前を By に指定すると、時点ごとに 1 回だけ値を生成する列になります。同じ時点の値は全系列で共有します。

By で作った群ごとの値を、固定効果として扱うかランダム効果として扱うかは、当てはめるモデル側の指定で決まります。考え方は [GLMM の基礎](concepts-glmm) を参照してください。

## プリセット {#presets}

Preset を選ぶと、因子と列がプリセットの内容に置き換わり、編集の出発点になります。Dataset name と Seed はそのまま残ります。Preset を選び直すと、それまでの因子と列の編集内容とプレビューは消えます。既存のデータセットを編集しているときは、Preset は選べません。

Multilevel (random intercept) は 40 校 × 10 人の 400 行です。学校ごとの切片 u を SD 0.8 の正規分布から生成し、個人ごとの説明変数 x から y = 10 + 0.6x + u に SD 1 の残差を加えます。x を与えたときの [級内相関係数](concepts-glmm#icc-intraclass-correlation-coefficient) は 0.64/(0.64+1) ≈ 0.39 です。

Repeated measures (subject × time) は 30 人 × 8 時点の 240 行です。個人ごとの切片 u を SD 1 の正規分布から生成し、y = 20 + 0.5t + u に時点ごとに独立な SD 1 の測定誤差を加えます。同一個人内の時点間相関は 0.5 で、系列相関はありません。

Correlated random intercept and slope は 40 群 × 10 行の 400 行です。群ごとの切片 u0（SD 0.9）と傾き u1（SD 0.4）を相関 0.5 で生成し、y = 2 + u0 + (0.7 + u1)x に SD 1 の残差を加えます。相関する 2 つの効果は、独立な標準正規 z0・z1 の線形結合として合成します。

MIDAS の GLMM が当てはめるのはランダム切片だけです。そのため、Correlated random intercept and slope が作るデータにランダム切片モデルを当てはめると、モデルの構造が生成過程と食い違います。この当てはめでは y の条件付き分散が x に依存します。当てはめの操作は [GLMM タブ](glmm) を参照してください。

## 設定例 {#configuration-examples}

この節の各例は、生成過程の説明と、それを表現する設定の一覧を示します。

### 二値の応答 {#example-binary-response}

線形予測子を Deterministic 列に置き、logistic を通した値を Bernoulli の P にします。次の設定は、切片 −1、係数 0.8 のロジスティック回帰に従うデータを作ります。

| 列 | 分布 | パラメータ | By |
|----|------|-----------|----|
| x | Normal | Mean: `0`、SD: `1` | |
| eta | Deterministic | Value: `-1 + 0.8*x` | |
| y | Bernoulli | P: `logistic(eta)` | |
### 群ごとに切片が違う回帰 {#example-group-intercepts}

因子で群を作り、群ごとに生成した By 列を平均に足します。次の設定は、Levels を `A, B, C, D, E`、Rows per cell を 40 とした因子 group の下で、群ごとの切片のずれ u を持つ回帰データを作ります。

| 列 | 分布 | パラメータ | By |
|----|------|-----------|----|
| u | Normal | Mean: `0`、SD: `0.8` | group |
| x | Normal | Mean: `0`、SD: `1` | |
| y | Normal | Mean: `10 + 0.6*x + u`、SD: `1` | |

### 自己回帰のある時系列 {#example-autoregressive}

Time column を宣言し、y の Mean に lag(y, 1) を入れます。次の設定は、Time column を `t`、Length を 200 として、自己回帰係数 0.7 の系列を作ります。

| 列 | 分布 | パラメータ | By |
|----|------|-----------|----|
| y | Normal | Mean: `0.7 * lag(y, 1)`、SD: `1` | |

先頭行の lag は 0 を返すため、系列の先頭の数時点は、以降の時点より分散が小さくなります。この設定は 1 本の系列を 1 列に生成するため、そのまま [ARIMA タブ](arima) に渡せます。

### 個体をまたぐパネル {#example-panel}

因子で個体を宣言し、個体ごとに生成した By 列を平均に足します。次の設定は、Levels に 20 個体の識別子（`P01, P02, ..., P20`）を並べた因子 id と、Length 10 の Time column `t` の下で、個体 × 時点のパネルデータを作ります。

| 列 | 分布 | パラメータ | By |
|----|------|-----------|----|
| u | Normal | Mean: `0`、SD: `1` | id |
| y | Normal | Mean: `5 + 0.3*t + u`、SD: `1` | |

### 打ち切りのある生存時間 {#example-survival}

イベント時刻と打ち切り時刻をそれぞれ別の列として生成し、min で観測時間の列を、比較でイベント変数の列を作ります。次の設定は、イベント時刻の Scale を `exp(0.5 + 0.3*x)` とし、説明変数 x がイベント時刻に影響する生存時間データを作ります。

| 列 | 分布 | パラメータ | By |
|----|------|-----------|----|
| x | Normal | Mean: `0`、SD: `1` | |
| T_event | Weibull | Shape: `1.5`、Scale: `exp(0.5 + 0.3*x)` | |
| T_cens | Uniform | Min: `0.5`、Max: `3` | |
| time | Deterministic | Value: `min(T_event, T_cens)` | |
| event | Deterministic | Value: `T_event <= T_cens` | |

event は式の最上位が比較なので 0/1 の int64 列になり、そのまま [Kaplan-Meier タブ](kaplan-meier) のイベント変数に使えます。打ち切り時刻には正の値だけを取る分布を使います[^positive-censoring]。

[^positive-censoring]: 観測時間が 0 以下の行があると、生存分析はデータセットを拒否します。

## 保存したデータセットの編集 {#editing-saved-datasets}

保存した合成データの定義は、データセットの Edit Operation から開き直せます。開く手順は [Project Overview タブ](project-overview) と [Project Lineage タブ](project-lineage) を参照してください。

編集モードではデータセット名を変えられず、Update Dataset が同じデータセットを上書きします。名前を変えていない列は上書き後も同じ列 ID を保ちます。そのため、このデータセットを使うモデル・派生データセット・レポートは、列の参照を保ったままになります。編集しているデータセットを使うモデル・派生データセット・レポートがあるときは、タブの先頭に警告が出ます。

保存した合成データは、データ本体ではなく生成の定義と Seed を保持し、プロジェクトを開くたびに定義からデータを再生成します。再生成の値は乱数生成と数学関数の実装に依存するため、別のブラウザで開くか、MIDAS またはブラウザのバージョンが変わると、同じ定義と Seed でも値が変わることがあります。値をそのまま残したいときは、CSV へ書き出して読み込み直します。書き出しの操作は [エクスポート](export) を参照してください。

## 補遺: 式の文法と意味論 {#expression-grammar}

この補遺は、式のテキスト構文と評価規則を定義します。

### 文法 {#grammar}

式の文法を EBNF で示します。

```text
式           = 加減式 [ 比較演算子 加減式 ] ;
比較演算子   = "<" | "<=" | ">" | ">=" ;
加減式       = 項 { ("+" | "-") 項 } ;
項           = 基本式 { ("*" | "/") 基本式 } ;
基本式       = 数値 | 列参照 | 関数呼び出し | cases式 | lag式
             | "(" 式 ")" | ("-" | "+") 基本式 ;
関数呼び出し = 関数名 "(" 式 { "," 式 } ")" ;
関数名       = "exp" | "log" | "sqrt" | "logistic"
             | "pow" | "min" | "max" | "abs" ;
cases式      = "cases" "(" 識別子 ")" "{" 分岐 { "," 分岐 } [ "," ] "}" ;
分岐         = ラベル ":" 式 ;
ラベル       = 識別子 | 文字列 | 数値 | "default" ;
lag式        = "lag" "(" 識別子 "," 数値 ")" ;
列参照       = 識別子 ;
識別子       = (英字 | "_") { 英字 | 数字 | "_" } ;
数値         = ( 数字列 [ "." { 数字 } ] | "." 数字列 ) [ 指数部 ] ;
指数部       = ("e" | "E") [ "+" | "-" ] 数字列 ;
文字列       = '"' { '"' 以外の文字 } '"' | "'" { "'" 以外の文字 } "'" ;
```

トークンの間の空白（スペース・タブ・改行）は無視します。

`a < b < c` のように比較を 2 つ続けて書くと、パースエラーになります。括弧の中・関数の引数・cases の分岐はそれぞれ独立した式なので、そこには比較を書けます。`=` は字句解析の時点で拒否し、エラーメッセージで使える比較演算子を案内します。

負の数のリテラルはありません。`-1` は、単項マイナスを数値 1 に適用した式として読みます。

数値のリテラルは有限の値だけを受理し、オーバーフローする表記（`1e999` など）は字句解析の時点で拒否します。

cases は、同じラベルの重複と、default の 2 回以上の出現をパースエラーにします。数値のラベルは数値として読んでから文字列へ戻すため、`01` は水準 "1" の分岐になります。字面どおりに照合するには引用符で囲みます。

cases と lag は、直後に `(` が続くときだけ構文として扱います。続かなければ通常の列参照です。そのため、cases や lag という名前の列も参照できます。

関数の引数の個数は、パースの時点で検査します。

### 意味論 {#semantics}

式は行ごとに評価し、値は IEEE 754 の倍精度浮動小数点数です。列参照は同じ行の値を読みます。分布のパラメータとして使う場合は、行ごとにパラメータの式を評価してから、その値で 1 つサンプリングします。By を持つ列では、群の最初の行で 1 回だけ評価とサンプリングを行います。

四則演算は倍精度の算術です。0 での除算は IEEE 754 に従って無限大に、0/0 は NaN になります。

比較は真なら 1、偽なら 0 です。比較する値のどちらかが NaN のときは NaN を返します。偽（0）へ潰すと、定義域外の計算の結果が有効な値として列に入り、検出できなくなるためです。

関数は倍精度の数学関数です。log と sqrt は負の引数に NaN を返し、log(0) は負の無限大になります。

cases の値は、その行の水準に対応する分岐の式の値です。水準がどの分岐にもなく default があるときは、default の式の値です。

lag の値は、同じ系列の k 行前の値です。系列の先頭より前は 0 で、系列の境界を越えて前の系列の値を読むことはありません。

式の評価そのものは NaN や無限大を許します。その値を分布のパラメータとして使った時点で MIDAS は有限性を検査し、非有限値であれば生成を失敗させます。
