標準の関数がないとお嘆きの方々が,たどり着いたページに
$\displaystyle \sqrt[n]{\prod_{i=1}^{n} x_i}$
に基づいて
prod(x)^(1/length(x))
あるいは,ひどいものだと
max(cumprod(x))^(1/length(x))
なんて書いてあったら,そのまま信じちゃいけない。
以下の実験は,平均値=100,標準偏差=5 の正規乱数を発生させて,幾何平均を求めるもの。
まずは,サンプルサイズ 100 の場合。
いずれも正しい答えを出している。
> set.seed(123)
> n = 10
> x = rnorm(n, 100, 5)
> prod(x)^(1/length(x))
[1] 100.2728276899091
> max(cumprod(x))^(1/length(x))
[1] 100.2728276899091
> exp(mean(log(x)))
[1] 100.272827689909
サンプルサイズ 160 くらいになると,前二者は突然発狂する。
> set.seed(123)
> n = 160
> x = rnorm(n, 100, 5)
> prod(x)^(1/length(x))
[1] Inf
> max(cumprod(x))^(1/length(x))
[1] Inf
> exp(mean(log(x)))
[1] 99.81754279797046
教訓:教科書の定義式をそのままプログラムしてはいけない。