簡體   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