要約

diff コマンドを利用してプログラムの正しさをチェックします。

$ > diff answer out  
● answer 期待される出力結果のファイル
● out 実際の出力結果のファイル

手順

(1) check という,コマンドを作っておく

chmod 755 check などで実行可能としておく

#!/bin/sh -f
R --vanilla --silent --slave < tests.R
diff answer out

注1:tests.R は,以下に示す R スクリプト
注2:answer は,期待される出力のファイル(一文字単位で正確なもの)
注3:out は,開発中の関数が出力する結果が納められるファイル(実行のたびに作られる)

(2) チェックを行うための R スクリプト

ファイル名は tests.R としておく  (1) の中の名前と対応付け

source("my.oneway.ANOVA.R") # my.oneway.ANOVA.R は,開発中のスクリプト---(3)を参照
test <- function() # テストの記述
{
        sink("out") # 以下の結果を out という名前のファイルに書き出す
        print(my.oneway.ANOVA(c(8, 11, 22, 6), c(135.83, 160.49, 178.35, 188.06), c(19.59, 12.28, 15.01, 9.81)^2))
        print(my.oneway.ANOVA(c(8, 11, 22, 6), c(135.83, 160.49, 178.35, 188.06), c(19.59, 12.28, 15.01, 9.81)^2, equal=FALSE))
        sink() # 書き出し終了
}
test() # 実際にテストを実行する

(3) 開発中の関数

ファイル名は my.oneway.ANOVA.R としておく  (2) の中の名前と対応付け

my.oneway.ANOVA <- function(n, m, u, equal=T)
{
    ng <- length(n)
    if (equal) {    # 分散が等しいと仮定する場合
        nc <- sum(n)
        sw <- sum(u*(n-1))
        sb <- sum(n*(m-sum(n*m)/nc)^2)
        ss <- c(sb, sw, sb+sw)
        df <- c(ng-1, nc-ng, nc-1)
        ms <- ss/df
        f <- p <- rep(99999, 3)
        f[1] <- ms[1]/ms[2]
        p[1] <- pf(f[1], df[1], df[2], lower = F)
        anova.table <- cbind(ss, df, ms, f, p)
        colnames(anova.table) <- c("SS", "d.f.", "MS", "F value", "P value")
        rownames(anova.table) <- c("between class", "within class", "total")
        anova.table
    }
    else {    # 分散が等しいと仮定しない場合
        w <- n/u
        m0 <- sum(w*m)/(sum.w <- sum(w))
        temp <- sum((1-w/sum.w)^2/(n-1))/(ng^2-1)
        f <- sum(w*(m-m0)^2)/((ng-1)*(1+2*(ng-2)*temp))
        p <- pf(f, ng-1, 1/(3*temp), lower=F)
        list(F=f, df1=ng-1, df2=1/(3*temp), P=p)
    }
}

(4) 開発中の関数が出力すると期待される結果を納めたファイル answer

前もって作っておく
キーボードから入力する必要はない。
できかけの関数が書き出す結果をファイルに出力し,必要なら微修正すればよい。

                     SS d.f.        MS     F value      P value
between class 13669.396    3 4556.4655    20.82824 1.737484e-08
within class   9406.843   43  218.7638 99999.00000 9.999900e+04
total         23076.240   46  501.6574 99999.00000 9.999900e+04
this line may be displayed.
$F
[1] 17.56461

$df1
[1] 3

$df2
[1] 16.50403

$P
[1] 2.191921e-05

(5) test により,実際に作成される結果のファイル out

(1) で定義するシェルスクリプトにより起動される(2)の R スクリプト中の test 関数が出力する結果

                     SS d.f.        MS     F value      P value
between class 13669.396    3 4556.4655    20.82824 1.737484e-08
within class   9406.843   43  218.7638 99999.00000 9.999900e+04
total         23076.240   46  501.6574 99999.00000 9.999900e+04
$F
[1] 17.56461

$df1
[1] 3

$df2
[1] 16.50403

$P
[1] 2.191921e-05

(6) 実行結果

(1) で作ったシェルスクリプトを実行する。

$ > ./check

5d4
< this line may be displayed. # 違いのある行が表示される

(7) 注釈

  • 膨大な出力ファイルでもかまわない
  • プログラムの改訂があれば,必要に応じて answer ファイルも改訂する
  • プログラムの改訂があったとき,いつでもこのチェックをする必要はない

コメント無用(^_^;)


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Google
WWW を検索 OKADAJP.ORG を検索
Last-modified: 2015-03-01 (日) 01:15:59 (1719d)