62

私はdddという名前のR行列を持っています。これを入力すると、すべて正常に動作します。

i <- 1
shapiro.test(ddd[,y])
ad.test(ddd[,y]) 
stem(ddd[,y]) 
print(y) 

Shapiro Wilk、Anderson Darling、および Stem への呼び出しはすべて機能し、同じ列を抽出します。

このコードを「for」ループに入れると、Shapiro Wilk と Anderson Darling への呼び出しは機能しなくなりますが、stem & leaf 呼び出しと print 呼び出しは機能し続けます。

for (y in 7:10) {
    shapiro.test(ddd[,y])
    ad.test(ddd[,y]) 
    stem(ddd[,y]) 
    print(y)
}

The decimal point is 1 digit(s) to the right of the |

  0 | 0
  0 | 899999
  1 | 0

[1] 7

関数を書き込もうとすると、同じことが起こります。SW & AD は機能しません。他の呼び出しは行います。

> D <- function (y) {
+ shapiro.test(ddd[,y])
+ ad.test(ddd[,y]) 
+ stem(ddd[,y]) 
+ print(y)  }

> D(9)

  The decimal point is at the |

   9 | 000
   9 | 
  10 | 00000

[1] 9

すべての呼び出しが同じように動作しないのはなぜですか?

4

3 に答える 3

61

ループでは、関数内にあるため、自動印刷はオフになっています。print出力を見たい場合は、どちらの場合も明示的に何かをする必要があります。取得しているの[1] 9は、の値を明示的に出力しているためですy

以下は、これを実行することを検討する方法の例です。

> DF <- data.frame(A = rnorm(100), B = rlnorm(100))
> y <- 1
> shapiro.test(DF[,y])

    Shapiro-Wilk normality test

data:  DF[, y] 
W = 0.9891, p-value = 0.5895

そのため、自動印刷があります。ループでは、これを行う必要があります。

for(y in 1:2) {
    print(shapiro.test(DF[,y]))
}

より多くのテストを出力したい場合は、ループ内に余分な行として追加してください:

for(y in 1:2) {
    writeLines(paste("Shapiro Wilks Test for column", y))
    print(shapiro.test(DF[,y]))
    writeLines(paste("Anderson Darling Test for column", y))
    print(ad.test(DF[,y]))
}

しかし、大量の出力を読むのが好きでない限り、それはあまり魅力的ではありません。代わりに、当てはめたテスト オブジェクトを保存してから、それらを印刷して調査し、場合によってはそれらを処理して、テスト統計と p 値をテーブルに集計してみませんか? ループを使用してそれを行うことができます:

## object of save fitted objects in
obj <- vector(mode = "list", length = 2)
## loop
for(y in seq_along(obj)) {
    obj[[y]] <- shapiro.test(DF[,y])
}

次に、次を使用してモデルを確認できます

> obj[[1]]

    Shapiro-Wilk normality test

data:  DF[, y] 
W = 0.9891, p-value = 0.5895

たとえば、または usinglapplyを使用して、結果を保存するために使用するオブジェクトをセットアップします。

> obj2 <- lapply(DF, shapiro.test)
> obj2[[1]]

    Shapiro-Wilk normality test

data:  X[[1L]] 
W = 0.9891, p-value = 0.5895

Wとデータを抽出したいとしp-valueます。すべての結果を格納するオブジェクトを処理して、必要なビットを抽出できます。たとえば、次のようになります。

> tab <- t(sapply(obj2, function(x) c(x$statistic, x$p.value)))
> colnames(tab) <- c("W", "p.value")
> tab
          W      p.value
A 0.9890621 5.894563e-01
B 0.4589731 1.754559e-17

または重要な星が好きな人のために:

> tab2 <- lapply(obj2, function(x) c(W = unname(x$statistic), 
+                                    `p.value` = x$p.value))
> tab2 <- data.frame(do.call(rbind, tab2))
> printCoefmat(tab2, has.Pvalue = TRUE)
       W p.value    
A 0.9891  0.5895    
B 0.4590  <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

これは、画面に出力を送信してから流し込むよりも優れている必要がありますか?

于 2011-01-17T18:15:43.740 に答える
51

新しい答えではありませんが、上記に加えて、「flush.console()」は、ループの後ではなくループ中に印刷を強制的に実行するために必要です。ループ中に print() を使用する唯一の理由は、多くのファイルの読み取りなどの進行状況を表示するためです。

for (i in 1:10) {
  print(i)
  flush.console()
  for(j in 1:100000)
    k <- 0
}
于 2011-01-17T20:18:49.143 に答える
5

Gavin Simpson からのすばらしい回答です。私は最後の魔法を取り、それを関数に変えました。

sw.df <- function ( data ) { 
   obj <- lapply(data, shapiro.test)
   tab <- lapply(obj, function(x) c(W = unname(x$statistic), `p.value` = x$p.value))
   tab <- data.frame(do.call(rbind, tab))
   printCoefmat(tab, has.Pvalue = TRUE)
}

次に、データ フレーム sw.df ( df ) で呼び出すことができます。

そして、変換を試したい場合: sw.df ( log(df) )

于 2011-12-06T16:38:16.170 に答える