ポアソン分布への適合度の検定     Last modified: Jan 09, 2015

目的

ポアソン分布への適合度の検定を行う

使用法

poissondist(d, x)
summary.poissondist(obj, digits=5)
plot.poissondist(obj, ...)

引数

d       度数ベクトル
x       階級値ベクトル
obj     poissondist 関数が返すオブジェクト
digits  表示桁数
...     barplot に渡す引数

ソース

インストールは,以下の 1 行をコピーし,R コンソールにペーストする
source("http://aoki2.si.gunma-u.ac.jp/R/src/poissondist.R", encoding="euc-jp")

# ポアソン分布への適合度の検定
poissondist <- function(d,                 # 度数ベクトル
                        x=NULL)            # 階級値ベクトル
{
  if (is.null(x)) {
    stop("関数の仕様が変更されました。度数ベクトルと同じ長さの階級値ベクトルも指定してください。")
  }
  data.name <- paste(deparse(substitute(d)), deparse(substitute(x)), sep=", ")
  method <- "ポアソン分布への適合度の検定"
  k <- length(d)                           # 階級数
  if (length(x) != k) {
    stop("度数ベクトル階級値ベクトルの長さは同じでなければなりません。")
  }
        
  o <- numeric(diff(range(x))+1)
  o[x-min(x)+1] <- d
  x <- min(x):max(x)
        
  k <- length(o)                           # 階級数
  n <- sum(o)                              # データ数
  lambda <- sum(o*x)/n                     # 平均値(=λ)

  p <- dpois(x, lambda)                    # 確率
  p[1] <- ppois(min(x), lambda)            # 最初と最後の階級値の確率は階級値以下・以上の確率を併合する
  p[k] <- ppois(max(x)-1, lambda, lower.tail=FALSE)
  e <- n*p                                 # 期待値
  table <- data.frame(x, o, p, e)          # 結果をデータフレームにまとめる
  rownames(table) <- paste("c-", x, sep="")

  while (e[1] < 1) {                       # 1 未満のカテゴリーの併合
    o[2] <- o[2]+o[1]
    e[2] <- e[2]+e[1]
    o <- o[-1]
    e <- e[-1]
    k <- k-1
  }
  while (e[k] < 1) {                       # 1 未満のカテゴリーの併合
    o[k-1] <- o[k-1]+o[k]
    e[k-1] <- e[k-1]+e[k]
    o <- o[-k]
    e <- e[-k]
    k <- k-1
  }
  chisq <- sum((o-e)^2/e)                  # カイ二乗統計量
  df <- k-2                                # 自由度
  p <- pchisq(chisq, df, lower.tail=FALSE) # P 値
  names(chisq) <- "X-squared"
  names(df) <- "df"
  return(structure(list(statistic=chisq, parameter=df, p.value=p,
    estimate=c(n=n, lambda=lambda), method=method,
    data.name=data.name, table=table), class=c("htest", "poissondist")))
}
# summary メソッド
summary.poissondist <- function(obj,       # poissondist が返すオブジェクト
                                digits=5)
{
  table <- obj$table
  colnames(table) <- c("階級", "度数", "確率", "期待値")
  cat("\n適合度\n\n")
  print(table, digits=digits, row.names=FALSE)
}
# plot メソッド
plot.poissondist <- function(obj,          # poissondist が返すオブジェクト
                             ...)          # barplot へ渡す引数
{
  table <- obj$table
  nr <- nrow(table)
  posx <- barplot(table$o, space=0, ...)   # 観察度数を barplot で描く
  old <- par(xpd=TRUE)
  points(posx, table$e, pch=3)             # 理論度数を,記号 + で示す
  text(posx, -strheight("H"), table$x)
  par(old)
}


使用例

> d <- c(27, 61, 77, 71, 54, 35, 20, 11, 6, 2, 1)
> x <- 0:10
> (a <- poissondist(d, x))

	ポアソン分布への適合度の検定

data:  d, x
X-squared = 14.1437, df = 8, p-value = 0.0781
sample estimates:
         n     lambda 
365.000000   2.991781 

> summary(a)

適合度

 階級 度数      確率   期待値
    0   27 0.0501980 18.32226
    1   61 0.1501813 54.81618
    2   77 0.2246548 81.99899
    3   71 0.2240393 81.77434
    4   54 0.1675691 61.16272
    5   35 0.1002660 36.59709
    6   20 0.0499957 18.24841
    7   11 0.0213680  7.79932
    8    6 0.0079910  2.91673
    9    2 0.0026564  0.96958
   10    1 0.0010805  0.39437
 
> plot(a)

fig

> f <- c(1, 2, 8, 8, 10, 15, 12, 15, 12, 6, 3, 1, 2, 0, 1)
> x <- 1:15
> (a <- poissondist(f, x))

	ポアソン分布への適合度の検定

data:  f, x
X-squared = 5.2851, df = 11, p-value = 0.9166
sample estimates:
        n    lambda 
96.000000  6.864583 

・ 解説ページ


・ 直前のページへ戻る  ・ E-mail to Shigenobu AOKI

Made with Macintosh