1

私はあらゆる方法でこのループを処理しようとしましたが、問題を解決するのに役立つ Web サイトはありませんでした。私はRに比較的慣れていないので、コードが間違っている場所でいくつかのガイダンスを使用できます。このシーケンスを 1000 回繰り返すために for ループを実行しようとしています: "lakea" と "lakeb" の 2 つのランダムな数値セットを作成し、2 つのレイクで t 検定を実行し、その t の結果の p 値を保存します。 -空のコンテナ(結果)でのテスト(有意または有意でない)。近づいた気がしますが、何らかの理由でプロセスを繰り返すことができません。

result<-vector("list",1000)   #empty container to fill
for(i in 1:1000){
lakea<-rnorm(30,100,15)
lakeb<-rnorm(30,110,15)
    pval<-t.test(lakea,lakeb)$p.value   #stores pvalues from the t-test
    if(pval[i] <= 0.05) result[[i]]<-"stat sig" else   #if statement to name output
    result[[i]]<-"not sig"
}
result

ループの結果、必要な結果 (「stat sig」または「not sig」) を含む 1 つの実際の結果が得られ、コンテナー内に 999 個の NULL オブジェクトが生成されます。

また、コンテナのコー​​ドを次のように変更しようとしました。

result<-vector("character",length(1000))
for(i in length(result)){
...

これにより、同様の結果が得られますが、最初のコードよりも少ない行で 1 つの長いベクトルが作成されます (意図した出力を持つ最初のオブジェクトのみが残ります)。また、コンテナ コードを次のように変更しようとしました。

result<-c(NULL,length(1000))
for(i in result){
...

これにより、「stat sig」または「not sig」の最初の出力が得られますが、他には何もありません。よろしくお願いします。

4

2 に答える 2

4

この種のリサンプリング用に構築されたループ構造を使用して、問題を 1 行に要約しifelse、結果の条件付き評価に使用できます。

replicate( 1000 , ifelse( t.test( rnorm(30,100,15) ,  rnorm(30,100,15 ) )$p.value <= 0.05 , "stat.sig" , "not.sig" ) )
于 2013-08-06T14:14:11.027 に答える
2

resultベクトルを初期化する必要を回避する簡単な構文を次に示します。

myfun <- function(){
    lakea<-rnorm(30,100,15)
    lakeb<-rnorm(30,110,15)
    # OP's original code:
     #pval <- t.test(lakea,lakeb)$p.value   #stores pvalues from the t-test
     #if(pval <= 0.05)
     #    result <-"stat sig" else   #if statement to name output
     #result <- "not sig"
    # simplified version:
    result <- ifelse(pval <= 0.05, "sig", "not sig")
}
result <- replicate(1000,myfun())
于 2013-08-06T14:14:23.963 に答える