2017-03-16 3 views
1

Ich kann den Fehler in meinem Code und/oder den Fehler in meiner Logik nicht finden. Ich habe eine Matrix, X, von 0 und 1 und einen Vektor y von kontinuierlichen Werten und ich möchte einen 2-Probe t-Test in R, wo die Zeilen von X die verschiedenen Gruppen von y zeigen.Fehler bei der Anwendung und t-Test

Zum Beispiel:

x = matrix(rbinom(60,1,.5),ncol=10) 
y = abs(rnorm(ncol(x))) 

apply(x,1,function(x,y=y)t.test(y[x==1],y[x==0])) 

Also mit diesem Code ich erwartet hätte 6 t-Tests zu erhalten, wobei jede Reihe von X zu den beiden Gruppen von y entspricht. Ich erhalte jedoch diesen Fehler, wenn ich meinen Code ausführen:

Error in t.test(y[x == 1], y[x == 0]) : 
    promise already under evaluation: recursive default argument reference or earlier problems? 

Kann jemand den Fehler erklärt und meinen Code ändern zu bekommen, was ich will.

Antwort

2

Das Problem kommt von Ihrer Wiederverwendung von Variablennamen in Ihren Funktionsargumenten. Dies sollte funktionieren:

apply(x,1,function(x.f,y.f=y)t.test(y.f[x.f==1],y.f[x.f==0])) 
+1

warum das zweite Argument nicht entfernen? –

+1

'apply (x, 1, Funktion (x) t.test (y [x == 1], y [x == 0]))' –

+1

Ich denke, es ist klarer, was auf diesem Weg passiert. Das Referenzieren von Variablen innerhalb einer Funktion, die nicht in ihrem Gültigkeitsbereich sind, ist kein guter Stil imho. –

1

Was

apply(x,1,function(x,z)t.test(y[x==1],y[x==0]),y) 

Wenn Sie das zweite Argument in der Funktion verwenden möchten, sollten Sie es auch zu apply

1

Folgende Arbeiten passieren:

> apply(x,1,function(a)t.test(y[a==1],y[a==0]))  
[[1]] 

Sie sollten den Daten in data.frames und Vektoren bessere Namen geben, damit x und y usw. können als allgemeine Variablen verwendet werden. Außerdem muss y nicht an die Funktion gesendet werden, da sie für alle Tests gleich ist.

Ausgang:

 Welch Two Sample t-test 

data: y[a == 1] and y[a == 0] 
t = 0.43835, df = 5.377, p-value = 0.6782 
alternative hypothesis: true difference in means is not equal to 0 
95 percent confidence interval: 
-0.6356057 0.9036413 
sample estimates: 
mean of x mean of y 
0.5807408 0.4467230 


[[2]] 

     Welch Two Sample t-test 

data: y[a == 1] and y[a == 0] 
t = -0.80208, df = 5.5382, p-value = 0.4555 
alternative hypothesis: true difference in means is not equal to 0 
95 percent confidence interval: 
-1.0985419 0.5644195 
sample estimates: 
mean of x mean of y 
0.4337110 0.7007722 


[[3]] 

     Welch Two Sample t-test 

data: y[a == 1] and y[a == 0] 
t = 0.58194, df = 7.3884, p-value = 0.5779 
alternative hypothesis: true difference in means is not equal to 0 
95 percent confidence interval: 
-0.5584942 0.9283034 
sample estimates: 
mean of x mean of y 
0.6329878 0.4480832 


[[4]] 

     Welch Two Sample t-test 

data: y[a == 1] and y[a == 0] 
t = 1.1148, df = 4.8236, p-value = 0.3174 
alternative hypothesis: true difference in means is not equal to 0 
95 percent confidence interval: 
-0.4919082 1.2308641 
sample estimates: 
mean of x mean of y 
0.7622223 0.3927443 


[[5]] 

     Welch Two Sample t-test 

data: y[a == 1] and y[a == 0] 
t = 0.23436, df = 5.5539, p-value = 0.8231 
alternative hypothesis: true difference in means is not equal to 0 
95 percent confidence interval: 
-0.7818960 0.9439901 
sample estimates: 
mean of x mean of y 
0.5729543 0.4919073 


[[6]] 

     Welch Two Sample t-test 

data: y[a == 1] and y[a == 0] 
t = -1.015, df = 7.9168, p-value = 0.3401 
alternative hypothesis: true difference in means is not equal to 0 
95 percent confidence interval: 
-1.0152988 0.3954558 
sample estimates: 
mean of x mean of y 
0.3855747 0.6954962 

Nur für p-Werte:

> apply(x,1,function(a)t.test(y[a==1],y[a==0])$p.value) 
[1] 0.6781895 0.4555338 0.5779255 0.3173567 0.8231019 0.3400979 
Verwandte Themen