Python 如何运行屏蔽数组的线性回归

Python 如何运行屏蔽数组的线性回归,python,matplotlib,scikit-learn,linear-regression,Python,Matplotlib,Scikit Learn,Linear Regression,我试图在两个屏蔽数组上运行线性回归。不幸的是,线性回归忽略了掩码并对所有变量进行回归。我的数据有一些-9999值,而我们的仪器没有测量任何数据。这些-9999值生成一条与数据完全不匹配的线 我的代码是: from sklearn.linear_model import LinearRegression import numpy as np import matplotlib.pyplot as plt x = np.array( [ 2.019, 1.908, 1.902, 1.924, 1.

我试图在两个屏蔽数组上运行线性回归。不幸的是,线性回归忽略了掩码并对所有变量进行回归。我的数据有一些
-9999
值,而我们的仪器没有测量任何数据。这些-9999值生成一条与数据完全不匹配的线

我的代码是:

from sklearn.linear_model import LinearRegression
import numpy as np
import matplotlib.pyplot as plt

x = np.array( [ 2.019, 1.908, 1.902, 1.924, 1.891, 1.882, 1.873, 1.875, 1.904,
            1.886, 1.891, 2.0, 1.902, 1.947,2.0280, 1.95, 2.342, 2.029,
            2.086, 2.132, 2.365, 2.169, 2.121, 2.192,2.23, -9999, -9999, -9999, -9999,
            1.888, 1.882, 2.367 ] ).reshape((-1,1))
 
y = np.array( [ 0.221, 0.377, 0.367, 0.375, 0.258, 0.16 , 0.2  , 0.811,
          0.330, 0.407, 0.421, -9999, 0.605, 0.509, 1.126, 0.821,
          0.759, 0.812, 0.686, 0.666, 1.035, 0.436, 0.753, 0.611,
          0.657, 0.335, 0.231, 0.185, 0.219, 0.268, 0.332, 0.729 ] )

    
model = LinearRegression().fit(x, y )

r_sq = model.score( x, y )

print( 'coefficient of determination:', r_sq)
print( 'intercept:', model.intercept_)
print( 'slope:', model.coef_)

x_line = np.linspace (x.min(), x.max(), 11000)
y_line = (model.coef_* x_line) + model.intercept_
fig, ax1 = plt.subplots( figsize = ( 10, 10) )
plt.scatter( x, y )
plt.plot( x_line, y_line )
plt.show()
这给了我们 . 注意:大多数值都在右上角……它们靠得太近,无法区分


是否有一种方法可以在忽略屏蔽的
-9999
值时运行回归?当然,您可以删除有问题的值

无效=-9999
有效索引=(x[:,0]!=无效)和(y!=无效)
xv=x[有效的索引]。重塑(-1,1)
yv=y[有效的指数]
#代码的其余部分,使用'xv'和'yv'而不是'x'和'y'。
你应该看到下面这样的图,有一条非常合理的最佳拟合线


当然,您可以删除有问题的值

无效=-9999
有效索引=(x[:,0]!=无效)和(y!=无效)
xv=x[有效的索引]。重塑(-1,1)
yv=y[有效的指数]
#代码的其余部分,使用'xv'和'yv'而不是'x'和'y'。
你应该看到下面这样的图,有一条非常合理的最佳拟合线


效果很好!有没有一种方法可以替换-9999值,而不是仅仅删除它们?@danrod13没有引入选择偏差。你会用什么来代替它们?假设您用“局部中值”替换了缺失的数据。那么,当地的情况如何?这也引入了一个假设,即您的数据在某种程度上是“平滑的”。但有多顺利?所以你可以选择一些东西,但你只需要非常清楚地知道它是如何以一种可能有偏见和不受欢迎的方式改变回归的。你的方法对于替换-9999值来说绝对是有意义的。在一些变量中有-8888和-7777值,分别是低于和高于检测水平的数据。标准程序是用LOD的一半替换这些错误值,而不是直接删除它们。你是说这些值会使正在使用的任何传感器饱和,或者低于噪声地板?我会非常小心地假设这些样本的任何特定值,除非你有一个很好的先验模型来描述数据的分布。根据定义,除了最小值/最大值之外,你对这些值一无所知,而对分布一无所知。这非常有效!有没有一种方法可以替换-9999值,而不是仅仅删除它们?@danrod13没有引入选择偏差。你会用什么来代替它们?假设您用“局部中值”替换了缺失的数据。那么,当地的情况如何?这也引入了一个假设,即您的数据在某种程度上是“平滑的”。但有多顺利?所以你可以选择一些东西,但你只需要非常清楚地知道它是如何以一种可能有偏见和不受欢迎的方式改变回归的。你的方法对于替换-9999值来说绝对是有意义的。在一些变量中有-8888和-7777值,分别是低于和高于检测水平的数据。标准程序是用LOD的一半替换这些错误值,而不是直接删除它们。你是说这些值会使正在使用的任何传感器饱和,或者低于噪声地板?我会非常小心地假设这些样本的任何特定值,除非你有一个很好的先验模型来描述数据的分布。根据定义,除了最小值/最大值之外,您对这些值一无所知,而对分布没有其他了解。