【问题标题】:a Panel regression in PythonPython 中的面板回归
【发布时间】:2016-04-19 08:07:12
【问题描述】:

我正在尝试对 pandas Dataframes 进行面板回归:

目前我有两个数据框,每个数据框包含 52 行(日期)*99 列(99stocks) :Markdown file with data representation

运行时:

est=sm.OLS(Stockslist,averages).fit()
est.summary()

我收到 ValueError:形状 (52,99) 和 (52,99) 未对齐:99 (dim 1) != 52 (dim 0)

谁能指出我做错了什么? 该模型只是 y(i,t)=x(i,t)+error term 所以没有拦截。 不过我想在未来添加时间效果。

亲切的问候, 杰伦

【问题讨论】:

  • statsmodels OLS 用于单变量因变量。您需要堆叠或 np.ravel 或重塑各个时间序列。您想要所有股票的单一斜率参数吗?
  • 我有两次 52 个单独的时间序列。我想要一个面板回归,而不是运行 52 个单独的 ols 回归,它在一个回归中捕获所有股票。所以是的,我想要一个斜坡而不是 52 个不同的斜坡
  • 这种情况仅相当于 long 形式的单个 OLS 回归。所以只需将两个 DataFrame 重塑为 52 * 99 行。例如,可以根据公司标签或指数创建固定效应的虚拟变量。
  • “长格式”是什么意思(代码方面)

标签: python pandas statsmodels


【解决方案1】:

试试下面的 - 我从上面的链接复制了股票数据,并为x 列添加了随机数据。对于面板回归,您需要 cmets 中提到的“MultiIndex”。

df = pd.DataFrame(df.set_index('dates').stack())
df.columns = ['y']
df['x'] = np.random.random(size=len(df.index))
df.info()

MultiIndex: 100 entries, (2015-04-03 00:00:00, AB INBEV) to (2015-05-01 00:00:00, ZC.PA)
Data columns (total 2 columns):
y    100 non-null float64
x    100 non-null float64
dtypes: float64(2)
memory usage: 2.3+ KB

regression = PanelOLS(y=df['y'], x=df[['x']])

regression

-------------------------Summary of Regression Analysis-------------------------

Formula: Y ~ <x> + <intercept>

Number of Observations:         100
Number of Degrees of Freedom:   2

R-squared:         0.0042
Adj R-squared:    -0.0060

Rmse:              0.2259

F-stat (1, 98):     0.4086, p-value:     0.5242

Degrees of Freedom: model 1, resid 98

-----------------------Summary of Estimated Coefficients------------------------
      Variable       Coef    Std Err     t-stat    p-value    CI 2.5%   CI 97.5%
--------------------------------------------------------------------------------
             x    -0.0507     0.0794      -0.64     0.5242    -0.2063     0.1048
     intercept     2.1952     0.0448      49.05     0.0000     2.1075     2.2829
---------------------------------End of Summary---------------------------------

【讨论】:

    【解决方案2】:

    正如你上面提到的,我通过以下方式更改了我的代码:

    1. 我将堆栈转换为两个数据帧
    2. 我将它们连接成一个单一的多索引数据帧
    3. 运行回归并添加时间效应

      <class 'pandas.core.frame.DataFrame'>
      MultiIndex: 5096 entries, (2015-04-03 00:00:00, AB INBEV) to (25/03/16, ZC.PA)
      Data columns (total 2 columns):
      indvalues    5096 non-null float64
      avgvalues    5096 non-null float64
      dtypes: float64(2)
      memory usage: 119.4+ KB
      
      from pandas.stats.plm import PanelOLS
      regression=PanelOLS(y=df["indvalues"], x=df[["avgvalues"]], time_effects=True)
      

    回归现在效果很好! 谢谢斯特凡·詹森

    【讨论】:

    • 我仍然想知道 statsmodels 是否不提供任何面板回归选项
    • 对于更严肃的计量经济学,恐怕最好使用 R 或任何商业软件包。这是实现某些东西的尝试,但不确定它是否已经超出了要点阶段:gist.github.com/vincentarelbundock/5053686
    猜你喜欢
    • 2021-09-26
    • 2021-02-05
    • 2021-08-05
    • 1970-01-01
    • 2021-10-15
    • 2020-08-22
    • 1970-01-01
    • 2019-06-13
    • 2021-03-04
    相关资源
    最近更新 更多