簡體   English   中英

在python中按組回歸后解包元組

[英]Unpacking tuple after regression by group in python

我正在按組運行回歸。 我正在為每組輸出系數和整個殘差向量。 這會產生一個具有不同大小“元素”的元組。

目前,我無法將其解壓縮成兩個獨立的、可行的數據框:

import numpy as np
import pandas as pd
import statsmodels.api as sm

# simple regression
def regress(data, yvar, xvars):
    Y = data[yvar]
    X = data[xvars]
    X['intercept'] = 1.
    result = sm.OLS(Y, X, missing='drop').fit()
    return result.params, result.resid

# regression by group
def regress_groupby(data, yvar, xvars, groupby):
    df = data
    result = df.groupby(groupby).apply(regress, yvar, xvars)
    return result

# simulate data
N = 5
T = 20

df = pd.DataFrame(pd.Series(range(0, N)), columns = ['Id'])
df = df.reindex(np.repeat(df.index, T)).reset_index(drop=True)

df['y'] = np.random.normal(0,1, len(df.index))
df['x'] = np.random.normal(0,1, len(df.index))
df['y'] = 0 + 1*df['x'] + np.random.normal(0,1, len(df.index))
                 
fit = regress_groupby(data=df, yvar='y', xvars=['x'], groupby='Id')
print(fit)

我想要的只是一個 Nx2 數據幀,第一列中的截距和第二列中的系數估計值,以及一個帶有殘差的 (NxT)x1 數據幀(因此與原始數據幀具有相同的維度)。 如果“Id”也隨身攜帶,那就太好了。

我當然可以只輸出系數估計值,將它們合並回數據框中,然后自己計算殘差。 但是,如果有多個回歸器,這種方法似乎不太靈活......我發現了這個,但這對我沒有幫助。

您的fit對象是一系列的系列元組,以Id作為系列索引。

你可以先用

coefs, resids = zip(*fit)

拆分元組並將系數/截距放入一個元組,將殘差放入另一個。

然后,要將系數/截距值放入數據框中,您可以使用:

coefs_df = pd.DataFrame(coefs, index=fit.index)
print(coefs_df)
#           x   intercept
# Id        
# 0  1.204225   -0.468649
# 1  0.906064   -0.015549
# 2  1.208573   0.011745
# 3  1.070190   0.335113
# 4  0.756508   -0.351270

要創建帶有殘差的數據框,請使用:

resids_df = pd.DataFrame(zip(fit.index, resids), columns=['Id', 'Resids'])
resids_df = resids_df.set_index('Id')['Resids'].explode().reset_index()
print(resids_df.head())
#    Id    Resids
# 0   0  0.129417
# 1   0 -1.453258
# 2   0  0.398382
# 3   0  1.546869
# 4   0  2.002856

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM