如何在绘制趋势线的R2值时使其穿过原点-python

问题描述

我正在使用看起来像这样的数据框df

index       var1      var2      var3
0           0.0       0.0       0.0 
10          43940.7   2218.3    6581.7
100         429215.0  16844.3   51682.7

我想绘制每个变量,绘制强制到原点的趋势线,计算并绘制R2值。

我在this post中找到了想要的东西,但是趋势线没有穿过原点,因此我找不到找到使之起作用的方法

我尝试手动修改趋势线第一点的值,但结果似乎并不理想。

for var in df.columns[1:]:
    fig,ax = plt.subplots(figsize=(10,7))
    
    x = df.index
    y = df[var]
    
    z = numpy.polyfit(x,y,1)
    p = numpy.poly1d(z)
    pylab.plot(x,p(x),"r--")
    
    plt.plot(x,"+",ms=10,mec="k")
    z = np.polyfit(x,1)
    y_hat = np.poly1d(z)(x)
    y_hat[0] = 0     ###--- Here I tried to replace the first value with 0 but it doesn't seem right to me.

    plt.plot(x,y_hat,"r--",lw=1)
    text = f"$y={z[0]:0.3f}\;x{z[1]:+0.3f}$\n$R^2 = {r2_score(y,y_hat):0.3f}$"
    plt.gca().text(0.05,0.95,text,transform=plt.gca().transAxes,fontsize=14,verticalalignment='top')
    

有什么办法吗?任何帮助将不胜感激。

解决方法

您可以为此使用Scipy和curve_fit。确定趋势线为y = ax,以便它穿过原点。

import matplotlib.pyplot as plt
from scipy.optimize import curve_fit

def func(x,a):
    return a * x

xdata = (0,10,20,30,40)
ydata = (0,12,18,35,38)

popt,pcov = curve_fit(func,xdata,ydata)
plt.scatter(xdata,ydata)
plt.plot(xdata,func(xdata,popt),"r--")
plt.show()

plot

,

您可以将{{ trialCallsToApiTwo$ | async }} 用于没有截距的简单线性回归

statsmodels

然后将坡度和R2存储在属性中:

import statsmodels.api as sm

xdata = [0,40]
ydata = [0,38]

res = sm.OLS(ydata,xdata).fit()

以及大量其他信息:

res.params
#array([1.01666667])

res.rsquared
#0.9884709382637339

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...