2016-04-13 15 views
0

Ich habe einige Daten, die wie folgt aussehen: enter image description hereLocating Bereich zwischen einem Konfidenzintervall in Daten mit Python

Der Code dieses Grundstück zu generieren:

CI=4.5 
data=pandas.DataFrame([3,5,1,2,3,4,5,6]) 
plt.figure() 
plt.plot(data) 
plt.plot([CI]*len(data),'--') 
plt.ylabel('y data',fontsize=15) 
plt.xlabel('x data',fontsize=15) 
plt.title('example data',fontsize=15) 

Ich kann auch die Daten interpoliert scipy mit :

from scipy.interpolate import interp1d 
f=interp1d(x_data,y_data,kind='linear') 
x_interp=numpy.linspace(min(x_data),max(x_data), num=100*len(x_data), endpoint=True) 
y_interp=f(x_interp)   
plt.figure() 
plt.plot(x_interp,y_interp) 

Die grüne Linie repräsentiert ein Konfidenzintervall. Ich muss die x-Werte, wo die y-Werte dieses Vertrauen intern überschreiten, programmatisch lokalisieren. Aber die Komplikation, dass da dies ein Konfidenzintervall muss ich die Werte erhalten, die die grüne Linie in beiden Richtungen überqueren: enter image description here

dh ich die X-Werte müssen, wo die y-Daten der roten Pfeile kreuzt, während mit Ausnahme derjenigen, am schwarzen Pfeil. Ich habe viele Varianten des Subtrahierens des Konfidenzintervalls von den interpolierten Daten sowie der Absolutwerte versucht, aber ich kann das Konfidenzintervall immer noch nicht isolieren. Kann mir jemand helfen? Vielen Dank im Voraus

+1

Ein Konfidenzintervall ist ein Bereich von Werten, z. B. 'lower_bound = CI - etwas; Obere_Bindung = CI + etwas_else'. Ich verstehe auch nicht, warum der schwarze Pfeil, nun, schwarz ist, während die anderen als rot behandelt werden. – Reti43

+0

Heißt das nicht, dass du alles über der grünen Linie haben willst? – armatita

+0

@ Reti43 Die Pfeile dienen nur zur Veranschaulichung - ebenso wie die Daten (weil die Angabe der realen Daten hier nicht möglich ist). In den realen Daten wären die CI's Parameterschätzung +/- Konfidenzintervall. Aber sie sind aufgrund der Nichtlinearität nicht symmetrisch. – CiaranWelsh

Antwort

1

Basierend auf

Ich will x-Werte, für die die y-Werte innerhalb eines bestimmten Bereichs liegen

es Sie für eine Maske sind einfach auf der Suche zu sein scheint. Wenn Sie eine relationale Aussage, z. my_array > x, gibt es ein boolesches Array mit True für alle Indizes zurück, bei denen diese Beziehung erfüllt ist. Und wenn Sie eine solche Maske an ein Array zur Indexierung übergeben, werden die Werte zurückgegeben, für die diese Maske True ist. Zum Beispiel

In [2]: a = np.array([1, 3, 2, 5, 2, 9, 4]) 

In [3]: a > 2 
Out[3]: array([False, True, False, True, False, True, True], dtype=bool) 

In [4]: a[a > 2] 
Out[4]: array([3, 5, 9, 4]) 

Also, die x Werte zu finden, wo f(x) innerhalb eines bestimmten Bereichs liegt, die Indizes finden, wo f(x) im gewünschten Bereich ist und filtern Sie Ihre x basierend auf dieser Maske.

# multiplication between 1s and 0s acts like logical AND 
mask = (y_interp >= lower_bound) * (y_interp <= upper_bound) 
accepted_parameters = x_interp[mask] 
+0

Anstelle von '*' könnten Sie auch elementweise 'AND' mit' & 'verwenden, was dasselbe erreichen würde. – Reti43