library(pak)
pak::pak("KeiichiSatoh/rABM")1. Quick Start Guide
1.1 rABMのインストール
(1) rABMのダウンロード
rABMは、この文書の執筆時点(2026年3月)では、佐藤圭一(一橋大学)のGitHubリポジトリからダウンロードすることで利用できます(今後CRANにも投稿予定です)。
はじめに、ダウンロード用のパッケージである`pak`パッケージを自身のRにインストールします(すでにインストール済みの場合、この手順は省略できます)。
(2) rABMの読み込み
使用時には毎回rABMを読み込みます。
library(rABM)1.2 rABMの使用の基礎
rABMを用いたシミュレーションの実行は、以下の3つのステップからなると理解できます。
エージェントの状態と、その更新を行うためのオブジェクトを設定する
それらのオブジェクトをGameオブジェクトに格納する
シミュレーションを実行する
ただし、ステップ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オブジェクトに格納する
次にageとget_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)
結果が保存されたオブジェクトG2のageフィールドを確認します。
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オブジェクトのコピーについて
rABMのGameオブジェクトは、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ユーザーにとって直感に反するものとなります。問題を避けるために、コピーをする際には、Gameをdeep 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