У меня есть одномерный массив значений независимых переменных (x_array
), которые соответствуют временным шагам в трехмерном массиве пространственных данных с несколькими временными шагами (y_array
). Мои фактические данные намного больше: 300+ временных шагов и до 3000 * 3000 пикселей:
import numpy as np
from scipy.stats import linregress
# Independent variable: four time-steps of 1-dimensional data
x_array = np.array([0.5, 0.2, 0.4, 0.4])
# Dependent variable: four time-steps of 3x3 spatial data
y_array = np.array([[[-0.2, -0.2, -0.3],
[-0.3, -0.2, -0.3],
[-0.3, -0.4, -0.4]],
[[-0.2, -0.2, -0.4],
[-0.3, np.nan, -0.3],
[-0.3, -0.3, -0.4]],
[[np.nan, np.nan, -0.3],
[-0.2, -0.3, -0.7],
[-0.3, -0.3, -0.3]],
[[-0.1, -0.3, np.nan],
[-0.2, -0.3, np.nan],
[-0.1, np.nan, np.nan]]])
Я хочу вычислить линейную регрессию на пиксель и получить R-квадрат, P-значения, перехваты и наклоны для каждого xy
пикселя в y_array
, со значениями для каждого временного шага в x_array
в качестве моей независимой переменной ,
Я могу изменить форму, чтобы получить данные в форме для ввода их в np.polyfit
, который векторизован и быстр:
# Reshape so rows = number of time-steps and columns = pixels:
y_array_reshaped = y_array.reshape(len(y_array), -1)
# Do a first-degree polyfit
np.polyfit(x_array, y_array_reshaped, 1)
Однако это игнорирует пиксели, которые содержат любые значения NaN
(np.polyfit
не поддерживает значения NaN
), и не вычисляет требуемую статистику (R-квадрат, P-значения, перехваты и уклоны).
Ответ здесь использует scipy.stats import linregress
, который вычисляет необходимую мне статистику и предлагает избегать проблем NaN
, маскируя эти NaN
значения. Однако этот пример относится к двум одномерным массивам, и я не могу понять, как применить подобный подход маскирования к моему случаю, когда каждый столбец в y_array_reshaped
будет иметь различный набор значений NaN
.
Мой вопрос: Как рассчитать статистику регрессии для каждого пикселя в большом многомерном массиве (300 x 3000 x 3000), содержащем множество значений NaN
, достаточно быстрым, векторизованным способом?
Желаемый результат: Массив статистических значений регрессии 3 x 3 (например, R-квадрат) для каждого пикселя в y_array
, даже если этот пиксель содержит значения NaN
в некоторый момент времени серия