教科書掲載のRコードをRstudioで動かそうとすると、不正な文字列を指摘されてしまう。
一般書籍の文中及びgithubサポートページにに掲載のある、
Rコードが、動きません。
不正な文字列を指摘されるのですが、指摘された行は、
コメントアウト済みで、なぜ動かないのかが、分かりません。
ファイルの内容は、一切書き換えていません。
途方に暮れています・・・。
本当に簡単な操作で、動くようになると思うので、
原因がお分かりになられる方がいらっしゃったら、
お力添え頂けますと幸いです。
何卒、宜しくお願い致します。
*なお、書籍は片平健太郎著「行動データの計算モデリング 強化学習を例として」で、
コードはchapter2のQ学習モデルのものになります。
発生している問題・エラーメッセージ
エラー: 構文解析中に不正なマルチバイト文字列がありました (14 行) > } エラー: 予想外の '}' です in " }"
該当のソースコード
R
1# ----------------------------------------------------- # 2# Q学習モデルのシミュレーションにより選択データを生成し, 3# そのデータから最尤推定をする。 4# ----------------------------------------------------- # 5 6# メモリ,グラフのクリア 7rm(list=ls()) 8graphics.off() 9 10# 描画のためのライブラリ読み込み 11library(tidyverse) 12library(gridExtra) 13 14# 乱数のシードの設定 15set.seed(141) 16 17# Q学習モデルのシミュレーションによるデータ生成 ------------------------------------------------- 18 19# 試行数 20T <- 80 21 22# Q 値の初期化( 選択肢の数x T) 23Q <- matrix(numeric(2*T), nrow=2, ncol=T) 24 25c <- numeric(T) 26r <- numeric(T) 27pA <- numeric(T) 28 29alpha <- 0.3 # 学習率 30beta <- 2.0 # 逆温度 31 32# それぞれの選択肢の報酬確率 33pr <- c(0.7,0.3) 34 35for (t in 1:T) { 36 37 # ソフトマックスで選択肢A の選択確率を決定する 38 pA[t] <- 1/(1+exp(-beta*(Q[1,t]-Q[2,t]))) 39 40 if (runif(1,0,1) < pA[t]) { 41 # Aを選択 42 c[t]<-1 43 r[t] <- as.numeric(runif(1,0,1) < pr[1]) 44 } else { 45 # Bを選択 46 c[t] <- 2 47 r[t] <- as.numeric(runif(1,0,1) < pr[2]) 48 } 49 50 # 行動価値の更新 51 if (t < T) { 52 53 Q[c[t],t+1] <- Q[c[t],t] + alpha * (r[t] - Q[c[t],t] ) 54 55 # 選択肢していない行動の価値はそのままの値を次の時刻に引き継ぐ。 56 # 3-c でc=1 なら2, c=2 なら1, というように 57 # 逆側の選択肢のインデックスが求まる。 58 Q[3-c[t],t+1] <- Q[3-c[t],t] 59 } 60} 61 62# フィットするモデルの設定 ------------------------------------------------------------ 63 64# Q-learning 65func_qlearning <- function(param, choice, reward) 66{ 67 T <- length(choice) 68 alpha <- param[1] 69 beta <- param[2] 70 71 # 短い名前の変数に持ち替える 72 c <- choice 73 r <- reward 74 75 pA <- numeric(T) 76 77 # Q 値の初期化( 選択肢の数x T) 78 Q <- matrix(numeric(2*T), nrow=2, ncol=T) 79 80 # 対数尤度を格納する変数 81 ll <- 0 82 83 for (t in 1:T) { 84 85 # ソフトマックスで選択肢A の選択確率を決定する 86 pA[t] <- 1/(1+exp(-beta * (Q[1,t]-Q[2,t]))) 87 88 # 試行tの対数尤度は実際の選択がA (c=1) であれば log(pA[t]), 89 # B (c=2) であればlog(1 - pA[t]) となる 90 ll <- ll + (c[t]==1) * log(pA[t]) + (c[t]==2) * log(1-pA[t]) 91 92 # 行動価値の更新 93 if (t < T) { 94 95 Q[c[t],t+1] <- Q[c[t],t] + alpha * (r[t] - Q[c[t],t] ) 96 97 # 選択肢していない行動の価値はそのままの値を次の時刻に引き継ぐ 98 Q[3-c[t],t+1] <- Q[3-c[t],t] 99 } 100 } 101 return(list(negll = -ll,Q = Q, pA = pA)) 102} 103 104# 最適化により最小化する負の対数尤度を返すラッパー関数 105func_minimize <- function(modelfunc, param, choice, reward) 106{ 107 ret <- modelfunc(param, choice, reward) 108 109 # 負の対数尤度のみ返す 110 return(ret$negll) 111} 112 113# 非線形最適化による最尤推定 ----------------------------------------------------------- 114 115# 負の対数尤度の最小値を格納する変数 (最初は無限大にしておく) 116fvalmin <- Inf 117 118for (idx in 1:10) { 119 120 # 初期値を一様乱数から決める 121 initparam <- runif(2, 0, 1.0) 122 123 # 最適化の実行 124 res <- optim(initparam, func_minimize, 125 hessian = TRUE, 126 modelfunc = func_qlearning, 127 choice=c, reward=r) 128 129 # 今までの解より負の対数尤度が小さかったらその結果を採用する 130 if (res$value < fvalmin) { 131 paramest <- res$par 132 fvalmin <- res$value 133 } 134} 135 136print(sprintf("alpha - True value: %.2f, Estimated value: %.2f", alpha, paramest[1])) 137print(sprintf("beta - True value: %.2f, Estimated value: %.2f", beta, paramest[2])) 138print(sprintf("Model 1: log-likelihood: %.2f, AIC: %.2f", -fvalmin, 2*fvalmin + 2*2)) 139 140# 求めた最尤推定値をもとに,行動価値や選択確率のP(a=A)を改めて計算する 141ret <- func_qlearning(paramest, choice=c, reward=r) 142Qest <- ret$Q 143pAest <- ret$pA 144 145# 結果の描画 ------------------------------------------------------------------- 146 147# プロットする最大試行数 (50にすると本文の図のように50試行までをプロット) 148maxtrial <- Inf 149ggplot() + theme_set(theme_bw(base_size = 18)) 150 151x11() 152gQ <- list() 153 154# データフレームに格納 155df <- data.frame(trials = 1:T, 156 Q1est = Qest[1,], 157 Q2est = Qest[2,], 158 Q1 = Q[1,], 159 Q2 = Q[2,], 160 c = c, 161 r = as.factor(r), 162 pA = pA, 163 pAest = pAest) 164 165dfplot <- df %>% filter(trials <= maxtrial) 166 167# Q(A) の図の作成 168idxc <- 1 169g_qvalues <- ggplot(dfplot, aes(x = trials, y = Q1)) + 170 geom_line(aes(y = Q1), linetype = 1, size=1.2) + 171 geom_line(aes(y = Q1est), linetype = 5, size=1.0) + 172 geom_point(data = dfplot %>% filter(c==idxc & r == 1), 173 aes(x = trials, y = 1.12), shape = 25, size = 1.5) + 174 scale_y_continuous(breaks=c(0, 0.5, 1.0), labels = c(0,0.5,1)) + 175 geom_linerange(data = dfplot %>% filter(c==idxc), 176 aes( 177 x = trials, 178 ymin = 1.0, 179 ymax = 1.06), 180 size=1) + 181 theme(legend.position = "none") + 182 xlab("試行") + 183 ylab("Q(A)") 184 185gQ[[idxc]] <- g_qvalues 186 187# Q(B) の図の作成 188idxc <- 2 189g_qvalues <- ggplot(dfplot, aes(x = trials, y = Q2)) + 190 geom_line(aes(y = Q2), linetype = 1, size=1.2) + 191 geom_line(aes(y = Q2est), linetype = 5, size=1.0) + 192 geom_point(data = dfplot %>% filter(c==idxc & r == 1), 193 aes(x = trials, y = 1.12), shape = 25, size = 1.5) + 194 geom_linerange(data = dfplot %>% filter(c==idxc), 195 aes( 196 x = trials, 197 ymin = 1.0, 198 ymax = 1.06), 199 size=1) + 200 theme(legend.position = "none") + 201 scale_y_continuous(breaks=c(0, 0.5, 1.0), labels = c(0,0.5,1)) + 202 xlab("試行") + 203 ylab("Q(B)") 204 205gQ[[idxc]] <- g_qvalues 206 207# P(a=A) の図の作成 208g_pA <- ggplot(dfplot, aes(x = trials, y = pA)) + 209 xlab("試行") + 210 ylab("P(a = A)") + 211 geom_line(aes(y = pA), linetype = 1, size=1.2) + 212 geom_line(aes(y = pAest), linetype = 2, size=1.0) + 213 geom_point(data = dfplot %>% filter(c==1 & r == 1), 214 aes(x = trials, y = 1.12), shape = 25, size = 1.5) + 215 geom_point(data = dfplot %>% filter(c==2 & r == 1), 216 aes(x = trials, y = -0.12), shape = 2, size = 1.5) + 217 theme(legend.position = "none") + 218 geom_linerange(data = dfplot %>% filter(c==1), 219 aes( 220 x = trials, 221 ymin = 1.0, 222 ymax = 1.05), 223 size=1) + 224 scale_y_continuous(breaks=c(0, 0.5, 1.0), labels = c(0,0.5,1)) + 225 geom_linerange(data = dfplot %>% filter(c==2), 226 aes( 227 x = trials, 228 ymin = -0.05, 229 ymax = 0.0), 230 size=1) + 231 geom_path(size = 1.2) 232 233grid.arrange(gQ[[1]], gQ[[2]],g_pA, nrow=3) 234 235# 図を保存する場合は以下を実行 236# g <- arrangeGrob(gQ[[1]], gQ[[2]], g_pA, nrow=3) 237# ggsave(file="./figs/qlarning_fit.eps", g) 238 239
試したこと
pr <- c(0.7,0.3)
までは、問題なく動きます。
その次のfor文ですが、中身のif文は、それぞれ全て、ちゃんと動くものの、
for文全体を動かそうとすると、
コメントアウト済の文が
不正な文字列であると指摘されます。、
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/05/13 14:21
2021/05/13 15:40