繁体   English   中英

在 Python 中使用 Stata 数据运行 OLS 时出现问题

[英]Problem Running OLS with Stata Data in Python

读取 Stata 数据后,我在 Python 中运行 OLS 时遇到问题。 以下是我的代码和错误信息

import pandas as pd  # To read data
import numpy as np
import statsmodels.api as sm

gss = pd.read_stata("gssSample.dta", preserve_dtypes=False)
X = gss[['age', 'impinc' ]]
y = gss[['educ']]
X = sm.add_constant(X) # adding a constant
model = sm.OLS(y, X).fit()
print(model.summary())

错误消息说:

ValueError: Pandas data cast to numpy dtype of object. Check input data with np.asarray(data).

那么有什么想法可以运行这个简单的 OLS 吗?

您的age变量包含一个值"89 or older" ,这导致它被读取为一个字符串,这不是statsmodels的有效输入。 你必须处理它,这样它才能被读作 integer 或浮点数,例如:

gss = pd.read_stata("gssSample.dta", preserve_dtypes=False)
gss = gss[gss.age != '89 or older']
gss['age'] = gss.age.astype(float)
X = gss[['age', 'impinc' ]]
y = gss[['educ']]
X = sm.add_constant(X) # adding a constant
model = sm.OLS(y, X).fit()
print(model.summary())

PS 我并不是说在age == "89 or older"的地方放弃观察是最好的方法。 你必须决定如何最好地处理这个问题。 如果你想在你的 model 中有一个分类变量,你必须先创建虚拟变量。

编辑:如果您的.dta 文件包含带有值标签的数值,则默认情况下值标签将用作值,导致它被读取为字符串。 您可以将convert_categoricals=Falsepd.read_stata一起使用来读入数值。

@Wouter 解决方案的另一个第二行可能是:

gss.loc[gss.age=='89 or older','age']='89'

有关更多详细信息,请参阅此关于基于条件替换的讨论

当然,这种替换是否合适取决于您的用例。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM