<Python + Patsy> 为什么虚拟变量的名称 with/without T?
<Python + Patsy> Why Name of dummy variables with/without T?
使用 patsy
,我注意到它有时用 T
命名虚拟变量,而在其他情况下不使用 T
。今天我意识到回归方程中有常数项时附加T
,没有常数项则没有T
。例如比较z[T.1]
、z[0]
、z[1]
,在下面的代码中用OUTPUT
表示。
import pandas as pd
import patsy
data = {'z': ['1', '0', '0'],
'y': [150, 200, 50],
'x': [200, 210, 90]}
df = pd.DataFrame(data)
# with constant -----------------------
form_const = 'y ~ x + z'
y_const, X_const = patsy.dmatrices(form_const, df, return_type='dataframe')
print(X_const.columns.tolist())
# ['Intercept', 'z[T.1]', 'x'] <- OUTPUT
# withOUT constant --------------------
form_no_const = 'y ~ -1 + x + z'
y_no_const, X_no_const = patsy.dmatrices(form_no_const, df, return_type='dataframe')
print(X_no_const.columns.tolist())
# ['z[0]', 'z[1]', 'x'] <- OUTPUT
问题
T
的作用是什么?它是否只是表明常数项的存在?如果是这样,那岂不是多余,因为我们总能看到常数项的presence/absence?还有其他角色吗?
提前感谢您的见解。
有很多不同的方法可以在回归中对分类变量进行编码。它们产生相同的预测,但实际的 beta 系数不同,如果你想解释 beta 或对它们进行假设检验,你需要知道使用了哪种编码。
Patsy 使用这些名称作为正在使用的编码系统的提示。当存在 "T" 时,即 "treatment coding",并且 beta 系数告诉您给定类别 的响应与某个基线类别有何不同。当没有 "T" 时,beta 系数不是差异,它们只是该类别的预测。
patsy 有时使用一种而有时使用另一种的原因是 patsy 会自动尝试找到全等级编码,其中所有 beta 都具有唯一且可解释的值。 (另一种选择是 "overdetermined" 模型,其中有无限多的 beta 给出相同的预测,您需要添加一些额外的任意约束来拟合模型。)如果您的模型中有截距项,则它提供了一个开始的自由度,当 patsy 去添加分类变量时,它检测到并使用 (n-1) 维编码,如治疗编码,你得到 "T"。如果没有截距项,则它使用 n 维编码,并且您不会得到 "T".
Patsy 还允许您选择不同的编码方案,甚至定义您自己的编码方案:https://patsy.readthedocs.io/en/latest/API-reference.html#handling-categorical-data
有关 patsy 和一般编码方案的更多信息,请参阅:
使用 patsy
,我注意到它有时用 T
命名虚拟变量,而在其他情况下不使用 T
。今天我意识到回归方程中有常数项时附加T
,没有常数项则没有T
。例如比较z[T.1]
、z[0]
、z[1]
,在下面的代码中用OUTPUT
表示。
import pandas as pd
import patsy
data = {'z': ['1', '0', '0'],
'y': [150, 200, 50],
'x': [200, 210, 90]}
df = pd.DataFrame(data)
# with constant -----------------------
form_const = 'y ~ x + z'
y_const, X_const = patsy.dmatrices(form_const, df, return_type='dataframe')
print(X_const.columns.tolist())
# ['Intercept', 'z[T.1]', 'x'] <- OUTPUT
# withOUT constant --------------------
form_no_const = 'y ~ -1 + x + z'
y_no_const, X_no_const = patsy.dmatrices(form_no_const, df, return_type='dataframe')
print(X_no_const.columns.tolist())
# ['z[0]', 'z[1]', 'x'] <- OUTPUT
问题
T
的作用是什么?它是否只是表明常数项的存在?如果是这样,那岂不是多余,因为我们总能看到常数项的presence/absence?还有其他角色吗?
提前感谢您的见解。
有很多不同的方法可以在回归中对分类变量进行编码。它们产生相同的预测,但实际的 beta 系数不同,如果你想解释 beta 或对它们进行假设检验,你需要知道使用了哪种编码。
Patsy 使用这些名称作为正在使用的编码系统的提示。当存在 "T" 时,即 "treatment coding",并且 beta 系数告诉您给定类别 的响应与某个基线类别有何不同。当没有 "T" 时,beta 系数不是差异,它们只是该类别的预测。
patsy 有时使用一种而有时使用另一种的原因是 patsy 会自动尝试找到全等级编码,其中所有 beta 都具有唯一且可解释的值。 (另一种选择是 "overdetermined" 模型,其中有无限多的 beta 给出相同的预测,您需要添加一些额外的任意约束来拟合模型。)如果您的模型中有截距项,则它提供了一个开始的自由度,当 patsy 去添加分类变量时,它检测到并使用 (n-1) 维编码,如治疗编码,你得到 "T"。如果没有截距项,则它使用 n 维编码,并且您不会得到 "T".
Patsy 还允许您选择不同的编码方案,甚至定义您自己的编码方案:https://patsy.readthedocs.io/en/latest/API-reference.html#handling-categorical-data
有关 patsy 和一般编码方案的更多信息,请参阅: