1. Quick Start Guide

1.1 rABMのインストール

(1) rABMのダウンロード

rABMは、この文書の執筆時点(2026年3月)では、佐藤圭一(一橋大学)のGitHubリポジトリからダウンロードすることで利用できます(今後CRANにも投稿予定です)。

はじめに、ダウンロード用のパッケージである`pak`パッケージを自身のRにインストールします(すでにインストール済みの場合、この手順は省略できます)。

library(pak)
pak::pak("KeiichiSatoh/rABM")

(2) rABMの読み込み

使用時には毎回rABMを読み込みます。

library(rABM)

1.2 rABMの使用の基礎

rABMを用いたシミュレーションの実行は、以下の3つのステップからなると理解できます。

  1. エージェントの状態と、その更新を行うためのオブジェクトを設定する

  2. それらのオブジェクトをGameオブジェクトに格納する

  3. シミュレーションを実行する

ただし、ステップ1とステップ2は、各オブジェクトごとに順に行うことも可能です。複雑なABMを実装する場合には、そのように段階的に実装するほうが理解しやすいでしょう。

以下では、このステップに従い、基本的な手順を理解するために、簡単な例を実装します。

  • 年齢がそれぞれ{1, 2, 3, 4, 5}歳の5人のエージェントがいる

  • エージェントは更新のたびに1歳ずつ年齢が増加する

ステップ1: 状態と更新を表現するオブジェクトを作成する

まず各エージェントの年齢をageというベクトルで表現します。

age <- c(1, 2, 3, 4, 5)

次に「更新のたびに年齢が1増える」という処理を関数として定義します。ここでは元のオブジェクトに1を加える処理をget_olderとして定義します。

なお、Gameオブジェクトを自己参照する場合には、selfを使用します。この点に関してはあとの章で詳しく説明します。

get_older <- function(){
  self$age <- self$age + 1
  }

ステップ2: Gameオブジェクトに格納する

次にageget_olderを、rABMでシミュレーションを実行するためのオブジェクトであるGameに格納します。Gameオブジェクトを作る際には、それぞれのオブジェクトがどのタイプのフィールドかを指定する必要があります。

  • age:状態を表すstateフィールド

  • get_older:更新を行うact_FUNフィールド

G <- Game(State(age), Act(get_older))

なお、ここではフィールドをまとめて追加しましたが、以下のように一つずつ追加することも可能です。

# 空のGameオブジェクトを作成
G <- Game()

# ageを追加
add_field(G, State(age))

# get_olderを追加
add_field(G, Act(get_older))

作成されたGameオブジェクトを表示すると、オブジェクトの内容と、メタデータが確認できます。

G
<Game>
$age(state)
[1] 1 2 3 4 5

$get_older(act_FUN)
function (E = E) 
{
    self$age <- self$age + 1
}

------------------- 
time         : 1 
n of logs    : 0 
n of notes   : 0 
n of fields  : 2 
 state       : age
 act_FUN     : get_older
------------------- 

ステップ3: シミュレーションの実行

Gameオブジェクトに設定したシミュレーションは、run_Game()関数で実行できます。実際に使用する更新関数(act_FUN)の名前をplan引数に設定します。

以下では、1回分の更新をtimes引数で指定しています。

G2 <- run_Game(G = G, plan = "get_older", times = 1)
[plan] 
get_older
 
[stop_FUN] 
stop times at 2

The initial values at time 1 were saved.

Ready to run......
   start time  : 1
   current time: 2
Finished at time 2 

Simulation took 00:00:00.009 (hh:mm:ss.mmm)

結果が保存されたオブジェクトG2ageフィールドを確認します。

G2$age
[1] 2 3 4 5 6

1回分の更新が反映されていることが確認できます。たとえば、1番目のエージェントの年齢は初期値の1歳から2歳に変化しています。

なお、Rではインデックスは1から始まります。このため、Gameにおいても初期状態の時刻はtime = 1とカウントされ、1回更新後はtime = 2となります。

このようにrABMでは、更新用の関数をact_FUNとして定義し、それをrun_Game()`で実行することでシミュレーションを行います。

【重要】Gオブジェクトのコピーについて

rABMGameオブジェクトは、R6というクラスを使用しています。このクラスのオブジェクトは、通常の方法でコピーしてもその内部で参照先が共通となります。具体的には、通常の方法でコピーをすると以下のような動作が起こります。

# G1を作成する
x <- 1
G1 <- Game(State(x))

# G1をG2に通常の方法でコピーする
G2 <- G1

# G2のxを2に変更する
G2$x <- 2

# すると共通の参照先をもつG1$xの値も2に変わってしまう。
G2$x
[1] 2

このような動作は、多くの通常のRユーザーにとって直感に反するものとなります。問題を避けるために、コピーをする際には、Gamedeep copy(すなわち参照先を切り離したコピー)するcopy_obj関数を使用してください。

# G1を作成する
x <- 1
G1 <- Game(State(x))

# copy_objを用いてコピーする
G2 <- copy_obj(G1)

# G2のxを2にする
G2$x <- 2

# G1$xは元のまま1
G1$x
[1] 1