Как одновременно рассчитать множество значений У через единое значение Х по линейным уравнениям регрессии?

Изучаю снег и льды, однако вопрос может быть интересен не только географам.

Есть множество временных рядов одинаковой длины, каждый из которых относится к определенной географической координате. Например, в текущем году в одной из точек i измерили и получили значение толщины снега. графики примерно такие: введите сюда описание изображения

Как через линейное уравнение регрессии рассчитать толщину снега в остальных точках и присоединить полученные значения в отдельный столбец таблицы? пример таблицы прилагаю https://docs.google.com/spreadsheets/d/1rWvAlrEt2Ij8eOYuDm0yV2mEFFrjl-OH/edit?usp=sharing&ouid=105326785031219603112&rtpof=true&sd=true. Первый столбец с номерами заменяет географические координаты порядковым номером точки.

Пока мне удалось достичь вывода на графике прямой, описывающей зависимость двух заданных рядов и некоторых статистических параметров из OLS Regression Results. коэффициент К (наклона прямой) вывести оттуда не получилось( Однако, дальше я не могу продвинуться.

пример кода ниже:

'''

def abl_(x, y):
x = abl[x]
y = abl[y]
x_ = sm.add_constant(x)
model = sm.OLS(y,x_).fit()
print(model.params)
R = model.rsquared.round(2) ** 0.5
print('coefficient of determination, R^2:', model.rsquared.round(2))
print('coefficient of correlationn, R:', R.round(2))
print('value of intersection, b:', model.params.const.round(1))
print('coefficient K = ') # вывод этого параметра не получился
print('y = K * x +',  model.params.const.round(1))
ax = sns.regplot(x, y)
ax.set_title('coefficient of correlationn, R: ' + str(R.round(2)))
print('k-parametr:', model.params['x'])
abl_(3,8)

'''

график прямой между 2мя рандомными точками к коду такой : введите сюда описание изображения

По смыслу я понимаю, что требуется создать функцию, в которую закладываю номер точки и новое значение величины. после этого через цикл автоматически формируется уравнение регрессии между рядами данных, в него в качестве Х подставляется значение и производится вывод У для каждого ряда. моих навыков питона не хватает, надеюсь на помощь.


Ответы (1 шт):

Автор решения: CrazyElf

Вот вам пример кода и что в результате получается. Результаты не очень, но уж таковы данные, видимо.

import pandas as pd
import seaborn as sns
from sklearn.linear_model import LassoCV
import matplotlib.pylab as plt
import warnings
warnings.filterwarnings("ignore")

K = 4
df = pd.read_csv('snow.csv')
df = df.set_index('N').T
df.columns = list(map(str, df.columns))
columns = list(df.columns)
for col in columns:
    for i in range(1, K+1):
        df[f'{col}-{i}'] = df[col].shift(i).bfill()

for col in columns:
    lr = LassoCV()
    X = df.drop(columns=[col])
    X_train = X.iloc[K:-1]
    X_test = X.iloc[-1:]
    y_train = df[col].iloc[K:-1]
    y_test = df[col].iloc[-1:].values[0]
    lr.fit(X_train, y_train)
    y_pred = lr.predict(X_train)
    y_pred = int(lr.predict(X_test)[0])
    plt.figure()
    sns.lineplot(df[col])
    plt.plot(df.index[-2:], [y_train[-1], y_pred], 'r--')
    plt.xticks(rotation=45)
    plt.title(f'{col}, разница {y_pred - y_test}')
    plt.ylabel('')

Примеры графиков на выходе. Где-то очень хорошо предсказалось, а где-то очень далеко. Красная линия - предсказание. Синяя - реальный график.

введите сюда описание изображения

введите сюда описание изображения

введите сюда описание изображения

введите сюда описание изображения

В данном случае я предсказывал значение в точке по:

  • предыдущим значениям в этой точке в четыре предшествующих года
  • по значениям остальных точек в текущем году и в 4 предшествующих года

Именно 4 года взято эмпирическим путём, меньше и больше лет дают хуже предсказания.

Заменив одну переменную в коде получим другой вариант, который считает вообще без точек текущего года, только по данным предыдущего года. Считает хуже, но не сильно. А где-то даже и лучше (точка 1, например).

# X = df.drop(columns=[col])
X = df.drop(columns=[columns])

Графики по этой модели в тех же точках для сравнения:

введите сюда описание изображения

введите сюда описание изображения

введите сюда описание изображения

введите сюда описание изображения

→ Ссылка