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

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.

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)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top