如何解决如何在statsmodel ols回归中包括滞后变量
是否可以在statsmodel ols回归中指定滞后自变量?这是下面的示例数据框和ols模型规范。我想在模型中包含一个滞后变量。
df = pd.DataFrame({
"y": [2,3,7,8,1],"x": [8,6,2,1,9],"v": [4,8]
})
Current model:
model = sm.ols(formula = 'y ~ x + v',data=df).fit()
Desired model:
model_lag = sm.ols(formula = 'y ~ (x-1) + v',data=df).fit()
解决方法
我认为您不能在公式中即时调用它。也许使用shift方法?弄清楚这是否不是您所需要的
import statsmodels.api as sm
df['xlag'] = df['x'].shift()
df
y x v xlag
0 2 8 4 NaN
1 3 6 3 8.0
2 7 2 1 6.0
3 8 1 3 2.0
4 1 9 8 1.0
sm.formula.ols(formula = 'y ~ xlag + v',data=df).fit()
,
这已经有一个可接受的答案,但要加上我的 2 美分:
- 在移动之前验证索引是一种很好的做法(否则您的滞后可能不是您认为的那样)
- 可以定义一个可以在公式中多处重复使用的函数
一些示例代码:
import numpy as np
import pandas as pd
import statsmodels.api as sm
import statsmodels.formula.api as smf
df = pd.DataFrame({"y": [2,3,7,8,1],"x": [8,6,2,1,9],"v": [4,8]})
df.index = pd.PeriodIndex(
year=[2000,2000,2001],quarter=[1,4,freq="Q",name="period"
)
def lag(x,n,validate=True):
"""Calculates the lag of a pandas Series
Args:
x (pd.Series): the data to lag
n (int): How many periods to go back (lag length)
validate (bool,optional): Validate the series index (monotonic increasing + no gaps + no duplicates).
If specified,expect the index to be a pandas PeriodIndex
Defaults to True.
Returns:
pd.Series: pd.Series.shift(n) -- lagged series
"""
if n == 0:
return x
if isinstance(x,pd.Series):
if validate:
assert x.index.is_monotonic_increasing,(
"\u274c" + f"x.index is not monotonic_increasing"
)
assert x.index.is_unique,"\u274c" + f"x.index is not unique"
idx_full = pd.period_range(start=x.index.min(),end=x.index.max(),freq=x.index.freq)
assert np.all(x.index == idx_full),"\u274c" + f"Gaps found in x.index"
return x.shift(n)
return x.shift(n)
# Manually create lag as variable:
df["x_1"] = df["x"].shift(1)
smf.ols(formula="y ~ x_1 + v",data=df).fit().summary()
# Use the defined function in the formula:
smf.ols(formula="y ~ lag(x,1) + v",data=df).fit().summary()
# ... can use in multiple places too:
smf.ols(formula="y ~ lag(x,1) + lag(v,2)",data=df).fit().summary()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。