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.
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.
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.
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