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])
注意:我忘记为随机数添加种子,因此无法复制这些数字。注意:添加种子的编辑不起作用。它需要使用numpynp.random.seed
而不是pythonrandom
内置包,这是我的懒惰。建议进行新的编辑。谢谢我从@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])