Как одновременно рассчитать множество значений У через единое значение Х по линейным уравнениям регрессии?
Изучаю снег и льды, однако вопрос может быть интересен не только географам.
Есть множество временных рядов одинаковой длины, каждый из которых относится к определенной географической координате. Например, в текущем году в одной из точек 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 шт):
Вот вам пример кода и что в результате получается. Результаты не очень, но уж таковы данные, видимо.
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])
Графики по этой модели в тех же точках для сравнения:







