scipy Python/Numpy中包含NAN的数组的线性回归

btxsgosb  于 2023-08-05  发布在  Python
关注(0)|答案(2)|浏览(151)

我有两个数组,比如varxvary。两者都在不同位置包含NaN值。但是,我想对两者进行线性回归,以显示两个数组的相关程度。This到目前为止非常有用。
但是,使用以下

slope, intercept, r_value, p_value, std_err = stats.linregress(varx, vary)

字符串
每个输出变量都有NaNs。什么是从两个数组中只取有效值作为线性回归的输入的最方便的方法?我听说过掩码数组,但不确定它是如何工作的。

qltillow

qltillow1#

您可以使用遮罩移除NaN:

mask = ~np.isnan(varx) & ~np.isnan(vary)
slope, intercept, r_value, p_value, std_err = stats.linregress(varx[mask], vary[mask])

字符串

r7knjye2

r7knjye22#

它与linregress无关,因为它只允许一维数组,但如果x是二维的,并且您正在使用sklearn.linear_model.LinearRegression/statsmodels.api.OLS等构建线性回归模型,则有必要按行删除NaN。

m = ~(np.isnan(x).any(axis=1) | np.isnan(y))
x_m, y_m = x[m], y[m]

字符串
在上面的示例中,any()将2-D掩码缩减为1-D掩码,该掩码可用于删除行。
一个工作示例可能如下所示。

import numpy as np
from sklearn.linear_model import LinearRegression
# sample data
x = np.random.default_rng(0).normal(size=(100,5))    # x is shape (100,5)
y = np.random.default_rng(0).normal(size=100)
# add some NaNs
x[[10,20], [1,3]] = np.nan
y[5] = np.nan

lr = LinearRegression().fit(x, y)             # <---- ValueError

m = ~(np.isnan(x).any(axis=1) | np.isnan(y))  
x_m, y_m = x[m], y[m]                         # remove NaNs
lr = LinearRegression().fit(x_m, y_m)         # <---- OK


使用statsmodels,它甚至更容易,因为它的模型(例如OLSLogitGLM等)有一个关键字参数missing=,可以用来隐藏NaN。

import statsmodels.api as sm
model = sm.OLS(y, x, missing='drop').fit()
model.summary()

相关问题