[英]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.