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?

War es hilfreich?

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)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top