0

我正在使用 patsy 为回归准备分类数据,并希望将列名映射到DesignMatrix. 我曾尝试使用对象的column_name_indexes属性,DesignInfo但列名已被修改以反映编码。

使用文档中的数据的示例:

>>> from patsy import demo_data, dmatrix
>>> data = demo_data("a", nlevels=3)
>>> data
{'a': ['a1', 'a2', 'a3', 'a1', 'a2', 'a3']}

>>> x = dmatrix("a", data)
>>> x
DesignMatrix with shape (6, 3)
  Intercept  a[T.a2]  a[T.a3]
          1        0        0
          1        1        0
          1        0        1
          1        0        0
          1        1        0
          1        0        1
  Terms:
    'Intercept' (column 0)
    'a' (columns 1:3)

>>> x.design_info.column_name_indexes
OrderedDict([('Intercept', 0), ('a[T.a2]', 1), ('a[T.a3]', 2)])

我希望能够'a2'通过调用来访问例如的列索引:

x.design_info.column_name_indexes['a2']

但当然会返回KeyError: 'a2'。因此,我必须自己构造修改后的键才能获得所需的列索引1

x.design_info.column_name_indexes['a[T.a2]']

有没有办法通过引用未修改的特征/列名来访问列索引,即'a2'不必构造修改后的键,即'a[T.a2]'

4

1 回答 1

1

a2通常,分类值(如和设计矩阵列)之间没有一对一的映射。您正在谈论的专栏已经比这更复杂了——它是a2a1值之间的处理对比——而且事情可能比这更复杂(例如,考虑 Helmert 或多项式编码)。

如果您知道要查找与a2变量相关的治疗对比a,那么您可以使用

def column_for_treatment(design_info, factor, value):
    column_name = "{}[T.{}]".format(factor, value)
    return design_info.column_name_indexes[colum_name]

column_for_treatment(x.design_info, "a", "a2")

这看起来有点傻,但它应该可以工作,鉴于上述一般问题,我不确定什么会更好。

于 2017-10-22T03:28:49.363 回答