[PYTHON] Wenden Sie die Fehlerausbreitungsformel auf den Standardfehler an

Wenden Sie die Fehlerausbreitungsformel auf den Standardfehler an

Es gibt eine sogenannte Fehlerausbreitungsformel. Die Erklärung der Fehlerausbreitungsformel wird unten beschrieben. Da COV (a, b) kovariant ist, ist es Null, wenn die Fehler von a und b unabhängig sind.

y(a,b)Dann y Fehler σ_{y}Ist,Fehler eines σ_{a}Und b Fehler σ_{b}Wird wie folgt verwendet.

σ_{y}^2 = (\frac{∂y}{∂a})^2 σ_{a}^2 +  (\frac{∂y}{∂b})^2 σ_{b}^2+ 2COV(a,b)\frac{∂y}{∂a}\frac{∂y}{∂b}

Dieses Mal habe ich überlegt, ob die Fehlerausbreitungsformel auf den Standardfehler angewendet werden kann.

Was ist ein Standardfehler?

Im Folgenden finden Sie eine Lehrbucherklärung mit Statistiken darüber, welcher Standardfehler überhaupt vorliegt.

Angenommen, Sie möchten die Parameter der Bevölkerungsverteilung anhand einiger Beispieldaten schätzen. (Wenn beispielsweise die Bevölkerungsverteilung normal ist, sind die Parameter Mittelwert und Standardabweichung.) Hier betrachten wir auch ein Konfidenzintervall unter Verwendung des Standardfehlers, der während der Parameterschätzung abgeleitet wird.

Übrigens werde ich die Details über das Ableiten des Standardfehlers weglassen. Wenn die Parameter nach der wahrscheinlichsten Methode geschätzt werden, wenn Sie auf verschiedene Weise mit der logarithmischen Wahrscheinlichkeitsfunktion spielen (differenzieren, den erwarteten Wert nehmen usw.) Der Standardfehler kann abgeleitet werden.

Berücksichtigung des 95% -Konfidenzintervalls (= geschätzter Parameter +/- 2 x Standardfehler) Wiederholen Sie die obige 95% -Konfidenzintervallschätzung 100 Mal mit neuen Probendaten, die aus der Bevölkerungsverteilung entnommen wurden.

Nach 100 Versuchen enthalten 95-mal den wahren Wert des Populationsverteilungsparameters im 95% -Konfidenzintervall und 5-mal nicht. Der Standardfehler wird im obigen Sinne verwendet. Grob gesagt ist es wie ein Indikator dafür, wie zuverlässig die geschätzten Parameter sind.

Ein ähnlicher Begriff ist die Standardabweichung σ, die sich auf die Verteilung bezieht, in der die Daten tatsächlich kombiniert werden können.

Unterschied zwischen Standardfehler und Standardabweichung

Der Standardfehler ist ein Index für die Zuverlässigkeit der Daten, und die Standardabweichung ist der Bereich, den die Daten einnehmen können. Kommen wir nun zum ersten Titel zurück. Ich habe oft die Fehlerausbreitungsformel für die Standardabweichung (oder den Fehler) verwendet, aber diesmal habe ich mich gefragt "Kann es auf Standardfehler angewendet werden?" Ich dachte, dass es kein Problem geben würde, wenn ich es so anwenden würde, wie es war, aber ich versuchte es vorsichtig mit numerischer Simulation.

Ich habe eine numerische Simulation versucht

Als Fluss, (1) Schätzen Sie die Parameter a, b und c nach der wahrscheinlichsten Methode, indem Sie Daten wie folgt erzeugen. Wobei ε ein normalverteiltes Zufallsrauschen ist.

y = a+bx^2+cx^{-2} + ε

(2) Sobald b und c geschätzt werden können, berechnen Sie den Parameter d = (c / b) ^ (1/4). (3) Berechnen Sie den Standardfehler von d aus den Standardfehlern von b und c unter Verwendung der Fehlerausbreitungsformel.   Wiederholen Sie die Schritte ①②③ mehrmals und berücksichtigen Sie, dass die in ② berechnete Variation von d der Standardfehler von d ist. Wenn dies mit dem berechneten Wert in (3) übereinstimmt, kann die Fehlerausbreitungsformel auf den Standardfehler angewendet werden. Da auch mehrere Berechnungen in (3) durchgeführt werden, wird der Durchschnittswert verwendet.

Unten finden Sie den tatsächlichen Python-Code und die Ausgabe Ich denke, dass die Variation in (2) und das Berechnungsergebnis in (3) ungefähr übereinstimmen.

main.py


import numpy as np
from numpy.random import *
from scipy.optimize import curve_fit
import statistics
import math


def create_toydata(x_list):
    """
    x_mit Liste als Argument,Y mit Fehler_Erstelle Liste
    :param x_list:Liste von x
    :return y_list:Liste von y, die eine Funktion von x ist
    :return true_d:Richtig d
    """

    #Parameter wahrer Wert Nummer ist angemessen
    a = 2e2
    b = 2e-5
    c = 2e7

    y_list = [None] * len(x_list)

    for i, x in enumerate(x_list):
        #Fügen Sie den Daten einen normalen Verteilungsfehler hinzu. Die Nummer 2 wurde entsprechend entschieden
        noize = 2 * randn()
        y_list[i] = func(x, a, b, c) + noize

    # c,Berechne d, was eine Funktion von b ist
    true_d = (c/b)**(1/4)

    return y_list, true_d


def func(x, a, b, c):
    """Definieren Sie eine passende Funktion. Die Funktion selbst wurde entsprechend entschieden"""
    return a + b * x**2 + c * x**(-2)


def cal_se(C, B, C_se, B_se, COV):
    """
Aus dem Fehlerausbreitungsgesetz bei Korrelation(C/B)^(1/4)Finden Sie den Fehler von
    :param C:Parameter C.
    :param B:Parameter B.
    :param C_se:C Standardfehler
    :param B_se:Standardfehler von B.
    :param COV: C,B-Kovarianz
    :return: (C/B)^(1/4)Standart Fehler
    """
    del_c = (1/4) * C**(-3/4) * B**(-1/4)
    del_b = (-1/4) * C**(1/4) * B**(-5/4)

    return math.sqrt((del_c* C_se)**2 + (del_b * B_se)**2 + 2 * COV * del_c * del_b)


if __name__ == '__main__':

    #Anzahl von Versuchen
    n = 1000

    a_list = [None] * len(range(n))
    b_list = [None] * len(range(n))
    c_list = [None] * len(range(n))
    d_list = [None] * len(range(n))
    d_se_list = [None] * len(range(n))

    # cnt:95%Die Anzahl der wahren Werte im Konfidenzintervall
    cnt = 0

    #Wiederholen Sie den folgenden Versuch n-mal
    for i in range(n):
        #Aus toydata "y" nach der wahrscheinlichsten Methode= a + x^2 + c^-2 ”Koeffizient a,b,Finden Sie c
        # b,Berechne d, was eine Funktion von c ist.
        # b,Berechnen Sie den Standardfehler von d aus dem Standardfehler von c.

        #Zahlen sind angemessen
        x_st = 500
        x_end = 2500
        x_num = 200

        x_list = np.linspace(x_st, x_end, x_num).tolist()
        y_list, true_d = create_toydata(x_list=x_list)

        popt, pcov = curve_fit(func, x_list, y_list)

        # #Berechnen Sie d
        d = (popt[2]/popt[1])**(1/4)
        d_list[i] = d

        #Der Standardfehler von d,b,Berechnen Sie aus dem Standardfehler von c
        d_se = cal_se(popt[2], popt[1], math.sqrt(pcov[2][2]), math.sqrt(pcov[1][1]), pcov[1][2])
        d_se_list[i] = d_se

        # 95%Finden Sie das Konfidenzintervall
        d_low, d_up = d - 2 * d_se, d + 2 * d_se

        # 95%Überprüfen Sie, wie oft der wahre Wert in das Konfidenzintervall eingegeben wurde
        if d_low < true_d and true_d < d_up:
            cnt += 1


    #Finden Sie die Standardabweichung von d n-mal versucht(Betrachten Sie dies als den Standardfehler von d)
    true_d_se = statistics.pstdev(d_list)
    print("Standardfehler von d:", true_d_se)

    #Da der Standardfehler von d für jede Anzahl von Versuchen berechnet wird, wird das Endergebnis gemittelt.
    cal_d_se = statistics.mean(d_se_list)
    print("Durchschnitt des berechneten Standardfehlers von d:", cal_d_se)

    # 95%Finden Sie heraus, mit welcher Rate der Standardfehler in das Konfidenzintervall fällt.95%0 aus der Definition des Konfidenzintervalls.Sollte 95 sein
    print("95%Prozentsatz der Standardfehler innerhalb des Konfidenzintervalls:", cnt/n)

Das Folgende ist das Ausführungsergebnis. Die erste Zeile ist die Variation von ② und die zweite Zeile ist das Berechnungsergebnis von ③.

Standardfehler von d: 2.2655785060979126
Durchschnitt des berechneten Standardfehlers von d: 2.2443534560700673
95%Prozentsatz der Standardfehler innerhalb des Konfidenzintervalls: 0.947

Recommended Posts

Wenden Sie die Fehlerausbreitungsformel auf den Standardfehler an
Untersuchen Sie den Lie-Trotter-Formel-Cutoff-Fehler
Stellen Sie die Zeitzone auf japanische Standardzeit ein
Wenden wir die Markenbildfarbe auf die Farbkarte von matplotlib an!
Fehler-Back-Propagation-Methode (Back-Propagation)
Der Weg nach Pythonista
Der Weg nach Djangoist
Überprüfen Sie mit apply () (dataframe, Pandas), welche Zeile den Fehler verursacht hat.
So debuggen Sie eine Standard-Python-Bibliothek in Visual Studio
Erben Sie die Standardbibliothek, um den Durchschnittswert der Warteschlange zu ermitteln
Ändern Sie das Standardausgabeziel in eine Datei in Python