BASICのMCMCおよびベイジアン統計

BASICは最も一般的なプログラミング言語の1つでした。 80年代にはコンピューター上の標準的なプログラムセット(たとえばCommodore 64やApple II)を歩き、90年代にはDOSとWindows 95の両方にQBasic IDEが含まれていました。



QBasicは私の最初のプログラミング言語でもありました。 私はBASICで20年近くプログラミングしていないので、この本当に奇妙な言語を思い出すことにしました。 ベイジアンアルゴリズムに多くの時間を費やしたので、20年前にベイジアン分析がユーティリティでどのように見えるかを見るのは面白いと思いました。



画像





ここでは、BASICのベイジアンモデルで使用される標準のモンテカルロマルコフ連鎖法(MCMC)であるMetropolis-Hastingsアルゴリズムを実装します。



ラプラス分布を最も魅力的なデータセットに適用しました。パックあたりのカブの数です。 サンプルは16の学校で構成されていました。 その結果、BASIC( source )を使用して、結果を計算して推測しました。



画像



BASICの入手先



BASICにはさまざまなバージョンがありますが、私は育ったMicrosoft QBasic 1.1を使いました。 QBasicには、ユーザー定義型や(注意!)関数など、多くの高度な機能があります。 しかし、小文字の番号付けとGOTOを使用して旧式のBASICを作成するため、追加の設定は使用しませんでした。つまり、Commodore 64 BASICなどにコードを簡単にインポートできます。



こちらから QBasicをダウンロードしてください 。 また、無料です。 もちろん、まだDOSを使用しているのでなければ、次のステップはDOSBoxエミュレーターをインストールすることです。 QBASIC.EXEを実行すると、非常にわかりやすい明るい青色のインターフェイスが表示されます。 カスタムスクリプトを使用してテストできます。 彼は画面をクリアし、「HELLO WORLD」を印刷します。



画像



QBasicの行番号付けはそれほど重要ではありませんが、プログラムが順番に実行されるため、古いBASIC(たとえばCommodore 64上にある)では必要です。



実装するもの



ベイジアンモデルの計算方法を学習する場合、最初に遭遇する古典的なMCMCにMetropolis-Hastingsアルゴリズムを実装します。



提示するベイジアンモデルには、単純な1次元ラプラス分布があります(ガウス分布にブレークを与えるためです)。 ラプラス分布は、ガウス分布と同様に、もちろん対称ですが、より鋭いピークと浅いテールを持っています。



これには2つのパラメーターがあります。シフトパラメーターμは平均値を決定し、 中央値と範囲bは分布の幅を決定します。



画像



ラプラス分布では、中央値はパラメーターμの最大確率推定値です。 これを最も単純なベイジアンモデルに含めるには、2つのパラメーターが必要です。 ここで、Uniform(−∞、∞)をμとlog(b)に簡単に適用します。これは、P(μ)、P(log(b))∝1です。 フルモデル:



x∼ラプラス(μ、b)

μ∼均一(−∞、∞)

log(b)〜均一(−∞、∞)



繰り返しますが、使用するデータはおそらく私が使用した中で最もかわいいデータです。 16個のオオカミパックのサンプルに含まれるカブの数が含まれています(ソース)。



画像



Rでの実装



BASICを掘り下げる前に、Rですべてを実装します。



#     x <- c(5, 8, 7, 5, 3, 4, 3, 9, 5, 8, 5, 6, 5, 6, 4, 7) # The log posterior density of the Laplace distribution model, when assuming # uniform/flat priors. The Laplace distribution is not part of base R but is # available in the VGAM package. model <- function(pars) { sum(VGAM::dlaplace(x, pars[1], exp(pars[2]), log = TRUE)) } # The Metropolis-Hastings algorithm using a Uniform(-0.5, 0.5) proposal distribution metrop <- function(n_samples, model, inits) { samples <- matrix(NA, nrow = n_samples, ncol = length(inits)) samples[1,] <- inits for(i in 2:n_samples) { curr_log_dens <- model(samples[i - 1, ]) proposal <- samples[i - 1, ] + runif(length(inits), -0.5, 0.5) proposal_log_dens <- model(proposal) if(runif(1) < exp(proposal_log_dens - curr_log_dens)) { samples[i, ] <- proposal } else { samples[i, ] <- samples[i - 1, ] } } samples } samples <- metrop(n_samples = 1000, model, inits = c(0,0)) # Plotting a traceplot plot(samples[,1], type = "l", ylab = expression(Location ~ mu), col = "blue") # Calculating median posterior and 95% CI discarding the first 250 draws as "burnin". quantile(samples[250:1000,1], c(0.025, 0.5, 0.975))
      
      







画像



 ## 2.5% 50% 97.5% ## 4.489 5.184 6.144
      
      





(このスクリプトは、BASICで何が起こるべきかを示しています。RのMCMCでMetropolis-Hastingsメソッドを試したい場合は、 MCMCpackパッケージMCMCmetrop1RまたはこのMetropolis-Hastingsスクリプトを使用します



BASICのモデル



画面をクリアすることから始めましょう( CLS





CLS





)および変数の定義。 DIM





配列と行列を定義します。



画像



この短いコードでも、奇妙なものがたくさんあります。



モデルの定義を継続します。 式RETURN





で終わるサブルーチンとして提示します RETURN





GOSUB





式によって呼び出されますGOSUB





GOSUB





,

, RETURN





, GOSUB.





-, . , . , . , PARAMS!





LOGDENS!.





READ X!,





DATA





RESTORE





READ.









画像



-. , GOSUB 520,





520. RND,





0 1.



画像





:



画像



SAMPLES!





, 95 .



画像



: PRINT "HELLO", "YOU!" HELLO YOU!, PRINT "HELLO"; "YOU!" HELLOYOU! "," ";" .



, , . , . , 320 x 200. : LINE (, )-(, ).





画像



:



画像





, .



画像



GOTO





, . 33 MHz, 386 ( ), , . :



画像

画像





, , 4-5 6. , BASIC R :



画像



( MCMCDEMO.BAS ),





, 20 . GOTO





GOSUB





- . ( END IF





NEXT I.





) 386 . , .












,

, RETURN





, GOSUB.





-, . , . , . , PARAMS!





LOGDENS!.





READ X!,





DATA





RESTORE





READ.









画像



-. , GOSUB 520,





520. RND,





0 1.



画像





:



画像



SAMPLES!





, 95 .



画像



: PRINT "HELLO", "YOU!" HELLO YOU!, PRINT "HELLO"; "YOU!" HELLOYOU! "," ";" .



, , . , . , 320 x 200. : LINE (, )-(, ).





画像



:



画像





, .



画像



GOTO





, . 33 MHz, 386 ( ), , . :



画像

画像





, , 4-5 6. , BASIC R :



画像



( MCMCDEMO.BAS ),





, 20 . GOTO





GOSUB





- . ( END IF





NEXT I.





) 386 . , .












,

, RETURN





, GOSUB.





-, . , . , . , PARAMS!





LOGDENS!.





READ X!,





DATA





RESTORE





READ.









画像



-. , GOSUB 520,





520. RND,





0 1.



画像





:



画像



SAMPLES!





, 95 .



画像



: PRINT "HELLO", "YOU!" HELLO YOU!, PRINT "HELLO"; "YOU!" HELLOYOU! "," ";" .



, , . , . , 320 x 200. : LINE (, )-(, ).





画像



:



画像





, .



画像



GOTO





, . 33 MHz, 386 ( ), , . :



画像

画像





, , 4-5 6. , BASIC R :



画像



( MCMCDEMO.BAS ),





, 20 . GOTO





GOSUB





- . ( END IF





NEXT I.





) 386 . , .












,

, RETURN





, GOSUB.





-, . , . , . , PARAMS!





LOGDENS!.





READ X!,





DATA





RESTORE





READ.









画像



-. , GOSUB 520,





520. RND,





0 1.



画像





:



画像



SAMPLES!





, 95 .



画像



: PRINT "HELLO", "YOU!" HELLO YOU!, PRINT "HELLO"; "YOU!" HELLOYOU! "," ";" .



, , . , . , 320 x 200. : LINE (, )-(, ).





画像



:



画像





, .



画像



GOTO

, . 33 MHz, 386 ( ), , . :



画像

画像





, , 4-5 6. , BASIC R :



画像



( MCMCDEMO.BAS ),





, 20 . GOTO





GOSUB





- . ( END IF





NEXT I.





) 386 . , .
















,

, RETURN





, GOSUB.





-, . , . , . , PARAMS!





LOGDENS!.





READ X!,





DATA





RESTORE





READ.









画像



-. , GOSUB 520,





520. RND,





0 1.



画像





:



画像



SAMPLES!





, 95 .



画像



: PRINT "HELLO", "YOU!" HELLO YOU!, PRINT "HELLO"; "YOU!" HELLOYOU! "," ";" .



, , . , . , 320 x 200. : LINE (, )-(, ).





画像



:



画像





, .



画像



GOTO





, . 33 MHz, 386 ( ), , . :



画像

画像





, , 4-5 6. , BASIC R :



画像



( MCMCDEMO.BAS ),





, 20 . GOTO





GOSUB





- . ( END IF





NEXT I.





) 386 . , .












,

, RETURN





, GOSUB.





-, . , . , . , PARAMS!





LOGDENS!.





READ X!,





DATA





RESTORE





READ.









画像



-. , GOSUB 520,





520. RND,





0 1.



画像





:



画像



SAMPLES!





, 95 .



画像



: PRINT "HELLO", "YOU!" HELLO YOU!, PRINT "HELLO"; "YOU!" HELLOYOU! "," ";" .



, , . , . , 320 x 200. : LINE (, )-(, ).





画像



:



画像





, .



画像



GOTO





, . 33 MHz, 386 ( ), , . :



画像

画像





, , 4-5 6. , BASIC R :



画像



( MCMCDEMO.BAS ),





, 20 . GOTO





GOSUB





- . ( END IF





NEXT I.





) 386 . , .












,

, RETURN





, GOSUB.





-, . , . , . , PARAMS!





LOGDENS!.





READ X!,





DATA





RESTORE





READ.









画像



-. , GOSUB 520,





520. RND,





0 1.



画像





:



画像



SAMPLES!





, 95 .



画像



: PRINT "HELLO", "YOU!" HELLO YOU!, PRINT "HELLO"; "YOU!" HELLOYOU! "," ";" .



, , . , . , 320 x 200. : LINE (, )-(, ).





画像



:



画像





, .



画像



GOTO





, . 33 MHz, 386 ( ), , . :



画像

画像





, , 4-5 6. , BASIC R :



画像



( MCMCDEMO.BAS ),





, 20 . GOTO





GOSUB





- . ( END IF





NEXT I.





) 386 . , .












,

, RETURN





, GOSUB.





-, . , . , . , PARAMS!





LOGDENS!.





READ X!,





DATA





RESTORE





READ.









画像



-. , GOSUB 520,





520. RND,





0 1.



画像





:



画像



SAMPLES!





, 95 .



画像



: PRINT "HELLO", "YOU!" HELLO YOU!, PRINT "HELLO"; "YOU!" HELLOYOU! "," ";" .



, , . , . , 320 x 200. : LINE (, )-(, ).





画像



:



画像





, .



画像



GOTO





, . 33 MHz, 386 ( ), , . :



画像

画像





, , 4-5 6. , BASIC R :



画像



( MCMCDEMO.BAS ),





, 20 . GOTO





GOSUB





- . ( END IF





NEXT I.





) 386 . , .












,

, RETURN





, GOSUB.





-, . , . , . , PARAMS!





LOGDENS!.





READ X!,





DATA





RESTORE





READ.









画像



-. , GOSUB 520,





520. RND,





0 1.



画像





:



画像



SAMPLES!





, 95 .



画像



: PRINT "HELLO", "YOU!" HELLO YOU!, PRINT "HELLO"; "YOU!" HELLOYOU! "," ";" .



, , . , . , 320 x 200. : LINE (, )-(, ).





画像



:



画像





, .



画像



GOTO





, . 33 MHz, 386 ( ), , . :



画像

画像





, , 4-5 6. , BASIC R :



画像



( MCMCDEMO.BAS ),





, 20 . GOTO





GOSUB





- . ( END IF





NEXT I.





) 386 . , .












  1. ,

    , RETURN





    , GOSUB.





    -, . , . , . , PARAMS!





    LOGDENS!.





    READ X!,





    DATA





    RESTORE





    READ.









    画像



    -. , GOSUB 520,





    520. RND,





    0 1.



    画像





    :



    画像



    SAMPLES!





    , 95 .



    画像



    : PRINT "HELLO", "YOU!" HELLO YOU!, PRINT "HELLO"; "YOU!" HELLOYOU! "," ";" .



    , , . , . , 320 x 200. : LINE (, )-(, ).





    画像



    :



    画像





    , .



    画像



    GOTO





    , . 33 MHz, 386 ( ), , . :



    画像

    画像





    , , 4-5 6. , BASIC R :



    画像



    ( MCMCDEMO.BAS ),





    , 20 . GOTO





    GOSUB





    - . ( END IF





    NEXT I.





    ) 386 . , .












  2. ,

    , RETURN





    , GOSUB.





    -, . , . , . , PARAMS!





    LOGDENS!.





    READ X!,





    DATA





    RESTORE





    READ.









    画像



    -. , GOSUB 520,





    520. RND,





    0 1.



    画像





    :



    画像



    SAMPLES!





    , 95 .



    画像



    : PRINT "HELLO", "YOU!" HELLO YOU!, PRINT "HELLO"; "YOU!" HELLOYOU! "," ";" .



    , , . , . , 320 x 200. : LINE (, )-(, ).





    画像



    :



    画像





    , .



    画像



    GOTO





    , . 33 MHz, 386 ( ), , . :



    画像

    画像





    , , 4-5 6. , BASIC R :



    画像



    ( MCMCDEMO.BAS ),





    , 20 . GOTO





    GOSUB





    - . ( END IF





    NEXT I.





    ) 386 . , .












  3. ,

    , RETURN





    , GOSUB.





    -, . , . , . , PARAMS!





    LOGDENS!.





    READ X!,





    DATA





    RESTORE





    READ.









    画像



    -. , GOSUB 520,





    520. RND,





    0 1.



    画像





    :



    画像



    SAMPLES!





    , 95 .



    画像



    : PRINT "HELLO", "YOU!" HELLO YOU!, PRINT "HELLO"; "YOU!" HELLOYOU! "," ";" .



    , , . , . , 320 x 200. : LINE (, )-(, ).





    画像



    :



    画像





    , .



    画像



    GOTO





    , . 33 MHz, 386 ( ), , . :



    画像

    画像





    , , 4-5 6. , BASIC R :



    画像



    ( MCMCDEMO.BAS ),





    , 20 . GOTO





    GOSUB





    - . ( END IF





    NEXT I.





    ) 386 . , .












  4. ,

    , RETURN





    , GOSUB.





    -, . , . , . , PARAMS!





    LOGDENS!.





    READ X!,





    DATA





    RESTORE





    READ.









    画像



    -. , GOSUB 520,





    520. RND,





    0 1.



    画像





    :



    画像



    SAMPLES!





    , 95 .



    画像



    : PRINT "HELLO", "YOU!" HELLO YOU!, PRINT "HELLO"; "YOU!" HELLOYOU! "," ";" .



    , , . , . , 320 x 200. : LINE (, )-(, ).





    画像



    :



    画像





    , .



    画像



    GOTO





    , . 33 MHz, 386 ( ), , . :



    画像

    画像





    , , 4-5 6. , BASIC R :



    画像



    ( MCMCDEMO.BAS ),





    , 20 . GOTO





    GOSUB





    - . ( END IF





    NEXT I.





    ) 386 . , .












  5. ,

    , RETURN





    , GOSUB.





    -, . , . , . , PARAMS!





    LOGDENS!.





    READ X!,





    DATA





    RESTORE





    READ.









    画像



    -. , GOSUB 520,





    520. RND,





    0 1.



    画像





    :



    画像



    SAMPLES!





    , 95 .



    画像



    : PRINT "HELLO", "YOU!" HELLO YOU!, PRINT "HELLO"; "YOU!" HELLOYOU! "," ";" .



    , , . , . , 320 x 200. : LINE (, )-(, ).





    画像



    :



    画像





    , .



    画像



    GOTO





    , . 33 MHz, 386 ( ), , . :



    画像

    画像





    , , 4-5 6. , BASIC R :



    画像



    ( MCMCDEMO.BAS ),





    , 20 . GOTO





    GOSUB





    - . ( END IF





    NEXT I.





    ) 386 . , .















All Articles