<< トップページへ

<< 目次へ

最終更新日 : 2008.10.24

分布のプロット(正規分布、t分布、F分布、χ2分布)



 引数に"norm", "t", "chisq", "F"のいずれかを指定するだけで簡単に分布曲線が描かれます。描こうとする分布によっては、x軸の値が適当でないこともあるので、その場合は引数myself = TRUEとすることによって分布を描くための関数自体が返されます。

my.dist <- function(dist, myself="FALSE"){
        if(dist=="norm"){

                cat("正規分布には平均と標準偏差が必要です。", "\n")
                MEAN <- as.numeric(readline("Mean : "))
                SD <- as.numeric(readline("S.D. : "))
                my.norm <- function(x) dnorm(x, mean=MEAN, sd=SD)
                lower <- MEAN-4*SD
                upper <- MEAN+4*SD
                if(myself=="TRUE"){     #TRUEの場合は関数自体が返される。
                        my.norm
                }else{  #それ以外の場合は自動的にプロットされる。
                        plot(my.norm, xlim=c(lower, upper))
                        abline(h=0)
                }

        }else if(dist=="t"){

                cat("t分布には1つの自由度が必要です。", "\n")
                DF <- as.numeric(readline("DF : "))
                my.t <- function(x) dt(x, df=DF)
                lower <- qt(0.000001, DF)
                upper <- qt(0.999999, DF)
                if(myself=="TRUE"){
                        my.t
                }else{
                        plot(my.t, xlim=c(lower, upper))
                        abline(h=0)
                }

        }else if(dist=="F"){

                cat("F分布には2つの自由度が必要です。", "\n")
                DF1 <- as.numeric(readline("DF1 : "))
                DF2 <- as.numeric(readline("DF2 : "))
                my.F <- function(x) df(x, df1=DF1, df2=DF2)
                lower = qf(0.000001, DF1, DF2)
                upper = qf(0.9, DF1, DF2)
                if(myself=="TRUE"){
                        my.F
                }else{
                        plot(my.F, lower, upper)
                        abline(h=0)
                }

        }else if(dist=="chisq"){

                cat("カイ自乗分布には1つの自由度が必要です。", "\n")
                DF <- as.numeric(readline("DF : "))
                my.chisq <- function(x) dchisq(x, df=DF)
                lower <- qchisq(0.000001, DF)
                upper <- qchisq(0.9, DF)
                if(myself=="TRUE"){
                        my.chisq
                }else{
                        plot(my.chisq, lower, upper)
                        abline(h=0)
                }

        }else{
                cat("引数distに指定できるのはnorm, t, F, chisqのみです。", "\n")
        }
}

Example 1 正規分布を描く

# 平均20、標準偏差5の正規分布を描く
> my.dist("norm")
正規分布には平均と標準偏差が必要です。 
Mean : 20 # 平均値を入力してEnterを押します
S.D. : 5 # 標準偏差を入力してEnterを押します

# myself=TRUEとする場合(自分で描く場合):
> d <- my.dist("norm", myself=TRUE)
正規分布には平均と標準偏差が必要です。 
Mean : 20
S.D. : 5
> plot(d, 0, 40)

Example 2 t分布を描く

# 全てmy.dist()に任せる場合:
> my.dist("t")
t分布には1つの自由度が必要です。 
DF : 19

# 自分で描く場合:
> d <- my.dist("t", myself=TRUE)
t分布には1つの自由度が必要です。 
DF : 19
> plot(d, -4, 4)

Example 3 F分布を描く

# 全てmy.dist()に任せる場合:
> my.dist("F")
F分布には2つの自由度が必要です。 
DF1 : 3
DF2 : 12

# 自分で描く場合:
> d <- my.dist("F", myself=TRUE)
F分布には2つの自由度が必要です。 
DF1 : 3
DF2 : 12
> plot(d, 0, 5)

Example 4 χ2分布を描く

# 全てmy.dist()に任せる場合:
> my.dist("chisq")
カイ自乗分布には1つの自由度が必要です。 
DF : 19

# 自分で描く場合:
> d <- my.dist("chisq", myself=TRUE)
カイ自乗分布には1つの自由度が必要です。 
DF : 19
> plot(d, 4, 50)


■ どんな分布でも簡単に色塗りできる関数

my.paint <- function(f.name, x1, x2, color){
        xvals <- seq(x1, x2, length=50)
        dvals <- c(f.name(xvals), 0, 0)
        xvals <- c(xvals, x2, x1)
        polygon(xvals, dvals, col=color)
}

〜使い方〜

 例えば、自由度19のχ2分布において、20から30までの範囲を塗りつぶしてみる。

# 分布曲線を描くための関数をdに代入しておく
> d <- my.dist("chisq", myself=TRUE)
カイ自乗分布には1つの自由度が必要です。 
DF : 19

# 自由度19のカイ自乗分布を描く
> plot(d, 4, 50)

# 引数f.nameには関数が格納されている変数を指定する
# x1, x2にはそれぞれ塗りつぶしの始点と終点を指定する
# colには任意の色を指定できる
> my.paint(d, 10, 30, col="snow3")