ポリヤ・エッゲンベルガー分布への適合度の検定     Last modified: Jan 09, 2015

目的

ポリヤ・エッゲンベルガー分布への適合度の検定を行う

使用法

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

引数

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

ソース

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

# ポリヤ・エッゲンベルガー分布への適合度の検定
PolyaEggenbergerdist <- function(d,             # 度数ベクトル
                                 x=NULL)        # 階級値ベクトル
{
  PolyaEggenberger2 <- function(x,              # 確率変数
                                lambda,         # λ = n*p
                                r)              # r = n*δ
  {
    exp(                                        # 対数で計算して最後に逆対数をとる
      sum(sapply(0:(x-1), function(i) ifelse(i < 0, 0, log(1+i*r/lambda))))
      +x*log(lambda)
      -lgamma(x+1)
      +(-lambda/r-x)*log(1+r)
    )
  }
#===
  if (is.null(x)) {
    stop("関数の仕様が変更されました。度数ベクトルと同じ長さの階級値ベクトルも指定してください。")
  }
  if (length(x) != length(d)) {
    stop("度数ベクトル階級値ベクトルの長さは同じでなければなりません。")
  }
  data.name <- paste(deparse(substitute(d)), deparse(substitute(x)), sep=", ")
  method <- "ポリヤ・エッゲンベルガー分布への適合度の検定"

  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                          # 平均値(=λ)
  r <- sum(o*(x-lambda)^2)/n/lambda-1           # パラメータ r
  p <- sapply(x, PolyaEggenberger2, lambda, r)  # 確率
  if (min(x) != 0) {                            # 最初と最後の階級値の確率は階級値以下・以上の確率を併合する
    p[1] = sum(sapply(0:min(x), PolyaEggenberger2, lambda, r))
  }
  p[k] <- 1-sum(p[-k])                          # 最後の確率は合計が 1 になるように
  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-3                                     # 自由度
  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, r=r), method=method,
    data.name=data.name, table=table), class=c("htest", "PolyaEggenbergerdist")))
}
# summary メソッド
summary.PolyaEggenbergerdist <- function(obj,   # PolyaEggenbergerdist が返すオブジェクト
                                         digits=5)
{
  table <- obj$table
  colnames(table) <- c("階級", "度数", "確率", "期待値")
  cat("\n適合度\n\n")
  print(table, digits=digits, row.names=FALSE)
}
# plot メソッド
plot.PolyaEggenbergerdist <- function(obj,      # PolyaEggenbergerdist が返すオブジェクト
                                      ...)      # barplot へ渡す引数
{
  table <- obj$table
  nr <- nrow(table)
  pos <- barplot(table$o, space=0, ...)         # 観察度数を barplot で描く
  old <- par(xpd=TRUE)
  points(pos, table$e, pch=3)                   # 理論度数を,記号 + で示す
  text(pos, -strheight("H"), table$x)
  par(old)
}


使用例

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

	ポリヤ・エッゲンベルガー分布への適合度の検定

data:  d, x
X-squared = 0.6248, df = 8, p-value = 0.9997
sample estimates:
          n      lambda           r 
365.0000000   2.9917808   0.2682924 

> summary(a)

適合度

 階級 度数      確率  期待値
    0   27 0.0706286 25.7794
    1   61 0.1666061 60.8112
    2   77 0.2141257 78.1559
    3   71 0.1985646 72.4761
    4   54 0.1486017 54.2396
    5   35 0.0952554 34.7682
    6   20 0.0542416 19.7982
    7   11 0.0281137 10.2615
    8    6 0.0134934  4.9251
    9    2 0.0060738  2.2170
   10    1 0.0042954  1.5678

> plot(a)

fig

> d <- c(1, 1, 3, 12, 27, 42, 63, 80, 108, 129, 108, 106, 87, 79, 45, 42, 31, 18, 8, 5, 1, 1, 2, 1)
> x <- 3:26
> (a <- PolyaEggenbergerdist(d, x))
ポリヤ・エッゲンベルガー分布への適合度の検定

データ:  d, x 
カイ二乗値 = 12.963, 自由度 = 19, P値 = 0.8405
標本推定値: 
            n        lambda             r 
1000.00000000   13.05000000   -0.09597701 

> summary(a)

適合度

 階級 度数       確率    期待値
    3    1 0.00067063   0.67063
    4    1 0.00190503   1.90503
    5    3 0.00533821   5.33821
    6   12 0.01237099  12.37099
    7   27 0.02438582  24.38582
    8   42 0.04173726  41.73726
    9   63 0.06300537  63.00537
   10   80 0.08493108  84.93108
   11  108 0.10325927 103.25927
   12  129 0.11416725 114.16725
   13  108 0.11558534 115.58534
   14  106 0.10778587 107.78587
   15   87 0.09304897  93.04897
   16   79 0.07468910  74.68910
   17   45 0.05595887  55.95887
   18   42 0.03926647  39.26647
   19   31 0.02588379  25.88379
   20   18 0.01607164  16.07164
   21    8 0.00942268   9.42268
   22    5 0.00522787   5.22787
   23    1 0.00275027   2.75027
   24    1 0.00137441   1.37441
   25    2 0.00065353   0.65353
   26    1 0.00051028   0.51028

・ 解説ページ


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

Made with Macintosh