有益なコメントに応えて、私は元の質問を編集しました(forループとapplyループは異なる結果をもたらすと想定していました)。
Rを使用して、区切られたテーブルからの入力を使用して、多数の2グループt検定を実行しています。ここや他の場所からの推奨事項に従って、「for-loops」と「apply」のいずれかを試してそれを達成しました。'normal' t.testの場合、どちらもうまく機能し、同じ結果が得られます。ただし、対応のあるt検定の場合、for-lookは機能しているように見えますが、apply-loopは機能していません。後で、両方のループで同じ問題が発生することがわかりました(以下を参照)が、forループは状況をより適切に処理し(ループの1サイクルのみが無効な結果を返します)、apply-loopは完全に失敗します。
私の入力ファイルは次のようになります:(最初の行はヘッダー行で、データ行には名前があり、グループ1には4つのデータポイント、グループ2には4つのデータポイントがあります):
header g1.1 g1.2 g1.3 g1.4 g2.1 g2.2 g2.3 g2.4
name1 0 0.5 -0.2 -0.2 -0.1 0.4 -0.3 -0.3
name2 23.2 24.4 24.5 27.2 15.5 16.5 17.7 20.0
name3 .....
など(全体で約50000行)。最初のデータ行(name19で始まる)が原因であることが判明しました。
これは、より適切に機能するforループバージョンです(問題のある行では失敗しますが、他のすべての行を正しく処理します)。
table <- read.table('ttest_in.txt',head=1,sep='\t')
for(i in 1:nrow(table)) {
g1<-as.numeric((table)[i,2:5])
g2<-as.numeric((table)[i,6:9])
pv <- t.test(g1,g2,paired=TRUE)$p.value
}
これは問題を引き起こす「適用」バージョンです
table <- read.table('ttest_in.txt',head=1,sep='\t')
pv.list <- apply(table[,2:9],1,function(x){t.test(x[1:4],x[5:8],paired=TRUE)$p.value})
〜50000のデータラインの1つは、すべてのペアワイズ比較の差が同一であるという点で問題があります。これは、対応のあるt検定では、未定義のp値(本質的にゼロ)になります。適用ループがクラッシュし、「データは基本的に一定です」というエラーが発生します。私にとって(R初心者として)、t.testが1つのデータを好まないという理由だけで、スクリプト全体をクラッシュさせるのは良い考えではないようです。forループでは、このデータ行でもエラーメッセージが表示されますが、ループは続行され、他のすべてのt検定で正しい結果が得られます。
私は根本的に間違ったことをしましたか?この動作は、基本的に、この種のバッチ分析に適用ループを使用することを禁止します。または、この問題を回避するための標準的な方法はありますか。t検定が、ベイルアウトするのではなく、その特定のp値に対して無効なものを返さないのはなぜですか?