Python 评估STATSOLS拟合特定类别的斜率和误差

Python 评估STATSOLS拟合特定类别的斜率和误差,python,pandas,statsmodels,Python,Pandas,Statsmodels,我有一个数据框df,包含以下字段:weight、length和animal。前两个是连续变量,animal是一个分类变量,其值分别为cat、dog和snake 我想估计体重和长度之间的关系,但这需要根据动物的类型进行调整,因此我将长度变量与动物分类变量进行交互 model = ols(formula='weight ~ length * animal', data=df) results = model.fit() 如何以编程方式提取重量和长度之间关系的斜率(例如蛇)?我了解如何手动执行此操作

我有一个数据框
df
,包含以下字段:
weight
length
animal
。前两个是连续变量,
animal
是一个分类变量,其值分别为
cat
dog
snake

我想估计体重和长度之间的关系,但这需要根据动物的类型进行调整,因此我将长度变量与
动物
分类变量进行交互

model = ols(formula='weight ~ length * animal', data=df)
results = model.fit()
如何以编程方式提取重量和长度之间关系的斜率(例如蛇)?我了解如何手动执行此操作:将
长度的系数添加到
动物[T.snake]:长度的系数中。但是这有点麻烦,需要手工操作,需要我专门处理基本情况,所以我想自动提取这些信息

此外,我想估计这个斜率的误差。我相信我了解如何通过结合标准误差和协方差(更准确地说,执行计算)来计算这一点。但这比上面提到的还要麻烦,我同样想知道是否有一种捷径可以提取这些信息

我的手工计算方法如下

编辑(06/22/2015):我下面的原始代码中似乎有一个计算错误的错误。user333700的答案中计算出的标准误差与我计算出的不同,但我没有花任何时间来找出原因

def get_contained_animal(animals, p):
    # This relies on parameters of the form animal[T.snake]:length.
    for a in animals:
        if a in p:
            return a
    return None

animals = ['cat', 'dog', 'snake']
slopes = {}
errors = {}
for animal in animals:
    slope = 0.
    params = []
    # If this param is related to the length variable and
    # the animal in question, add it to the slope.
    for param, val in results.params.iteritems():
        ac = get_contained_animal(animals, param)
        if (param == 'length' or 
            ('length' in param and 
             ac is None or ac == animal)):
            params.append(param)
            slope += val

    # Calculate the overall error by adding standard errors and 
    # covariances.
    tot_err = 0.
    for i, p1 in enumerate(params):
        tot_err += results.bse[p1]*results.bse[p1]
        for j, p2 in enumerate(params[i:]):
            # add covariance of these parameters
            tot_err += 2*results.cov_params()[p1][p2]

    slopes[animal] = slope
    errors[animal] = tot_err**0.5
这段代码似乎有些过分,但在我的实际用例中,我有一个连续变量与两个独立的分类变量交互,每个变量都有大量的类别(以及模型中我需要忽略的其他术语)。

非常简短的背景:

这方面的一般问题是,如果我们改变解释变量的数量,保持其他解释变量不变或对这些变量求平均值,预测会如何变化

在非线性离散模型中,有一种特殊的边际方法来计算这一点,尽管它不适用于分类变量的变化

在线性模型中,预测和预测中的变化只是估计参数的线性函数,我们可以(错误地)使用
t_检验
为我们计算影响、其标准误差和置信区间

(旁白:有更多的辅助方法正在为statsmodels工作,以使预测和利润计算更容易,并且很可能在今年晚些时候提供。)

作为以下代码的简要说明:

  • 我举了一个类似的例子
  • 我为每种动物类型定义长度=1或2的解释变量
  • 然后,我计算这些解释变量的差异
  • 这定义了可用于t_测试的参数的线性组合或对比度
最后,我与predict的结果进行比较,以检查我没有犯任何明显的错误。(我认为这是正确的,但我写得相当快。)

最后一次打印的结果是

                             Test for Constraints                             
==============================================================================
                 coef    std err          t      P>|t|      [95.0% Conf. Int.]
------------------------------------------------------------------------------
cat            1.0980      0.280      3.926      0.002         0.498     1.698
dog            0.9664      0.860      1.124      0.280        -0.878     2.811
snake          1.5930      0.428      3.720      0.002         0.675     2.511
如果给定动物类型的长度从1增加到2,我们可以使用预测和比较预测体重的差异来验证结果:

>>> [res.predict({'length': 2, 'animal':[an]}) - res.predict({'length': 1, 'animal':[an]}) for an in animal_names]
[array([ 1.09801656]), array([ 0.96641455]), array([ 1.59301594])]
>>> tt.effect
array([ 1.09801656,  0.96641455,  1.59301594])

注意:我忘记为随机数添加种子,因此无法复制这些数字。

注意:添加种子的编辑不起作用。它需要使用numpy
np.random.seed
而不是python
random
内置包,这是我的懒惰。建议进行新的编辑。谢谢我从@abeboparebop的编辑中复制了添加随机种子和调整后的数字(该编辑被评审员拒绝)。对于两个参数之和的情况,标准误差公式看起来是正确的。但是,我认为您没有在与
斜率
计算相对应的标准误差计算中选择
参数
。此外,除了两个参数之和,这种计算不容易推广到其他情况。
>>> [res.predict({'length': 2, 'animal':[an]}) - res.predict({'length': 1, 'animal':[an]}) for an in animal_names]
[array([ 1.09801656]), array([ 0.96641455]), array([ 1.59301594])]
>>> tt.effect
array([ 1.09801656,  0.96641455,  1.59301594])