如何解决如何通过线性回归添加最小值/最大值不包括异常值
我在.csv中有x / y数据,计算了它们之间的线性回归,并将它们添加到绘图中。 我想添加两条平行于数据趋势线的额外线,以覆盖最小值和最大值(不包括异常值)。
这是它的外观。
from sklearn.metrics import r2_score
from scipy import stats
import numpy as np
import pandas as pd
from sklearn.linear_model import LinearRegression
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
from numpy import polyfit
import pylab
from numpy import polyval
csv = 'Trendline.csv'
df = pd.read_csv(csv,header=None,names=['x','y'])
x = df['x']
y = df['y']
fig = plt.figure(tight_layout=True)
plt.rc('grid',linestyle='--')
ax1 = plt.subplot(311)
ax1.scatter (x,y,marker = '+',color ='black')
plt.setp(ax1.get_xticklabels(),visible=False)
ax1.grid (True)
plt.ylim(bottom=0)
z=np.polyfit(x,1)
p=np.poly1d(z)
pylab.plot(x,p(x),'-',color='grey')
print ('y=%.6fx+(%.6f)'%(z[0],z[1]))
slope,intercept,rvalue,pvalue,stderr = stats.linregress(x,y)
print('R2 value: ',rvalue**2)
fig.align_labels()
plt.ylim(bottom=0)
plt.show()
如何调整代码以包括这些多余的线并获得其斜率/截距?
Here是.csv数据。
解决方法
实现目标的一种方法(包括其他方法)是首先确定“双变量离群值”。为此,将线性回归应用于样本的每个观察值以获得y_prim
,然后将残差计算为y-y_prim
。
然后,对于构成异常值的原因没有严格的定义,因此存在几种方法。最简单的方法之一是使用Tukey's fences:范围[Q1-1.5*IQR; Q3+1.5*IQR]
(其中Q1
是第一个四分位数,Q3
是第三个四分位数,{{1 }}是四分位间距)。在线性回归方程式中添加残差的Tukey篱笆边界,可以为您提供另外2条线的方程式,其中包括样本的最小值和最大值(不包括异常值)。
我通过上述过程修改了您的代码(请注意,我还清理了不必要的导入,csv文件的读取并删除了对IQR
的不必要的调用):
np.polyfit
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。