我试图从简单的回归中获得残差。此回归按每个年份和组进行。这就是我所做的。但是,有没有办法将残差作为新列与原始数据帧一起获取?
df=pd.DataFrame({'Name':['a','b','c','d','e','a','b','c','d','e','a','b','c','d','e'],
'Year':[2020,2020,2020,2020,2020,2021,2021,2021,2021,2021,2022,2022,2022,2022,2022],
'Group':['H','L','N','N','N','H','L','N','N','N','H','L','N','N','N'],
'Value':[0.3,0.2,0.3,0.1,0.1,0.2,0.3,0.2,0.2,0.1,0.4,0.1,0.1,0.3,0.1],
'Mom':[5,1,3,5,2,1,1,3,6,4,4,7,8,3,2]})
def a(row):
X = row['Value'] # independent variable
y = row['Mom'] # dependent variable
X = sm.add_constant(X)
reg = sm.OLS(y, X).fit()
return reg.resid
df.groupby(['Year','Group']).apply(a)
我当然可以将上述输出附加到原始数据帧,但我试图通过转换来实现这一点。我已经尝试过这个但没有成功。
df.groupby(['Year','Group']).transform(a)
可以使用
transform
方法将残差添加回原始 DataFrame,但你需要修改你的函数以返回与输入组大小相同的残差序列。
以下是完成此操作的方法:
import pandas as pd
import statsmodels.api as sm
df = pd.DataFrame({
'Name': ['a', 'b', 'c', 'd', 'e', 'a', 'b', 'c', 'd', 'e', 'a', 'b', 'c', 'd', 'e'],
'Year': [2020, 2020, 2020, 2020, 2020, 2021, 2021, 2021, 2021, 2021, 2022, 2022, 2022, 2022,
2022],
'Group': ['H', 'L', 'N', 'N', 'N', 'H', 'L', 'N', 'N', 'N', 'H', 'L', 'N', 'N', 'N'],
'Value': [0.3, 0.2, 0.3, 0.1, 0.1, 0.2, 0.3, 0.2, 0.2, 0.1, 0.4, 0.1, 0.1, 0.3, 0.1],
'Mom': [5, 1, 3, 5, 2, 1, 1, 3, 6, 4, 4, 7, 8, 3, 2]
})
def a(group):
X = group['Value']
y = group['Mom']
X = sm.add_constant(X)
reg = sm.OLS(y, X).fit()
return reg.resid
df['Residuals'] = df.groupby(['Year', 'Group']).transform(a)
print(df)
在这个修改后的代码中:
-
函数
a
现在接受一个组(DataFrame 的子集)作为输入。 -
a
函数现在返回reg.resid
,它是与输入组大小相同的残差序列。 -
我们使用
transform
将a
函数应用于每个组,并将结果直接分配给df
中的新列Residuals
。
这将为 DataFrame 中的每一行提供一个对应于其年份和组的回归残差。
标签:python,pandas From: 78785952