为啥 Statsmodels OLS 不支持在包含多个单词的列中读取?

Posted

技术标签:

【中文标题】为啥 Statsmodels OLS 不支持在包含多个单词的列中读取?【英文标题】:Why does Statsmodels OLS doesn't support reading in columns with multiple words?为什么 Statsmodels OLS 不支持在包含多个单词的列中读取? 【发布时间】:2019-03-22 12:29:37 【问题描述】:

我一直在尝试使用 Seaborn 的 lmplot() 和 Statsmodels .ols() 函数来绘制简单的线性回归图及其相关的 p 值、r 平方等。

我注意到,当我指定要用于 lmplot 的列时,我可以指定一个列,即使它有多个单词:

import seaborn as sns
import pandas as pd
input_csv = pd.read_csv('./test.csv',index_col = 0,header = 0)
input_csv

sns.lmplot(x='Age',y='Count of Specific Strands',data = input_csv)
<seaborn.axisgrid.FacetGrid at 0x2800985b710>

但是,如果我尝试使用 ols,则在输入“特定链数”作为我的因变量时会出现错误(我只列出了错误中的最后几行):

import statsmodels.formula.api as smf
test_results = smf.ols('Count of Specific Strands ~ Age',data = input_csv).fit()

File "<unknown>", line 1
    Count of Specific Strands
           ^
SyntaxError: invalid syntax

相反,如果我指定如下所示的“特定链计数”,则回归有效:

test_results = smf.ols('input_csv.iloc[:,1] ~ Age',data = input_csv).fit()
test_results.summary()

有人知道这是为什么吗?仅仅是因为 Statsmodels 的编写方式吗?是否有替代方法来指定不涉及 iloc 或 loc 的回归分析的因变量?

【问题讨论】:

【参考方案1】:

这是由于公式解析器patsy 的编写方式:参见this link for more information

patsy 的作者却想到了这个问题:(引自here)

不过,这种灵活性在一种情况下确实会产生问题——因为我们 将您在 + 号之间写的任何内容解释为 Python 代码, 实际上,您确实必须编写有效的 Python 代码。这可能很棘手 如果你的变量名中有有趣的字符,比如空格 或标点符号。幸运的是,patsy 有一个内置的“转换” 称为Q(),它可以让你“引用”这些变量

因此,在你的情况下,你应该能够写:

smf.ols('Q("Count of Specific Strands") ~ Age',data = input_csv).fit()

【讨论】:

以上是关于为啥 Statsmodels OLS 不支持在包含多个单词的列中读取?的主要内容,如果未能解决你的问题,请参考以下文章

为啥当我使用 statsmodels 进行 OLS 和使用 scikit 进行 PooledOLS 时得到相同的结果?

为啥我只能从 statsmodels OLS 拟合中获得一个参数

使用 statsmodels 忽略多个 OLS 回归中的缺失值

使用 statsmodels.formula.api 中的 ols - 如何删除常数项?

在 Python Statsmodels 中创建文件 OLS

AttributeError:模块“statsmodels.formula.api”没有属性“OLS”