Trazar intervalos de confianza y predicción con entradas repetidas

Tengo una gráfica de correlación para dos variables, la variable predictiva (temperatura) en el eje x, y la variable de respuesta (densidad) en el eje y. Mi mejor ajuste de la línea de regresión de mínimos cuadrados es un polinomio de segundo orden. También me gustaría trazar la confianza y los intervalos de predicción. El método descrito en esta respuesta parece perfecto. Sin embargo, mi conjunto de datos (n = 2340) ha repetido entradas para muchos pares (x, y). Mi ttwig resultante es así: introduzca la descripción de la imagen aquí

Aquí está mi código relevante (ligeramente modificado de la respuesta vinculada arriba):

import numpy as np import pandas as pd import matplotlib.pyplot as plt from statsmodels.sandbox.regression.predstd import wls_prediction_std import statsmodels.formula.api as smf from statsmodels.stats.outliers_influence import summary_table d = {'temp': x, 'dens': y} df = pd.DataFrame(data=d) x = df.temp y = df.dens plt.figure(figsize=(6 * 1.618, 6)) plt.scatter(x,y, s=10, alpha=0.3) plt.xlabel('temp') plt.ylabel('density') # points linearly spaced for predictor variable x1 = pd.DataFrame({'temp': np.linspace(df.temp.min(), df.temp.max(), 100)}) # 2nd order polynomial poly_2 = smf.ols(formula='dens ~ 1 + temp + I(temp ** 2.0)', data=df).fit() # this correctly plots my single 2nd-order poly best-fit line: plt.plot(x1.temp, poly_2.predict(x1), 'g-', label='Poly n=2 $R^2$=%.2f' % poly_2.rsquared, alpha=0.9) prstd, iv_l, iv_u = wls_prediction_std(poly_2) st, data, ss2 = summary_table(poly_2, alpha=0.05) fittedvalues = data[:,2] predict_mean_se = data[:,3] predict_mean_ci_low, predict_mean_ci_upp = data[:,4:6].T predict_ci_low, predict_ci_upp = data[:,6:8].T # check we got the right things print np.max(np.abs(poly_2.fittedvalues - fittedvalues)) print np.max(np.abs(iv_l - predict_ci_low)) print np.max(np.abs(iv_u - predict_ci_upp)) plt.plot(x, y, 'o') plt.plot(x, fittedvalues, '-', lw=2) plt.plot(x, predict_ci_low, 'r--', lw=2) plt.plot(x, predict_ci_upp, 'r--', lw=2) plt.plot(x, predict_mean_ci_low, 'r--', lw=2) plt.plot(x, predict_mean_ci_upp, 'r--', lw=2) 

Las declaraciones de impresión se evalúan a 0.0, como se esperaba. Sin embargo, necesito líneas individuales para la línea de mejor ajuste polinomial y los intervalos de confianza y predicción (en lugar de las múltiples líneas que tengo actualmente en mi gráfica). ¿Algunas ideas?

Actualización: Después de la primera respuesta de @kpie , ordené mis matrices de confianza y de intervalo de predicción según la temperatura:

 data_intervals = {'temp': x, 'predict_low': predict_ci_low, 'predict_upp': predict_ci_upp, 'conf_low': predict_mean_ci_low, 'conf_high': predict_mean_ci_upp} df_intervals = pd.DataFrame(data=data_intervals) df_intervals_sort = df_intervals.sort(columns='temp') 

Esto logró los resultados deseados: introduzca la descripción de la imagen aquí

Necesitas ordenar tus valores de predicción basados ​​en la temperatura. Yo creo que*

Así que para obtener buenas líneas curvas, tendrá que usar numpy.polynomial.polynomial.polyfit. Esto devolverá una lista de coeficientes. Tendrá que dividir los datos x e y en 2 listas para que quepan en la función.

A continuación, puede trazar esta función con:

 def strPolynomialFromArray(coeffs): return("".join([str(k)+"*x**"+str(n)+"+" for n,k in enumerate(coeffs)])[0:-1]) from numpy import * from matplotlib.pyplot import * x = linespace(-15,45,300) # your smooth line will be made of 300 smooth pieces y = exec(strPolynomialFromArray(numpy.polynomial.polynomial.polyfit(xs,ys,degree))) plt.plot(x , y) 

Puede ver más en el trazado de líneas suaves aquí, solo recuerde que todas las líneas son splines lineales, debido a que la curvatura continua es irracional.

Creo que el ajuste polinomial se realiza con el ajuste de mínimos cuadrados (proceso descrito aquí )

¡Buena suerte!