Вопрос:
Я строю модель на трех временных рядах, где Y - зависимая переменная, а X1 и X2 - объясняющие переменные.Допустим, есть веские основания полагать, что влияние X1 на Y возрастает по сравнению с X2 с течением времени.Как вы можете объяснить это в модели множественной регрессии?(По мере продвижения моего вопроса я покажу некоторые фрагменты кода, и в конце вы найдете полный раздел кода.)
Подробности - визуальный подход:
Вот три синтетических ряда, в которых, по-видимому, влияние X1 на Y очень сильно в конце периода:
![enter image description here](https://i.stack.imgur.com/lu7DH.png)
Базовая модель может быть:
model = smf.ols(formula='Y ~ X1 + X2')
И если вы построите подгонянные значения по наблюдаемым значениям Y, вы получите это:
![enter image description here](https://i.stack.imgur.com/NdOW1.png)
И, следуя визуальной оценке модели, кажется, что она работает нормально в большинстве периодов, но очень плохо после августа. Как я могу объяснить это в множественной регрессиимодель?С помощью этого поста я попытался ввести термин взаимодействия с линейным и квадратным временным шагом в этих моделях:
mod_timestep = Y ~ X1 + X2:timestep
mod_timestep2 = Y ~ X1 + X2:timestep2
Кстати, это временные шаги:
![enter image description here](https://i.stack.imgur.com/3tVaE.png)
![enter image description here](https://i.stack.imgur.com/sJjXh.png)
Результаты:
![enter image description here](https://i.stack.imgur.com/uVKTF.png)
Кажется, что оба подхода работают немного лучше в конце, но значительно хуже в начале.
Есть еще какие-нибудь предложения?Я знаю, что существует множество возможностей с запаздывающими терминами зависимой модели и других моделей, таких как ARIMA или GARCH.Но по ряду причин я хотел бы остаться в рамках нескольких линейных регрессий и, если возможно, без запаздывающих терминов.
Вот и все, что нужно для простого копирования и вставки:
#%%
# imports
import matplotlib.pyplot as plt
import pandas as pd
import matplotlib.dates as mdates
import numpy as np
import statsmodels.api as sm
import statsmodels.formula.api as smf
import warnings
warnings.simplefilter(action='ignore', category=FutureWarning)
###############################################################################
# Synthetic Data and plot
###############################################################################
# Function to build synthetic data
def sample():
np.random.seed(26)
date = pd.to_datetime("1st of Dec, 1999")
nPeriod = 250
dates = date+pd.to_timedelta(np.arange(nPeriod), 'D')
#ppt = np.random.rand(1900)
Y = np.random.normal(loc=0.0, scale=1.0, size=nPeriod).cumsum()
X1 = np.random.normal(loc=0.0, scale=1.0, size=nPeriod).cumsum()
X2 = np.random.normal(loc=0.0, scale=1.0, size=nPeriod).cumsum()
df = pd.DataFrame({'Y':Y,
'X1':X1,
'X2':X2},index=dates)
# Adjust level of series
df = df+100
# A subset
df = df.tail(50)
return(df)
# Function to make a couple of plots
def plot1(df, names, colors):
# PLot
fig, ax = plt.subplots(1)
ax.set_facecolor('white')
# Plot series
counter = 0
for name in names:
print(name)
ax.plot(df.index,df[name], lw=0.5, color = colors[counter])
counter = counter + 1
fig = ax.get_figure()
# Assign months to X axis
locator = mdates.MonthLocator() # every month
# Specify the X format
fmt = mdates.DateFormatter('%b')
X = plt.gca().xaxis
X.set_major_locator(locator)
X.set_major_formatter(fmt)
ax.legend(loc = 'upper left', fontsize ='x-small')
fig.show()
# Build sample data
df = sample()
# PLot of input variables
plot1(df = df, names = ['Y', 'X1', 'X2'], colors = ['red', 'blue', 'green'])
###############################################################################
# Models
###############################################################################
# Add timesteps to original df
timestep = pd.Series(np.arange(1, len(df)+1), index = df.index)
timestep2 = timestep**2
newcols2 = list(df)
df = pd.concat([df, timestep, timestep2], axis = 1)
newcols2.extend(['timestep', 'timestep2'])
df.columns = newcols2
def add_models_to_df(df, models, modelNames):
df_temp = df.copy()
counter = 0
for model in models:
df_temp[modelNames[counter]] = smf.ols(formula=model, data=df).fit().fittedvalues
counter = counter + 1
return(df_temp)
df_models = add_models_to_df(df, models = ['Y ~ X1 + X2', 'Y ~ X1 + X2:timestep', 'Y ~ X1 + X2:timestep2'],
modelNames = ['mod_regular', 'mod_timestep', 'mod_timestep2'])
# Models
df_models = add_models_to_df(df, models = ['Y ~ X1 + X2', 'Y ~ X1 + X2:timestep', 'Y ~ X1 + X2:timestep2'],
modelNames = ['mod_regular', 'mod_timestep', 'mod_timestep2'])
# Plots of models
plot1(df = df_models,
names = ['Y', 'mod_regular', 'mod_timestep', 'mod_timestep2'],
colors = ['red', 'black', 'green', 'grey'])
Редактировать 1 - скриншот из предложения: **
![enter image description here](https://i.stack.imgur.com/aC091.png)