# 分割表の無作為化検定(Randomization test)をする関数 random.test <- function(table, times=10000){ #table:分割表, times:反復回数 table <- table[,order(colnames(table))] #入力データの並べ替え table <- table[order(rownames(table)),] main <- function(table){ app.row <- apply(table,1,sum) #行ごとの合計 app.col <- apply(table,2,sum) #列ごとの合計 sum.table <- sum(table) #全体の合計 cat.row <- rownames(table) #行のカテゴリー cat.col <- colnames(table) #列のカテゴリー data <- NULL #分割表の元データの初期化 for (i in 1:nrow(table)){ #各カテゴリーの合計を固定して、データを作成 data <- c(data, rep(cat.row[i], app.row[i])) } data <- sample(data, sum.table) #データをランダムに並べ替え df.all <- NULL #出力データの初期化 for (i in 1:ncol(table)){ # data を app.col ごとに切り分ける sub.df <- cbind(data[1:app.col[i]] ,rep(cat.col[i], app.col[i])) #各カテゴリーの分だけデータを取り出す data <- data[ -(1:app.col[i]) ] #取り出したデータを削除 df.all <- rbind(df.all, sub.df) #データの結合 } df.all <- as.data.frame(df.all) test.table <- tapply(df.all$V1, list(df.all$V1,df.all$V2), length) #データから分割表を作成 test.table[is.na(test.table)] <- 0 #NAの値を0に変換 test.table } test.table <- list() #検定用のテーブルのリスト for (j in 1:times){ test.table[j] <- list(main(table)) } result <- list() #出力ファイルの初期化 for (k in 1:(nrow(table)*ncol(table))){ #分割表の測定項目回数(行*列)分を繰り返す test <- table[[k]] #入力データを代入 for (l in 1:times){ #反復回数だけ繰り返す test <- c(test, test.table[[l]][[k]]) #検定用データの代入 } tmp.res <- (rank(test)[1])/(times+1) #入力データと検定用データの中での入力データの階級 result[k] <- 2 * min(tmp.res, 1-tmp.res) #両側検定のp値 } result <- matrix(result, nrow=nrow(table)) #行列に変換 rownames(result) <- as.character(rownames(table)) #行列名を入れる colnames(result) <- as.character(colnames(table)) result } # 使い方 data <- c(70,40,80, 60,50,100, 10,60,200, 110,70,30) #テストデータの作成 table <- matrix(data, nrow=3) colnames(table) <- c("wetland", "grassland", "bush", "forest") rownames(table) <- c("endemic", "invasive", "others") table #テストデータ random.test(table) # 参考:各列のカテゴリーの出現比率が全体のカテゴリーごとの出現比率との差を出すには次のようにする prop.row <- apply(table,1,sum) / sum(table) prop.each <- t(t(table) / apply(table,2,sum)) t(t(prop.each) - prop.row)