本文使用的数据处理工具为pandas,其提供了对excel文件,csv文件的高效处理,操作简单。
‘’’
def read_excel(path, save=False):
# 读取excel 文件
data = pd.read_excel(path, index_col=[])
# 读取csv 文件
data = pd.read_csv(path, index_col=[])
# 获取特定的columns
data = data[['c1', 'c2', 'c3', ...,'cn']]
# 将获取的文件保存为excel 格式,或者其他的格式csv等。
if save:
data.to_excel("d.xlsx", index=False)
# 将文件保存为csv格式的其他方法:
numpy.savetxt(path, data, delimiter=',', header="x1", fmt='%f', comments='')
# 丢弃选取的列的方法,drop
data = data.drop(columns = ['c1','c2','c3']
# 添加一列的方法 insert (index, new_data)
col_name = data.columns.tolist() # 获取原始的列名称
col_name.insert(6, 'column_name') # 选择要插入的位置和列名称
data = data.reindex(columns=col_name) # 刷新列名称
data1['column_name'] = new_data # 插入数据
linearmodels.panel.PanelOLS,sklearn.linear_model.LinearRegression,statsmodels.api.OLS
这些都是可以执行多元线性回归分析的库。本例子中,使用linearmodels.panel.PanelOLS。
# y是因变量,x是自变量,可以为多元的形式,选取需要的列名称输入即可。
entry1 = PanelOLS(y, x, entity_effects=False, time_effects=False, check_rank=False, drop_absorbed=False)
# 自变量的获取
import statsmodels.api as sm
x = sm.add_constant(data.iloc[:, columns_you_need])
# columns_you_need 表示那些你需要的列,可以使用np.hstack((index1,index2))进行组装获得。add_constant表示需要考虑多元线性回归中的常数项。
在使用固定效应的时候,需要创建一个二级的联合索引。联合索引的第一个是实体维度,第二个是时间维度。
这里估计是创建了一个新的列,但是没有为它设置索引,导致在使用函数isnan的时候会出现数据格式检查有问题的情况。
使用PanelOLS包提供的工具
‘’’
from linearmodels.panel import
model = PanelOLS(y, x, entity_effects=True, time_effects=False, check_rank=False, drop_absorbed=True)
# entity_effects=True表示使用固定效应。
‘’’
在使用固定效应的时候,有时候并不能同时开启行业控制。会出现列丢失的情况。AbsorbingEffectWarning:
Variables have been fully absorbed and have removed from the regression。
题主崔对此进行了实验发现,如果将行业作为2-level index 的时候,在开启行业控制和固定效应的同时,会丢弃掉行业控制。这可能是因为固定效应本身就为你考虑了行业控制?
同时,如果2-level index 中的第一个索引(实体索引)不是行业控制的变量的话,那么就可以同时开启行业控制,年度控制和固定效应。因此,题主得出的结论是,如果2-level index 中的实体索引和时间索引如果同时是行业控制和年度控制中相关的列,那么就会出现丢弃列的情况,因为开启固定效应就表示帮你控制了实体列的变量,同时,开启时间控制的话,就表示帮你控制了时间列的变量。而此时如果实体变量列又是你的行业控制的话,那么就会出现重复的情况,会出现丢弃。同理,如果时间变量列又是你的年度控制的话,那么开启时间控制的同时又加入年度控制的话,同样会出现丢弃的情况。
何为年度控制和行业控制
一般来说,存在着解释变量和控制变量,解释变量与控制变量都是作为自变量放在方程的右边,二者为了突出研究的问题进行了区分。解释变量是指着重研究的自变量,是研究者重点考查对因变量有何影响的变量。而控制变量是指与特定研究目标无关的非研究变量,即除了研究者重点研究的解释变量和需要测定的因变量之外的变量,是研究者不想研究,但会影响研究结果的,需要加以考虑的变量。 http://blog.sciencenet.cn/blog-334577-426759.html
也就是说,我们将控制变量也当成变量进行回归,例如,将行业也加入到回归中,就表示行业控制。那么怎么加?将所有的行业名称作为新的列添加到原始数据中,该列的数值取值为0或者1,如果该行数据的原始控制变量和列名称一致,则取值1,否则为0。这样就将该控制变量也考虑到回归中。
# 年度控制和行业控制的添加很简单,只需要使用下列函数即可。
data = pd.get_dummies(data=data, columns=['ind', 'year'])
# 单独的行业控制
data = pd.get_dummies(data=data, columns=['ind'])
# 单独的年度控制
data = pd.get_dummies(data=data, columns=['year'])
#之后,将生成的列也添加到线性回归中进行分析即可。pd.get_dummies会自动帮你生成需要的列。