2017-03-21 2 views
0

Die folgenden zwei Codebeispiele machen die gleiche Arbeit, ergeben aber ein anderes Ergebnis. Es dauert ein/zwei Minuten, um die Codes auszuführen:Zwei Codierungen für den gleichen Zweck, aber mit unterschiedlichem Ergebnis

# chunk 1: 
n <- 10000000 
set.seed(1) 
a <- rbinom(n, 1, .5) 
b1 <- (a==0) * rexp(n, 1/182.5) 
b2 <- (a==1) * rexp(n, 1/365) 
e <- (a==1) * rbinom(n, 1, .5) 
b3 <- (e==1) * rexp(n, 1/365) 
g <- (1-a)*b1 + a*(b2+b3) 
p <- length(g[g>150])/length(g) 
p 

# chunk 2: 
n <- 10000000 
set.seed(1) 
a <- rbinom(n, 1, .5) 
b1 <- rexp(n, 1/182.5) 
b2 <- rexp(n, 1/365) 
e <- rbinom(n, 1, .5) 
b3 <- rexp(n, 1/365) 
g <- (1-a)*b1 + a*(b2+b3) 
p <- length(g[g>150])/length(g) 
p 

Diese 2 Brocken sind gleich, weil, für a zu eins gleich, der Teil (1-a)*b1 in g wird verschwunden sein, spielt es keine Rolle, ob b1 gleich Null ist oder irgendein anderer Wert.

Ähnlich, ohne a wird 1, der Teil a*(b2+b3) in g wird verschwunden sein. Es spielt also keine Rolle, ob ein Element b2 Null oder ein anderer Wert ist, wenn das entsprechende Element a Null ist.

Aber warum unterscheiden sich die 2 Chunks im Ergebnis?

+0

Was ist mit set.seed()? Wenn Sie eine zufällige Verteilung generieren, sollte dies anders sein, wenn Sie keinen Seed definieren. –

+0

@AleksandrVoitov da das 'n' groß genug ist, wird es ein ähnliches Ergebnis für 2 Dezimalstellen geben (habe ich immer gefunden). Ich habe noch bearbeitet. Vielen Dank. –

+0

@Leaf IMHO chunk1 berechnet ein anderes 'b1' als chunk2. abhängig von den Werten der Elemente von "a". Für 'a [i]' == 0 wird das gleiche 'b1 [i]' berechnet, aber für 'a [i]' == 1 berechnet der erste Chunk 'b1 [i] '== 0. – jogo

Antwort

2

Das Problem ist, dass die (a==0) und (a==1) Syntax in chunk 1 sieht aus wie es wie in Brocken auf das gleiche numerische Ergebnis führt 2, aber sie bewirken, dass der Befehl g[g>150]g anders in chunk 1 schneiden, als es in Brocken geschnitten wird 2.

In Chunk 1, (a==0) * rexp(n, 1/182.5) wird sichergestellt, dass alle unerwünschten Indizes auf Null gesetzt werden. In Chunk 2 gibt es immer noch Werte bei diesen Indizes, und einige dieser Werte könnten dazu führen, dass g größer als 150 ist. Also ist length(g[g>150]) eine größere Nummer für Chunk 2, und Sie erhalten eine andere Antwort.

Verwandte Themen