dmatrices 看不到列
dmatrices don't see a column
我在下面有这段代码,假设在给定的列上创建 2 个数据框。 df的Region列有5个变量; W、E、N、S 和 C。但是,结果数据框只有 W、E、N、S 和截距列。
import statsmodels.api as sm
from patsy import dmatrices
df = sm.datasets.get_rdataset('Guerry','HistData').data
vars = ['Department','Lottery','Literacy','Wealth','Region']
df = df[vars]
df = df.dropna()
# Department Lottery Literacy Wealth Region
# 0 Ain 41 37 73 E
# 1 Aisne 38 51 22 N
# 2 Allier 66 13 61 C
# 3 Basses-Alpes 80 46 76 E
# 4 Hautes-Alpes 79 69 83 E
y, X = dmatrices('Lottery ~ Literacy + Wealth + Region', data=df, return_type='dataframe')
print(X.columns.tolist())
# ['Intercept', 'Region[T.E]', 'Region[T.N]', 'Region[T.S]', 'Region[T.W]', 'Literacy', 'Wealth']
当我如下更改到最后一行时,它工作正常并显示 5 个区域值
数据框。
y, X = dmatrices('Literacy + Wealth + Region ~ Lottery', data=df, return_type='dataframe')
print(y.columns.tolist())
# ['Region[C]', 'Region[E]', 'Region[N]', 'Region[S]', 'Region[W]', 'Literacy', 'Wealth']
谁能解释一下这是什么原因?在第一个代码而不是区域 C 上创建的拦截列是什么?
Patsy automatically adds a constant "Intercept" term 到右侧
公式。这导致设计矩阵的截距列全为 1。
For example
import pandas as pd
import patsy
data = patsy.demo_data("a", "b", "y")
# a b y
# 0 a1 b1 1.764052
# 1 a1 b2 0.400157
# 2 a2 b1 0.978738
# 3 a2 b2 2.240893
# 4 a1 b1 1.867558
# 5 a1 b2 -0.977278
# 6 a2 b1 0.950088
# 7 a2 b2 -0.151357
mat = patsy.dmatrices("y ~ a + b ", data, return_type='dataframe')[1]
print(mat)
产量
Intercept a[T.a2] b[T.b2]
0 1.0 0.0 0.0
1 1.0 0.0 1.0
2 1.0 1.0 0.0
3 1.0 1.0 1.0
4 1.0 0.0 0.0
5 1.0 0.0 1.0
6 1.0 1.0 0.0
7 1.0 1.0 1.0
Patsy 分析公式两边的表达式,只添加新的
需要这样的条款时的条款 以增加所需的灵活性
模型。就设计矩阵而言,这意味着未添加新列
除非列跨越的向量 space 通过添加扩展
新专栏。换句话说,一个新列已经在
其他列将是多余的,因此不会添加。
当你有一个必须等于 W、E、N、S 或 C 的分类变量时,知道变量的值不是 W、E、N 或 S 等同于知道变量等于 C .
查看上一个示例的输出。知道 a
变量
不是 a2
等同于知道它等于 a1
。在设计方面
矩阵,列 space 不会因包含 a1
列而增加,因为
Intercept - a2
是 a1
。 (下面,a1
列标记为 a[T.a1]
,并且
同样适用于 a2
):
Intercept a[T.a2] b[T.b2] a[T.a1]
0 1.0 0.0 0.0 1.0
1 1.0 0.0 1.0 1.0
2 1.0 1.0 0.0 0.0
3 1.0 1.0 1.0 0.0
4 1.0 0.0 0.0 1.0
5 1.0 0.0 1.0 1.0
6 1.0 1.0 0.0 0.0
7 1.0 1.0 1.0 0.0
同样,在您的情况下,没有为分类值 C 添加列,
因为截距 - (W + E + N + S) 等于 C.
现在我们可以return您的原始代码并更清楚地理解结果:
import statsmodels.api as sm
from patsy import dmatrices
df = sm.datasets.get_rdataset('Guerry','HistData').data
vars_ = ['Department','Lottery','Literacy','Wealth','Region']
df = df[vars_]
df = df.dropna()
formula1 = 'Lottery ~ Literacy + Wealth + Region'
print(formula1)
y1, X1 = dmatrices(formula1, data=df, return_type='dataframe')
print('LHS: {}'.format(y1.columns.tolist()))
# ['Lottery'],
print('RHS: {}'.format(X1.columns.tolist()))
# ['Intercept', 'Region[T.E]', 'Region[T.N]', 'Region[T.S]', 'Region[T.W]', 'Literacy', 'Wealth']
formula2 = 'Literacy + Wealth + Region ~ Lottery'
print(formula2)
y2, X2 = dmatrices(formula2, data=df, return_type='dataframe')
print('LHS: {}'.format(y2.columns.tolist()))
# ['Region[C]', 'Region[E]', 'Region[N]', 'Region[S]', 'Region[W]', 'Literacy', 'Wealth']
print('RHS: {}'.format(X2.columns.tolist()))
# ['Intercept', 'Lottery']
请注意 Intercept
已自动添加到 右侧
每个公式。当同时存在截距项和分类项时
公式同侧的变量,分类变量的一个值
总是缺失,因为它的存在不会扩展设计矩阵的
列 space.
您可以通过在公式右侧包含 + 0
或包含 - 1
来告诉 patsy 不要添加截距列。他们都do the same thing.
formula3 = 'Lottery ~ Literacy + Wealth + Region + 0'
print(formula3)
y1, X1 = dmatrices(formula3, data=df, return_type='dataframe')
print('LHS: {}'.format(y1.columns.tolist()))
print('RHS: {}'.format(X1.columns.tolist()))
现在,右侧有一个 Region[C]
列:
LHS: ['Lottery']
RHS: ['Region[C]', 'Region[E]', 'Region[N]', 'Region[S]', 'Region[W]', 'Literacy', 'Wealth']
我在下面有这段代码,假设在给定的列上创建 2 个数据框。 df的Region列有5个变量; W、E、N、S 和 C。但是,结果数据框只有 W、E、N、S 和截距列。
import statsmodels.api as sm
from patsy import dmatrices
df = sm.datasets.get_rdataset('Guerry','HistData').data
vars = ['Department','Lottery','Literacy','Wealth','Region']
df = df[vars]
df = df.dropna()
# Department Lottery Literacy Wealth Region
# 0 Ain 41 37 73 E
# 1 Aisne 38 51 22 N
# 2 Allier 66 13 61 C
# 3 Basses-Alpes 80 46 76 E
# 4 Hautes-Alpes 79 69 83 E
y, X = dmatrices('Lottery ~ Literacy + Wealth + Region', data=df, return_type='dataframe')
print(X.columns.tolist())
# ['Intercept', 'Region[T.E]', 'Region[T.N]', 'Region[T.S]', 'Region[T.W]', 'Literacy', 'Wealth']
当我如下更改到最后一行时,它工作正常并显示 5 个区域值 数据框。
y, X = dmatrices('Literacy + Wealth + Region ~ Lottery', data=df, return_type='dataframe')
print(y.columns.tolist())
# ['Region[C]', 'Region[E]', 'Region[N]', 'Region[S]', 'Region[W]', 'Literacy', 'Wealth']
谁能解释一下这是什么原因?在第一个代码而不是区域 C 上创建的拦截列是什么?
Patsy automatically adds a constant "Intercept" term 到右侧 公式。这导致设计矩阵的截距列全为 1。 For example
import pandas as pd
import patsy
data = patsy.demo_data("a", "b", "y")
# a b y
# 0 a1 b1 1.764052
# 1 a1 b2 0.400157
# 2 a2 b1 0.978738
# 3 a2 b2 2.240893
# 4 a1 b1 1.867558
# 5 a1 b2 -0.977278
# 6 a2 b1 0.950088
# 7 a2 b2 -0.151357
mat = patsy.dmatrices("y ~ a + b ", data, return_type='dataframe')[1]
print(mat)
产量
Intercept a[T.a2] b[T.b2]
0 1.0 0.0 0.0
1 1.0 0.0 1.0
2 1.0 1.0 0.0
3 1.0 1.0 1.0
4 1.0 0.0 0.0
5 1.0 0.0 1.0
6 1.0 1.0 0.0
7 1.0 1.0 1.0
Patsy 分析公式两边的表达式,只添加新的 需要这样的条款时的条款 以增加所需的灵活性 模型。就设计矩阵而言,这意味着未添加新列 除非列跨越的向量 space 通过添加扩展 新专栏。换句话说,一个新列已经在 其他列将是多余的,因此不会添加。
当你有一个必须等于 W、E、N、S 或 C 的分类变量时,知道变量的值不是 W、E、N 或 S 等同于知道变量等于 C .
查看上一个示例的输出。知道 a
变量
不是 a2
等同于知道它等于 a1
。在设计方面
矩阵,列 space 不会因包含 a1
列而增加,因为
Intercept - a2
是 a1
。 (下面,a1
列标记为 a[T.a1]
,并且
同样适用于 a2
):
Intercept a[T.a2] b[T.b2] a[T.a1]
0 1.0 0.0 0.0 1.0
1 1.0 0.0 1.0 1.0
2 1.0 1.0 0.0 0.0
3 1.0 1.0 1.0 0.0
4 1.0 0.0 0.0 1.0
5 1.0 0.0 1.0 1.0
6 1.0 1.0 0.0 0.0
7 1.0 1.0 1.0 0.0
同样,在您的情况下,没有为分类值 C 添加列, 因为截距 - (W + E + N + S) 等于 C.
现在我们可以return您的原始代码并更清楚地理解结果:
import statsmodels.api as sm
from patsy import dmatrices
df = sm.datasets.get_rdataset('Guerry','HistData').data
vars_ = ['Department','Lottery','Literacy','Wealth','Region']
df = df[vars_]
df = df.dropna()
formula1 = 'Lottery ~ Literacy + Wealth + Region'
print(formula1)
y1, X1 = dmatrices(formula1, data=df, return_type='dataframe')
print('LHS: {}'.format(y1.columns.tolist()))
# ['Lottery'],
print('RHS: {}'.format(X1.columns.tolist()))
# ['Intercept', 'Region[T.E]', 'Region[T.N]', 'Region[T.S]', 'Region[T.W]', 'Literacy', 'Wealth']
formula2 = 'Literacy + Wealth + Region ~ Lottery'
print(formula2)
y2, X2 = dmatrices(formula2, data=df, return_type='dataframe')
print('LHS: {}'.format(y2.columns.tolist()))
# ['Region[C]', 'Region[E]', 'Region[N]', 'Region[S]', 'Region[W]', 'Literacy', 'Wealth']
print('RHS: {}'.format(X2.columns.tolist()))
# ['Intercept', 'Lottery']
请注意 Intercept
已自动添加到 右侧
每个公式。当同时存在截距项和分类项时
公式同侧的变量,分类变量的一个值
总是缺失,因为它的存在不会扩展设计矩阵的
列 space.
您可以通过在公式右侧包含 + 0
或包含 - 1
来告诉 patsy 不要添加截距列。他们都do the same thing.
formula3 = 'Lottery ~ Literacy + Wealth + Region + 0'
print(formula3)
y1, X1 = dmatrices(formula3, data=df, return_type='dataframe')
print('LHS: {}'.format(y1.columns.tolist()))
print('RHS: {}'.format(X1.columns.tolist()))
现在,右侧有一个 Region[C]
列:
LHS: ['Lottery']
RHS: ['Region[C]', 'Region[E]', 'Region[N]', 'Region[S]', 'Region[W]', 'Literacy', 'Wealth']