如何运行掩码数组的线性回归
Posted
技术标签:
【中文标题】如何运行掩码数组的线性回归【英文标题】:How to run linear regression of a masked array 【发布时间】:2021-02-11 08:26:10 【问题描述】:我正在尝试对两个掩码数组进行线性回归。不幸的是,线性回归忽略了掩码并回归了所有变量。我的数据有一些-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()
这给了我们 this scatter plot with the regression plotted。注意:大多数值都在右上角...它们靠得太近而无法区分。
有没有办法在忽略被屏蔽的-9999
值的同时运行回归?
【问题讨论】:
【参考方案1】:当然,您可以删除有问题的值
invalid = -9999
valid_indices = (x[:, 0] != invalid) & (y != invalid)
xv = x[valid_indices].reshape(-1, 1)
yv = y[valid_indices]
# The rest of your code, using `xv` and `yv` instead of `x` and `y`.
您应该会看到如下图,其中有一条非常合理的最佳拟合线。
【讨论】:
效果很好!有没有办法可以替换 -9999 值而不是仅仅删除它们? @danrod13 并非没有引入选择偏差。你会用什么来代替它们?假设您用“本地中位数”替换了缺失数据。那么,如何本地化?这也引入了一个假设,即您的数据在某种程度上是“平滑的”。但是如何顺利呢?所以你可以选择一些东西,但你只需要非常清楚这如何以一种可能有偏见和不受欢迎的方式改变回归。 您的方式绝对适合替换 -9999 值。在一些变量中有 -8888 和 -7777 值,它们分别是低于和高于检测水平的数据。标准过程是用一半 LOD 替换这些错误值,而不是直接删除它们。 您的意思是使您使用的任何传感器饱和或低于本底噪声的值?我会非常小心地假设这些样本的任何特定值,除非您有一个非常好的先验模型来分配数据。根据定义,除了最小/最大值之外,您对这些值一无所知,而无需了解分布。以上是关于如何运行掩码数组的线性回归的主要内容,如果未能解决你的问题,请参考以下文章