SCIPY -Linegress -Funktion fehlerhafter Standardfehlerrückgabe?
-
19-09-2019 - |
Frage
Ich habe eine seltsame Situation mit scipy.stats.LinRegress scheint einen falschen Standardfehler zurückzugeben:
from scipy import stats
x = [5.05, 6.75, 3.21, 2.66]
y = [1.65, 26.5, -5.93, 7.96]
gradient, intercept, r_value, p_value, std_err = stats.linregress(x,y)
>>> gradient
5.3935773611970186
>>> intercept
-16.281127993087829
>>> r_value
0.72443514211849758
>>> r_value**2
0.52480627513624778
>>> std_err
3.6290901222878866
Während Excel Folgendes zurückgibt:
slope: 5.394
intercept: -16.281
rsq: 0.525
steyX: 11.696
Steyx ist die Standardfehlerfunktion von Excel, die 11,696 gegen Scipy's 3.63 zurückgibt. Weiß jemand, was hier los ist? Jeder alternative Weg, um den Standardfehler einer Regression in Python zu erhalten, ohne zu rpy zu gehen?
Lösung
Sie könnten die ausprobieren Statsmodels Paket:
In [37]: import statsmodels.api as sm
In [38]: x = [5.05, 6.75, 3.21, 2.66]
In [39]: y = [1.65, 26.5, -5.93, 7.96]
In [40]: X = sm.add_constant(x) # intercept
In [41]: model = sm.OLS(y, X)
In [42]: fit = model.fit()
In [43]: fit.params
Out[43]: array([ 5.39357736, -16.28112799])
In [44]: fit.rsquared
Out[44]: 0.52480627513624789
In [45]: np.sqrt(fit.mse_resid)
Out[45]: 11.696414461570097
Andere Tipps
Ich wurde gerade von der scipy -Benutzergruppe darüber informiert, dass der STD_err hier den Standardfehler der Gradientenlinie darstellt, nicht den Standardfehler der vorhergesagten y, gemäß Excel. Trotzdem sollten Benutzer dieser Funktion vorsichtig sein, da dies nicht immer das Verhalten dieser Bibliothek war - sie wurde verwendet, um genau wie Excel auszugeben, und die Umstellung scheint in den letzten Monaten aufgetreten zu sein.
Auf der Suche nach einem Äquivalent zu Steyx in Python.
Ja, das ist wahr - die Standardschätzung des Gradienten ist das, was Linregress zurückkehrt. Die Standardschätzung der Schätzung (y) hängt jedoch aus, und Sie können das sehen, indem Sie den Standardfehler des Gradienten (SEG) multiplizieren, den Ihnen Linegress gibt: Seg = siehe / sqrt (Summe von (x - Durchschnitt) X) ** 2)
Stack Exchange geht nicht mit Latex aus, aber die Mathematik ist hier Wenn Sie interessiert sind, unter der Überschrift "Beispieldaten analysieren".
Die Berechnung von "STD err am y" in Excel ist eigentlich Standardabweichung von Werten von y.
Das gilt für STD ERR auf x. Die Zahl '2' im letzten Schritt ist der Grad der freien Freiheit, den Sie gegeben haben.
>>> x = [5.05, 6.75, 3.21, 2.66]
>>> y = [1.65, 26.5, -5.93, 7.96]
>>> def power(a):
return a*5.3936-16.2811
>>> y_fit = list(map(power,x))
>>> y_fit
[10.956580000000002, 20.125700000000005, 1.032356, -1.934123999999997]
>>> var = [y[i]-y_fit[i] for i in range(len(y))]
>>> def pow2(a):
return a**2
>>> summa = list(map(pow2,var))
>>> summa
[86.61243129640003, 40.63170048999993, 48.47440107073599, 97.89368972737596]
>>> total = 0
>>> for i in summa:
total += i
>>> total
273.6122225845119
>>> import math
>>> math.sqrt(total/2)
11.696414463084658
Dies gibt Ihnen ein Äquivalent zu Steyx mit Python:
fit = np.polyfit(x,y,deg=1)
n = len(x)
m = fit[0]
c = fit[1]
y_pred = m*x+c
STEYX = (((y-y_pred)**2).sum()/(n-2))**0.5
print(STEYX)