2017-05-07 4 views
4

Ich habe einen Datensatz mit experimentellen Daten. Jeden Tag habe ich neue Beobachtung in den kommendenBerechne p-Werte in einer for-Schleife

Ein fiktives Beispiel meiner df mit Spalten. Tag: Tag Index Gruppe a: Daten steuern Gruppe b: Datenverarbeitung.

structure(list(day = c(1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L, 3L), group_a = c(4L, 
2L, 3L, 1L, 1L, 4L, 3L, 2L, 4L), group_b = c(3L, 4L, 2L, 2L, 
2L, 2L, 3L, 4L, 5L)), .Names = c("day", "group_a", "group_b"), class = "data.frame", row.names = c(NA, 
-9L)) 

Ich möchte diesen Datensatz der Teilmenge, einen Wilcoxon-Test wie anwenden:

test <- wilcox.test(df$group_a, df$group_b, alternative = 'g') 
test$p.value 

In diesem Beispiel habe ich den Test über den gesamten Datensatz anwenden.

will ich es 1 am Tag anwenden, dann Tag 1 und 2 und so weiter, schließlich eine Liste bekommen wie (fiktive Daten) auf der Suche:

day p-value 
1 0.02 
2 0.03 
3 0.3 

Wie kann ich den Test in einem for-Schleife anwenden über "Tag", aber über "kumulative" Anzahl an Tagen?

Antwort

1

Sie können Reduce mit accumulate = TRUE verwenden,

p_value <- do.call(rbind, lapply(Reduce(rbind, split(df, df$day), accumulate = TRUE), 
       function(i) wilcox.test(i$group_a, i$group_b, alternative = 'g')$p.value)) 
p_value 
#   [,1] 
#[1,] 0.7928919 
#[2,] 0.7768954 
#[3,] 0.7084401 

Tidy die Ausgabe,

final_df <- data.frame(day = unique(df$day), p_value) 

final_df 
# day p_value 
#1 1 0.7928919 
#2 2 0.7768954 
#3 3 0.7084401 
3

Verwendung:

for (i in unique(df$day)) { 
    df$p.val[df$day == i] <- wilcox.test(df[df$day %in% 1:i,]$group_a, df[df$day %in% 1:i,]$group_b, alternative = 'g')$p.value 
} 

Sie erhalten:

> df 
    day group_a group_b  p.val 
1 1  4  3 0.7928919 
2 1  2  4 0.7928919 
3 2  3  2 0.7768954 
4 2  1  2 0.7768954 
5 2  1  2 0.7768954 
6 3  4  2 0.7084401 
7 3  3  3 0.7084401 
8 3  2  4 0.7084401 
9 3  4  5 0.7084401 

Oder, wenn Sie wollen einfach nur den drei p-Wert in einem zusammengefassten Datenrahmen erhalten:

vec <- sapply(unique(df$day), 
       function(i) wilcox.test(df[df$day %in% 1:i,]$group_a, 
             df[df$day %in% 1:i,]$group_b, 
             alternative = 'g')$p.value) 

df2 <- data.frame(day = unique(df$day), p.val = vec) 

die gibt:

> df2 
    day  p.val 
1 1 0.7928919 
2 2 0.7768954 
3 3 0.7084401 
0

Dies funktioniert auch:

library(data.table) 
setDT(df) 
test_pvals <- sapply(as.list(unique(df[, day])), function(x){ 
    df[day <= x, wilcox.test(group_a, group_b, alternative = 'g')$p.val] 
}) 
data.table(day = df[, unique(day)], p.val = test_pvals) 
## day  p.val 
## 1: 1 0.7928919 
## 2: 2 0.7768954 
## 3: 3 0.7084401 
+0

Nee. Lesen Sie die Frage erneut – Sotos

+0

Danke @Sotos. Fest –