草薙の研究ログ

英語の先生をやってます。

言語法則とベイズ的なカーブフィッティング

続きもので書いていたつもりだったのだけど,放置しすぎて前回からの更新間隔がえげつないことになってしまった。前回は,

Menzerath-Altmann法則をRのnls関数で - 草薙の研究ログ

っていう話だった。えっと,「ある言語学的単位の平均長(y)は,その構成要素の長さ(x)の関数である」っていう古典的な観察があって,具体的には,この関数,

(a)y = ax^{-b}e^{-cx}

に従うだろう,という話だ。これをMezerath-Altmann法則と呼ぶんだそう(Altmann, 1980)。こういう言語法則系は話がとってもシンプルでいい。
たとえば,こんなデータ(Altmann, 1980)。

Morpheme Length(Syllables) Syllable Length(Phonemes)
1 3.10
2 2.53
3 2.29
4 2.12
5 2.09


図にするとこんな感じ。確かに指数的減衰する関数ならフィットしそうだ。

f:id:kusanagik:20180104195751p:plain


普通に非線形最小二乗法でフィッティングしてもいいんだけど,世の中にはベイズ的なカーブフィッティングとかそういうのがあるそうで,RではFMEパッケージでそれができるんだそう。やってみよう。

これはメトロポリス法によって…とかそういう細かいところはぜんぶ置いといて(よくわからんし),まあこんな感じか。

#データ
s<-1:5
m<-c(3.1,2.53,2.29,2.12,2.09)

#モデルを書く
Model <- function(p, x) {
data.frame(x = x, 
N = p[1]*s^(-p[2])*exp(1)^(-p[3]*s))
}

Residuals <- function(p) {
(m - Model(p,s)$N)
}

#まずはパッケージの例通りにやってみる
P <- modFit(f = Residuals, p = c(0,0,0))
sP <- summary(P)
Covar <- sP$cov.scaled * 2.4^2/2
s2prior <- sP$modVariance

MCMC <- modMCMC(f = Residuals, 
p = P$par,jump = Covar,
niter = 5100,
var0 = s2prior,
wvar0 = NULL,
updatecov = 100,
burninlength=100)

#トレース図とMCMCの結果を可視化
par(mfrow=c(2,3))
title<-c("a","b","c")
for(i in 1:3){
plot(MCMC$par[,i],type="l",
xlab="Iteration",
ylab="",
main=title[i])
}

for(i in 1:3){
plot(density(MCMC$par[,i]),
type="n",
main=title[i])

polygon(density(MCMC$par[,i]),
col="gray98")
}


f:id:kusanagik:20180104201326p:plain

ほうほう。で,こんな感じになるというわけ。

f:id:kusanagik:20180104203102p:plain


Gabriel Altmann (1980). "Prolegomena to Menzerath's law". Glottometrika. 2: 1–10.