función linregress scipy retorno de error estándar errónea?
-
19-09-2019 - |
Pregunta
Tengo una situación extraña con scipy.stats.linregress parece estar devolviendo un error estándar incorrecto:
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
Mientras Excel devuelve lo siguiente:
slope: 5.394
intercept: -16.281
rsq: 0.525
steyX: 11.696
error.TIPICO.XY es la función error estándar de Excel, volviendo 11.696 frente scipy de 3,63. Alguien sabe lo que está pasando aquí? Cualquier forma alternativa de conseguir el error estándar de una regresión en pitón, sin ir a RPY
Solución
Se puede probar con el href="http://statsmodels.sourceforge.net/" rel="nofollow noreferrer"> statsmodels paquete :
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
Otros consejos
Me acaban de informar por el grupo de usuarios SciPy que el std_err aquí representa el error estándar de la línea de gradiente, no el error estándar de la predicción y de, según Excel. Sin embargo los usuarios de esta función deben tener cuidado, porque esto no fue siempre el comportamiento de esta biblioteca - se utiliza para la producción exactamente como Excel, y el cambio parece haber ocurrido en los últimos meses.
De todos modos todavía en busca de un equivalente a error.TIPICO.XY en Python.
Si esto es cierto - la estimación estándar del gradiente es lo linregress retornos; la estimación estándar de la estimación (Y) está relacionado, sin embargo, y puede realizar una copia-en la SEE multiplicando el error estándar de la gradiente (SEG) que linregress le da: SEG = VER / sqrt (suma de (X - media X) ** 2)
Pila de cambio no se ocupa de látex pero la matemática es aquí si está interesado, bajo la "Analizar datos de ejemplo" la partida.
El cálculo de "err std en Y" en excel es en realidad desviación estándar de los valores de y.
Ese es el mismo para err std de x. El número '2' en el paso final es el grado de libertad de ejemplo que usted da.
>>> 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
Esto le dará un equivalente a error.TIPICO.XY usando 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)