Множественная линейная регрессия с Python statsmodel
В R возможно выполнить множественную линейную регрессию, например
temp = lm(log(volume_1[11:62])~log(price_1[11:62])+log(volume_1[10:61]))
В Python возможно выполнить множественную линейную регрессию с формулой стиля R, поэтому я подумал, что приведенный ниже код должен работать так же хорошо,
import statsmodels.formula.api as smf
import pandas as pd
import numpy as np
rando = lambda x: np.random.randint(low=1, high=100, size=x)
df = pd.DataFrame(data={'volume_1': rando(62), 'price_1': rando(62)})
temp = smf.ols(formula='np.log(volume_1)[11:62] ~ np.log(price_1)[11:62] + np.log(volume_1)[10:61]',
data=df)
# np.log(volume_1)[10:61] express the lagged volume
но я получаю ошибку
PatsyError: Number of rows mismatch between data argument and volume_1[11:62] (62 versus 51)
volume_1[11:62] ~ price_1[11:62] + volume_1[10:61]
Я думаю, что невозможно регрессировать только часть строк в столбцах, потому что data = df имеет 62 строки, а другие переменные имеют 51 строку.
Есть ли удобный способ регрессии, как R?
df-тип - pandas Dataframe, а имена столбцов - volume_1, price_1
1 ответ
Используя пример из вопроса github в хранилище patsy, это будет способ заставить ваш столбец задержки работать правильно.
import statsmodels.formula.api as smf
import pandas as pd
import numpy as np
rando = lambda x: np.random.randint(low=1, high=100, size=x)
df = pd.DataFrame(data={'volume_1': rando(62), 'price_1': rando(62)})
def lag(x, n):
if n == 0:
return x
if isinstance(x,pd.Series):
return x.shift(n)
x = x.astype('float')
x[n:] = x[0:-n]
x[:n] = np.nan
return x
temp = smf.ols(formula='np.log(volume_1) ~ np.log(price_1) + np.log(lag(volume_1,1))',
data=df[11:62])