Nuestro grupo de trabajo ha estado largas horas investigando la respuesta a tus interrogantes, te dejamos la resolución así que deseamos servirte de mucha apoyo.
Solución:
Una respuesta muy tardía, pero en caso de que alguien necesite una función lista para esto:
scipy.stats.linregress
es decir
slope, intercept, r_value, p_value, std_err = scipy.stats.linregress(x, y)
como en la respuesta de @Adam Marples.
De la documentación numpy.polyfit, se ajusta a la regresión lineal. Específicamente, numpy.polyfit con grado ‘d’ ajusta una regresión lineal con la función media
E(y|x) = p_d * x**d + p_d-1 * x **(d-1) + … + p_1 * x + p_0
Entonces solo necesita calcular el R-cuadrado para ese ajuste. La página de wikipedia sobre regresión lineal brinda detalles completos. Está interesado en R ^ 2, que puede calcular de varias maneras, siendo probablemente la más fácil
SST = Sum(i=1..n) (y_i - y_bar)^2
SSReg = Sum(i=1..n) (y_ihat - y_bar)^2
Rsquared = SSReg/SST
Donde uso ‘y_bar’ para la media de las y, y ‘y_ihat’ para ser el valor de ajuste para cada punto.
No estoy muy familiarizado con numpy (generalmente trabajo en R), por lo que probablemente haya una forma más ordenada de calcular su R-cuadrado, pero lo siguiente debería ser correcto
import numpy
# Polynomial Regression
def polyfit(x, y, degree):
results =
coeffs = numpy.polyfit(x, y, degree)
# Polynomial Coefficients
results['polynomial'] = coeffs.tolist()
# r-squared
p = numpy.poly1d(coeffs)
# fit values, and mean
yhat = p(x) # or [p(z) for z in x]
ybar = numpy.sum(y)/len(y) # or sum(y)/len(y)
ssreg = numpy.sum((yhat-ybar)**2) # or sum([ (yihat - ybar)**2 for yihat in yhat])
sstot = numpy.sum((y - ybar)**2) # or sum([ (yi - ybar)**2 for yi in y])
results['determination'] = ssreg / sstot
return results
De yanl (otra biblioteca más) sklearn.metrics
tiene un r2_score
función;
from sklearn.metrics import r2_score
coefficient_of_dermination = r2_score(y, p(x))
Al final de todo puedes encontrar los comentarios de otros programadores, tú igualmente tienes el poder insertar el tuyo si dominas el tema.