\( \newcommand{\E}{\mathbb{E}} \newcommand{\Var}{\operatorname{Var}} \newcommand{\Cov}{\operatorname{Cov}} \newcommand{\Prob}{\mathbb{P}} \newcommand{\R}{\mathbb{R}} \newcommand{\N}{\mathbb{N}} \newcommand{\iid}{\overset{\text{i.i.d.}}{\sim}} \newcommand{\dto}{\xrightarrow{d}} \newcommand{\pto}{\xrightarrow{p}} \newcommand{\diff}{\mathop{}\!\mathrm{d}} \)

noisymoon API

単位根検定と反応拡散シミュレーションを、HTTP から

このサイトの記事で扱っている計算を、自分のプログラムから呼び出せる API です。

アカウントを作る・API キーを発行する →

料金

前払いのクレジット制です。使った分だけ残高から引かれます。

項目 料金
ADF / KPSS / t 検定 / カルマンフィルタ / ローカルレベル / 情報量 1 回 ¥1
Gray-Scott 百万セル・ステップあたり ¥0.01(256×256 格子・1 万ステップで約 ¥6.6)
購入単位 ¥500 / ¥1,000 / ¥5,000(税込・クレジットカード)
  • クレジットの有効期限は購入から 180 日です。
  • 入力の誤りなどで計算が失敗したときは課金されません。シミュレーションが失敗した場合は返金されます。
  • 記事の中の「試す」デモは無料です(系列 500 点まで・1 分あたり 10 回まで)。

使い方

1. API キーを発行する

アカウント からメールアドレスでログインし、クレジットを購入してキーを発行します。キーは nm_ で始まる文字列で、発行時に一度だけ表示されます。

2. 呼び出す

キーは X-API-Key ヘッダーで送ります。

curl -X POST https://api.noisymoon.jp/v1/tests/adf \
  -H "X-API-Key: $NOISYMOON_KEY" \
  -d '{"series": [0.12, 0.35, 0.10, 0.44, 0.61, 0.52, 0.80, 0.77, 0.95, 1.10], "regression": "c"}'

Python からは次のように使えます。

import os, requests

API = "https://api.noisymoon.jp"
H = {"X-API-Key": os.environ["NOISYMOON_KEY"]}

r = requests.post(f"{API}/v1/tests/adf", headers=H,
                  json={"series": list(y), "regression": "ct", "autolag": "AIC"})
r.raise_for_status()
res = r.json()
print(res["statistic"], res["pvalue"], res["critical_values"])

シミュレーションは時間がかかるので「ジョブ」として受け付け、終わってから結果を取りに行きます。

import io, time, numpy as np

job = requests.post(f"{API}/v1/sim/gray-scott", headers=H,
                    json={"n": 256, "steps": 10000, "F": 0.0367, "k": 0.0649, "init": "random"}).json()
while True:
    st = requests.get(f"{API}/v1/jobs/{job['id']}", headers=H).json()
    if st["status"] in ("done", "failed"):
        break
    time.sleep(2)

v = np.load(io.BytesIO(requests.get(f"{API}/v1/jobs/{job['id']}/v.npy", headers=H).content))

ツールごとの要点

各ツールについて、必要なデータ・前提条件・出力する値をまとめます。詳しい説明と証明は各記事にあります。

ツール 必要なデータ 前提条件 出力する値
ADF 検定 1 本の時系列(10 点以上)、確定項の選び方 帰無仮説は単位根あり。検出力が低く、構造変化に弱い 統計量、p 値、選ばれたラグ、臨界値
KPSS 検定 1 本の時系列、水準定常かトレンド定常か 帰無仮説は定常。ADF と組み合わせて使う 統計量、p 値(表の範囲外なら注記)、ラグ、臨界値
t 検定 標本 x(と y)、帰無仮説の値、片側/両側 正規分布・独立。2 標本の既定は等分散(Welch も可) t、自由度、p 値、推定値と標準誤差、信頼区間
カルマンフィルタ 観測の列(欠測可)、行列 F・H・Q・R、初期値(省略可) 線形・ガウス、行列は時間によらない 予測・フィルタ・平滑化の平均と共分散、予測誤差、対数尤度、次の期の予測
ローカルレベル 1 本の時系列(3 点以上、欠測可) ランダムウォークする水準+独立な観測ノイズ 2 つの分散の推定値、水準のフィルタ・平滑化と標準偏差、AIC、次の期の予測
KL 情報量 分布族と 2 つの分布の母数(離散なら確率ベクトル) 同じ分布族、母数が正しい範囲 KL(P‖Q)、KL(Q‖P)、Jeffreys、ビット単位
Fisher 情報量 分布族と、母数の値+n または標本 正則条件、分布族が正しい 情報行列、Cramér–Rao の下限、最尤推定値と標準誤差
分布の当てはめ 1 本の標本(3 点以上) 独立同分布、連続と離散を混ぜない 分布ごとの最尤推定値・尤度・AIC・BIC・赤池重み、最良の分布
Gray-Scott 格子の大きさ、ステップ数、F・k などの係数 陽的オイラー法の安定条件 dt·max(Du,Dv) ≤ 0.25 v 場の画像(PNG)と配列(.npy)、要約統計

エンドポイント

メソッド パス 内容
POST /v1/tests/adf ADF 検定
POST /v1/tests/kpss KPSS 検定
POST /v1/tests/ttest-1samp 1 標本の t 検定
POST /v1/tests/ttest-2samp 2 標本の t 検定(等分散/Welch)
POST /v1/tests/ttest-paired 対応のある 2 標本の t 検定
POST /v1/statespace/kalman カルマンフィルタ・平滑化・尤度
POST /v1/statespace/local-level ローカルレベルモデルの最尤推定と水準の平滑化
POST /v1/info/kl KL 情報量
POST /v1/info/fisher Fisher 情報量
POST /v1/info/select-distribution 分布の当てはめと AIC・BIC
POST /v1/sim/gray-scott Gray-Scott のジョブを登録(202 を返す)
GET /v1/jobs/{id} ジョブの状態と結果の要約
GET /v1/jobs/{id}/v.png 結果の画像(v 場、viridis)
GET /v1/jobs/{id}/v.npy 結果の配列(float32, 形状 (n, n))
GET /v1/usage 直近 30 日の使用量と残高
GET /v1/pricing 現在の料金(キー不要)

ADF 検定 POST /v1/tests/adf

パラメータ 既定値 内容
series (必須) 数値の配列。10〜100,000 点
regression "c" 確定項。"n"(なし)/ "c"(定数)/ "ct"(定数+トレンド)/ "ctt"(+2次トレンド)
autolag "AIC" ラグの選び方。"AIC" / "BIC" / "t-stat" / null(maxlag をそのまま使う)
maxlag \(12(n/100)^{1/4}\) 最大ラグ

statsmodels の adfuller と同じ手順・同じ既定値です。検定の中身は ADF 検定の記事 を参照してください。

KPSS 検定 POST /v1/tests/kpss

パラメータ 既定値 内容
series (必須) 数値の配列
regression "c" "c"(水準定常)/ "ct"(トレンド定常)
nlags "auto" "auto"(Hobijn et al. 1998)/ "legacy" / 整数

t 検定 POST /v1/tests/ttest-1samp ・ ttest-2samp ・ ttest-paired

パラメータ 既定値 内容
x (必須) 数値の配列(2〜100,000 点)
y (2 標本・対応ありで必須) 数値の配列。対応ありでは x と同じ長さ
mu0 0 帰無仮説の値(1 標本は平均、2 標本・対応ありは差 x − y の平均)
alternative "two-sided" "two-sided" / "greater" / "less"
equal_var true 2 標本のみ。true で等分散(Student、UMP 不偏)、false で Welch
confidence 0.95 信頼区間の水準

返り値は statistic(t)、df、pvalue、estimate(平均または差)、stderr、confidence_interval(片側では一方が null=無限大)。 scipy の ttest_1samp / ttest_ind / ttest_rel と同じ定義です。理論は t 検定の記事 を参照してください。

r = requests.post(f"{API}/v1/tests/ttest-2samp", headers=H,
                  json={"x": list(a), "y": list(b), "alternative": "greater"}).json()
print(r["statistic"], r["df"], r["pvalue"], r["confidence_interval"])

カルマンフィルタ POST /v1/statespace/kalman

パラメータ 既定値 内容
y (必須) 長さ T の配列。1 次元なら数値か null、p 次元なら各時点が長さ p の配列(成分ごとに null 可)
F, H, Q, R (必須) 状態遷移 m×m、観測 p×m、状態ノイズの共分散 m×m、観測ノイズの共分散 p×p。1×1 は数値でもよい
x0, P0 近似散漫初期化 初期状態の平均(長さ m)と共分散(m×m)。両方省略すると P0 = 10⁶ I、最初の m 期を尤度から除外
smooth true 平滑化も計算する
return_cov true 各期の共分散行列も返す(T×m² が 200 万を超えるときは false にする)

上限:T ≤ 100,000、m, p ≤ 20。結果は statsmodels の状態空間モデルと一致します(既知の初期値で相対 10⁻⁸)。

ローカルレベルモデル POST /v1/statespace/local-level

{"y": [...]}(欠測は null)だけを送ると、観測ノイズと水準の変化の 2 つの分散を最尤法で推定し、水準のフィルタ・平滑化と標準偏差、AIC、次の期の予測を返します。

r = requests.post(f"{API}/v1/statespace/local-level", headers=H, json={"y": list(y)}).json()
r["params"], r["level"]["smoothed"]

情報量 POST /v1/info/kl ・ fisher ・ select-distribution

requests.post(f"{API}/v1/info/kl", headers=H, json={
    "family": "gamma", "p": {"shape": 2, "rate": 1}, "q": {"shape": 3, "rate": 1.5}}).json()
requests.post(f"{API}/v1/info/fisher", headers=H, json={"family": "normal", "params": {"mu": 0, "sigma2": 4}, "n": 50}).json()
requests.post(f"{API}/v1/info/fisher", headers=H, json={"family": "gamma", "sample": list(x)}).json()   # 最尤推定値と標準誤差
requests.post(f"{API}/v1/info/select-distribution", headers=H, json={"x": list(x)}).json()

KL の分布族と母数:normal(mu, sigma)、mvnormal(mean, cov)、exponential(rate)、poisson(lambda)、gamma(shape, rate)、discrete(p, q を確率ベクトルで)。 Fisher の分布族と母数:normal(mu, sigma2)、poisson(lambda)、binomial(p、trials 必須)、exponential(rate)、gamma(shape, rate)。 分布の当てはめの候補は、連続が normal・lognormal・exponential・gamma・weibull、離散が poisson・negbinom(trials を渡すと binomial も)。標本がすべて 0 以上の整数なら離散の候補を使う。

Gray-Scott POST /v1/sim/gray-scott

\[ \partial_t u = D_u \nabla^2 u - u v^2 + F(1-u), \qquad \partial_t v = D_v \nabla^2 v + u v^2 - (F+k) v \]

パラメータ 既定値 範囲
n 256 16〜512(格子の一辺、周期境界)
steps 10000 1〜100000(ただし \(n^2 \times\) steps \(\le 512^2 \times 20000\))
F, k 0.035, 0.065 0〜0.2
Du, Dv 0.16, 0.08 0〜1
dt 1.0 \(dt \cdot \max(D_u, D_v) \le 0.25\)(陽的オイラー法の安定条件)
seed 乱数 同じ値で同じ結果を再現できる
init "center" "center"(中央に種)/ "random"(ランダムな位置に種)

エラー

エラーは次の形で返ります。

{"error": {"code": "invalid_argument", "message": "series の長さは 10〜100000"}}
HTTP code 意味
400 invalid_argument / invalid_json 入力の誤り(課金されません)
401 unauthorized キーがない・無効
402 insufficient_credit 残高不足
429 rate_limited / too_many_jobs 1 分あたり 60 回、または同時ジョブ 3 件の上限

無料デモ

キーなしで試せます(系列 500 点まで)。

規約など