Dddという名前のR行列があります。これを入力すると、すべてが正常に機能します。
i <- 1
shapiro.test(ddd[,y])
ad.test(ddd[,y])
stem(ddd[,y])
print(y)
シャピロウィルク、アンダーソンダーリン、およびすべてのステムへの呼び出しは、同じ列を抽出します。
このコードを「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
すべての呼び出しが同じように動作しないのはなぜですか?
関数内にあるため、ループ内で自動印刷はオフになります。出力を表示したい場合は、どちらの場合も明示的に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
たとえば、またはlapply
を使用して、結果を保存するために使用するオブジェクトを設定します。
> 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
これは、画面に出力を送信するよりも優れている必要があります。
新しい答えではありませんが、上記に加えて、「flush.console()」は、ループの後ではなく、強制的に印刷を実行するために必要です。ループ中にprint()を使用する唯一の理由は、たとえば、多くのファイルの読み取りの進行状況を表示することです。
for (i in 1:10) {
print(i)
flush.console()
for(j in 1:100000)
k <- 0
}
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))