2

有益なコメントに応えて、私は元の質問を編集しました(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値に対して無効なものを返さないのはなぜですか?

4

4 に答える 4

5

更新applyforループでもエラーが発生し、バージョンをより堅牢にする必要があるとおっしゃっていたので、単に?を追加してみませんtryCatchか?

pv.list <- apply(table[,2:9],1, function(x) tryCatch( 
  t.test(x[1:4],x[5:8],paired=TRUE)$p.value, error=function(x) NA ))

これはNA、p値を計算できなかった場合に返されます。エラー処理関数を編集することにより、別の値(、、、など)に変更できNULLます0Inf

古い投稿

私は、いくつかの値が(バグのように思われる)t.testときに見つけたエラーを(種類)与えることに注意しました:Inf

> t.test(1:10, c(rep(1,9), Inf), paired=TRUE)
Error in if (stderr < 10 * .Machine$double.eps * abs(mx)) stop("data are essentially constant") : 
missing value where TRUE/FALSE needed

それで、あなたは実際にこれを手に入れますか、それとも実際にこう言いますか?

Error in t.test: data are essentially constant

ただし、forループが機能する理由はまだはっきりしていません。ただし、forループでは実行しますがas.numeric、この場合は実行しないことに注意してくださいapply...

于 2012-02-28T17:14:30.100 に答える
1

このような状況では、次のように、すべての警告とエラーをキャッチし、後で調査します。関数からの出力として警告とエラーを保存するにはどうすればよいですか?

ここでいくつかの良いアイデアを見つけることもできます:エラーを無視してリスト内の次のものを処理するようにlapplyに指示する方法は?

于 2012-02-29T02:06:55.683 に答える
0

t.test(rep(1,4),rep(0,4))同じエラーが報告されます。そして、https://stat.ethz.ch/pipermail/r-help/2008-February/154167.htmlは、1)ゼロ分散2)観測数が1以上ではないことに対処するための答えです。

于 2013-07-04T02:39:27.380 に答える
0

私はまさにこの問題に遭遇しました。tapplyを使用して多数の対応のあるt検定を実行しました。とにかくt検定を実行するべきではないデータを削除するためのガイドとしてサンプルサイズを使用します。

于 2018-08-31T18:18:52.573 に答える