我在使用patsy准备分类数据进行回归分析,并希望将列名映射到DesignMatrix
中的索引。我尝试使用DesignInfo
对象的column_name_indexes
属性,但列名已经被修改以反映编码方式。
使用文档中的数据示例:
>>> from patsy import demo_data, dmatrix>>> data = demo_data("a", nlevels=3)>>> data{'a': ['a1', 'a2', 'a3', 'a1', 'a2', 'a3']}>>> x = dmatrix("a", data)>>> xDesignMatrix 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_indexesOrderedDict([('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]'
)?
回答:
一般来说,像a2
这样的分类值与设计矩阵列之间没有一对一的映射。你所谈论的列已经比这更复杂了——它是a2
和a1
值之间的处理对比——而且事情可以比这更复杂(例如,考虑Helmert或多项式编码)。
如果你知道你想查找变量a
的a2
相关联的处理对比,那么你可以使用
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")
这看起来有点傻,但它应该能工作,考虑到上面提到的普遍问题,我不确定有什么更好的方法。