2016-05-19 7 views
1

Ich versuche, über ~ 60 Spalten mit dem Ziel zu iterieren, einen T-Test gewichtet nach Fall/Kontrolle Status durchzuführen und die Ausgabe als eine Liste zu erfassen. Hier ist mein Versuch so weit - beachten Sie, dass meine Datenrahmen Biomarker genannt wird, und Spalten 3-59 repräsentieren meine Variable von Interesse, durch Spalte gewichtet werden 2 (so genannte Fall):Extrahieren von Werten über die Schleife von t-Tests

tests <- list() 
column_biomarkers <- colnames(biomarkers[3:59]) 

for (i in column_biomarkers){ 
    tests[[i]] <- t.test(biomarkers$i[case == 1],biomarkers$i[case == 0],pool.sd=FALSE,na.rm=TRUE) 
    } 

sapply(tests, function(x) { 
    c(x$estimate[1], 
    x$estimate[2], 
    ci.lower = x$conf.int[1], 
    ci.upper = x$conf.int[2], 
    p.value = x$p.value) 
}) 

Allerdings habe ich diese Versuch führt zu folgendem Fehler:

Error in var(x) : 'x' is NULL

Jeder Rat würde sehr geschätzt werden! Ich bin neu bei Verwendung von R.

Beispieldaten:

structure(list(subject = 1:10, case = c(1L, 0L, 0L, 1L, 1L, 0L, 
0L, 0L, 0L, 1L), biomarker_1 = c(308.29999, 2533.3, 2723.3, 3125.3, 
853, 6442.2998, 1472.5, 170.5, 64.5, 2624.8), biomarker_2 = c(4930.7998, 
2401, 5158.5, 6526, 3774.2, 5753, 1955.2, 1332.2, 1296.8, 5859.2998 
), biomarker_3 = c(4810, 3279.5, 7929.5, 8353, 4074.2, 7940.5, 
1545.7, 2189.2, 1488.7, 6352.5)), .Names = c("subject", "case", 
"biomarker_1", "biomarker_2", "biomarker_3"), row.names = c(NA, 
10L), class = "data.frame") 
+0

Nicht sicher, warum Sie einen Fehler haben, aber alle 'Tests [[]]] sollten identisch sein, da Sie' i' nicht im 't.test()' Aufruf verwenden – HubertL

+0

whoops - sollten Biomarker $ i sein ... Entschuldigung, danke. Ich habe bearbeitet, oben ist der Code, der einen Fehler erzeugt. – AMS

+0

Mögliches Duplikat von [Wie kann ich einen paarweisen t.test in R über mehrere unabhängige Vektoren hinweg durchführen?] (Http://stackoverflow.com/questions/14745379/how-can-i-perform-a-pairwise-t-test -in-r-über-multiple-independent-vectors) – JackeJR

Antwort

0

Hier ist eine weitere mögliche Lösung ist.

tests <- list() 
column_biomarkers <- colnames(biomarkers[3:5]) 
for (i in column_biomarkers){ 
    tests[[i]] <-t.test(biomarkers[[i]][biomarkers$case == 1],biomarkers[[i]][biomarkers$case == 0],pool.sd=FALSE,na.rm=TRUE) 
} 

R nicht wie Biomarker $ i [Biomarker Fall $ == 1], R nicht i als gültige Spaltennamen zu akzeptieren damit die Verwendung von [[]] Notation zu funktionieren scheint.

+0

Während dies die Frage des OP lösen kann, ist die beste Praxis für R [vektorisierter Code] (http://www.noamross.net/blog/2014/4/16/vectorization-in-r--why.html) nicht iteratives Programmieren (dh Schleifen von Vektor/Matrix-Elementen), üblicherweise in Sprachen der unteren Ebene. – Parfait

2

Splitting Datenrahmen Betrachten in die beiden Gruppierungen und laufen t-Tests über die Spalten mit mapply() (die multivariate Funktion anwenden Operationen Element- laufen weise zwischen Objekten).

controldf <- df[df$case==1, 3:ncol(df)] 
treatmentdf <- df[df$case==0, 3:ncol(df)] 

tfct <- function(v1, v2){ 
      t.test(v1, v2, pool.sd=FALSE, na.rm=TRUE) 
     } 

ttests <- mapply(tfct, controldf, treatmentdf) 
ttests 

#    biomarker_1    biomarker_2    
# statistic -0.4310577    2.287416     
# parameter 7.943542     7.987304     
# p.value  0.677885     0.05152236    
# conf.int Numeric,2     Numeric,2     
# estimate Numeric,2     Numeric,2     
# null.value 0       0       
# alternative "two.sided"    "two.sided"    
# method  "Welch Two Sample t-test" "Welch Two Sample t-test" 
# data.name "v1 and v2"    "v1 and v2"  
#  
#    biomarker_3    
# statistic 1.169058     
# parameter 7.995322     
# p.value  0.2760513     
# conf.int Numeric,2     
# estimate Numeric,2     
# null.value 0       
# alternative "two.sided"    
# method  "Welch Two Sample t-test" 
# data.name "v1 and v2"  

Auch Ergebnisse zu einem Datenrahmen migrieren:

# Transposed data frame output of results 
testdf <- data.frame(t(ttests)) 
head(testdf) 

#    statistic parameter p.value    conf.int 
# biomarker_1 -0.4310577 7.943542 0.677885 -3219.767, 2206.667 
# biomarker_2 2.287416 7.987304 0.05152236 -19.24659, 4598.82973 
# biomarker_3 1.169058 7.995322 0.2760513 -1785.201, 5455.684 
#      estimate null.value alternative 
# biomarker_1 1727.85, 2234.40   0 two.sided 
# biomarker_2 5272.575, 2982.783   0 two.sided 
# biomarker_3 5897.425, 4062.183   0 two.sided 
#        method data.name 
# biomarker_1 Welch Two Sample t-test v1 and v2 
# biomarker_2 Welch Two Sample t-test v1 and v2 
# biomarker_3 Welch Two Sample t-test v1 and v2  
+0

Danke, das macht sehr viel Sinn.Wenn ich dies auf meine eigenen Daten anwende, erhalte ich den folgenden Fehler: Fehler in if (stderr <10 * .Machine $ double.eps * max (abs (mx), abs (my))) stop ("Daten sind im Wesentlichen konstant"): fehlender Wert wo TRUE/FALSE benötigt Zusätzlich: Warnmeldungen: 1: In mean.default (x): Argument ist nicht numerisch oder logisch: Rückgabewert NA 2: In mean.default (y): Argument ist nicht numerisch oder logisch: Rückgabewert NA – AMS

+0

Nicht einschließen die Betreff- oder Fallspalten in den aufgeteilten Datenrahmen. Beachten Sie die Teilmenge der Spalten '3: ncol (df)'. – Parfait

Verwandte Themen