[英]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=False
与pd.read_stata
一起使用来读入数值。
@Wouter 解决方案的另一个第二行可能是:
gss.loc[gss.age=='89 or older','age']='89'
有关更多详细信息,请参阅此关于基于条件替换的讨论。
当然,这种替换是否合适取决于您的用例。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.