crosshyou

主にクロス表(分割表)分析をしようかなと思いはじめましたが、あまりクロス表の分析はできず。R言語の練習ブログになっています。

HistDataパッケージのJevons

Photo by Setu Chhaya on Unsplash 

HistDataパッケージのJevonsというデータは、1871年のNatureという雑誌に掲載されたW. Stanley Jevonsの実験のデータです。

黒いビーズを複数個、パッと見せて、何個だったか答えさせるという実験です。人間が一度に認識できる数がどのくらいか、というのを調べる実験です。一般に7個前後、と言われていますね。

早速データを見てみます。

actual が実際のビーズの数、estimatedが答えた数、frequencyは度数、errorは誤差ですね。

一番始めの行は、actual:3, estimated:3, frquency:23, error:0 なので、実際のビーズが3のとき、3と答えたのが23回あって、誤差は0だった、という意味です。

ヘルプのコードを実行していきましょう。

はじめは、xtabs()関数で表を作っています。

ビーズが、3つ、4つのときは全部正解していますが、5つのときは102回正解で、5回間違っていますね。15個のときは正解は2回で9回間違っています。

次のヘルプのコードは、サンフラワープロット、sunflowerplot()関数です。

lm()関数で回帰直線モデルを作って、abline()関数でその直線を描いています。

次は、gplotパッケージのbaloonplot()関数を使っています。

そして、最後は、平均の誤差をグラフにしています。

reshapeパッケージのuntable()関数でfrequencyの数だけ実際の観測を作って、テーブルのデータを生データにしています。例えば、actual:3, estimated:3はfrequencyが23でしたので、actual:3, frequency:3の行を23行作っています。

そして、plyrパッケージのddply()関数でactualごとのerrorの平均を計算して、plot()関数でグラフにしたようです。

reshapeパッケージやplyrパッケージを使わなくてもできそうな気がします。

やってみましょう。

rep()関数とデータフレームの行を指定する方法を応用してuntable()と同じことができますし、tapply()関数がddply()関数と同じことができました。

今回はこれでおしまいです。

以下が今回のコードです。

# 2022-05-01
# HIstData_Jevons
#
library(HistData)
data("Jevons")
str(Jevons)
#
# show as tables
xtabs(frequency ~ estimated + actual, data = Jevons, subset = NULL)
xtabs(frequency ~ error + actual, data = Jevons, subset = NULL)
#
# show an sunflowerplot with regression line
with(Jevons,
     sunflowerplot(actual, estimated, frequency,
                   main = "Jevons data on numerical estimation"))
Jmod <- lm(estimated ~ actual, data = Jevons, weights = frequency)
abline(Jmod, col = "green", lwd = 2, lty = 2)
#
# show as balloonplots
library(gplots)
with(Jevons,
     balloonplot(actual, estimated, frequency, xlab = "actual",
                 ylab = "estimated",
                 main = "Jevons data on numerical estimation: Errros 
                 Bubble are area propotional to frequency",
                 text.size = 0.8))
with(Jevons,
     balloonplot(actual, error, frequency, xlab = "actual",
                 ylab = "error",
                 main = "Jevons data on numerical estimation:
                 Errors  Bubble are propotional to frequency",
                 text.size = 0.8))
#
# plot average error
library(reshape)
unJevons <- untable(Jevons, Jevons$frequency)
str(unJevons)
str(Jevons)
library(plyr)
mean_error <- function(df) mean(df$error, na.rm = TRUE)
Jmean <- ddply(unJevons, .(actual), mean_error)
with(Jmean,
     plot(actual, V1, ylab = "Mean error", xlab = "Actual number",
          type = "b", main = "Jevons data"))
abline(h = 0, col = "red", lty = 2, lwd = 2)
#
# reshapeパッケージ、plyrパッケージを使わずに再現する
n <- nrow(Jevons) # Jevonsの行数
index <- rep(c(1:n), Jevons$frequency) # Jevonsのx番目の行を何回繰り返すか
Jevons2 <- Jevons[index, ] # untable()と同じことをしている
Jmean2 <- with(Jevons2, tapply(error, actual, mean, na.rm = TRUE)) # actual
# ごとのerrorの平均値を計算
plot(Jmean2, type = "b", pch = 16, col = "blue", cex = 2,
     xlab = "Actual number", ylab = "Mean error",
     main = "Jevons data") # グラフ作成
abline(h = 0, col = "red", lty = 2, lwd = 2) # 0の水平線を追加