- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个数据帧df
,其中包含以下字段:weight
、length
和animal
。前 2 个是连续变量,而 animal
是一个分类变量,其值为 cat
、dog
和 snake
.
我想估计体重和长度之间的关系,但这需要以动物的类型为条件,因此我将长度变量与animal
分类变量进行交互。
model = ols(formula='weight ~ length * animal', data=df)
results = model.fit()
如何以编程方式提取重量和长度之间关系的斜率,例如蛇?我了解如何手动执行此操作:将 length
的系数添加到 animal[T.snake]:length
的系数中。但这有点麻烦和手动,并且需要我专门处理基本情况,所以我想自动提取这些信息。
此外,我想估计这个斜率上的误差。我相信我了解如何通过结合标准误差和协方差来计算它(更准确地说,执行计算 here )。但这比上面的更麻烦,我同样想知道是否有提取此信息的快捷方式。
我的手动计算方法如下。
编辑(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
这段代码可能看起来有点矫枉过正,但在我的实际用例中,我有一个连续变量与两个单独的分类变量交互,每个变量都有大量类别(以及模型中我需要忽略的其他术语)用于这些目的)。
最佳答案
非常简短的背景:
一般的问题是,如果我们改变解释变量,保持其他解释变量固定或对这些变量取平均值,预测会如何变化。
在非线性离散模型中,有一种特殊的 Margins 方法可以计算这一点,尽管它没有针对分类变量的变化实现。
在线性模型中,预测和预测的变化只是估计参数的线性函数,我们可以(错误)使用t_test
来计算效果、其标准误差和置信区间对于我们来说。
(旁白:statsmodels 正在开发更多辅助方法,使预测和利润计算变得更容易,并且很可能在今年晚些时候推出。)
作为以下代码的简要说明:
最后,我与预测的结果进行比较,以检查我没有犯任何明显的错误。 (我认为这是正确的,但我写得很快。)
import numpy as np
import pandas as pd
from statsmodels.regression.linear_model import OLS
np.random.seed(2)
nobs = 20
animal_names = np.array(['cat', 'dog', 'snake'])
animal_idx = np.random.random_integers(0, 2, size=nobs)
animal = animal_names[animal_idx]
length = np.random.randn(nobs) + animal_idx
weight = np.random.randn(nobs) + animal_idx + length
data = pd.DataFrame(dict(length=length, weight=weight, animal=animal))
res = OLS.from_formula('weight ~ length * animal', data=data).fit()
print(res.summary())
data_predict1 = data = pd.DataFrame(dict(length=np.ones(3), weight=np.ones(3),
animal=animal_names))
data_predict2 = data = pd.DataFrame(dict(length=2*np.ones(3), weight=np.ones(3),
animal=animal_names))
import patsy
x1 = patsy.dmatrix('length * animal', data_predict1)
x2 = patsy.dmatrix('length * animal', data_predict2)
tt = res.t_test(x2 - x1)
print(tt.summary(xname=animal_names.tolist()))
最后打印的结果是
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])
注意:我忘记为随机数添加种子,因此这些数字无法复制。
关于python - 评估 statsmodels ols 拟合的特定类别的斜率和误差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30948997/
我有一个任务,必须求解线性方程组 Ax =B,其中 A 是 10000 量级的稀疏矩阵。我正在使用 csparse 来求解它。在我的初始实现中,出于演示目的,A 是 3*3 阶单位矩阵,B ={1,2
我正在尝试训练随机森林模型,但出现以下错误。我需要对分类模型使用不同的设置来解决 RMSE 问题吗?我尝试将“好”转换为一个因素,但这引发了一个新错误。 错误: Error in train.defa
当使用 %Lf 打印时,一个大的 double 值被改变以下组合的值给出正确的结果小数点前9位/小数点后6位例如用 %Lf 打印的小数点前 9 位的值输入:3435537287.32输出:343553
我正在尝试实现高度为 100% 的重复垂直背景。遗憾的是,每当我试图通过仅添加纯文本来扩展页面的高度时,具有 100% 高度和背景重复的背景就会被切掉。我只想让背景重复。这是屏幕截图。 http://
所以我有: t = [0.0, 3.0, 5.0, 7.2, 10.0, 13.0, 15.0, 20.0, 25.0, 30.0, 35.0] U = [12.5, 10.0, 7.6, 6.0,
我使用了 Nister 的 5 点法来计算基本矩阵。使用 RANSAC 和 Sampson 错误阈值进一步改进了异常值拒绝。我随机选择 5 个点集,估计基本矩阵并评估匹配向量的 Sampson 误差。
为分类问题运行 gbm 函数时。我收到以下错误: Error in res[flag, ] 0.5,1,0) table(pred,df$Group) pred 0 1 0 98
我使用 Angular ngTagsInput,我的列表如下: [{text: "4353453"}, {text: "453453"}, {text: "4534534"}, {text: "53
我正在尝试 Angular 问题,并且坚持理解错误,这意味着如果我无法理解错误,我将无法前进,例如 zone.js:654 Unhandled Promise rejection: Failed to
我有一个关于在线性混合模型上运行事后测试的问题: 我正在 lme4 中运行一个线性混合模型,分为 3 组,每组 5 条蛇,每组采用不同的通气率 (Vent),在不同的位置进行测量时间点 (Time),
我正在尝试运行逻辑回归并不断收到“NA”错误。问题是它说有 NA 的列没有 NA,全是 0 或 1。我的代码如下: #V1=race, V2=momcounts of breast cancer, V
我在输出之间得到随机 NaN。 Random Temp:61.816288952756864 'F Random Temp:NaN 'F Random Temp:NaN 'F Random Temp:
我正在尝试通过取下平板框架来减少我的大炮天文图像,这很有效。但它使所有值都非常低(所以几乎是黑色图片),这就是为什么我也想将其乘以平均值。然而这给了我一个错误。 (虽然没有乘法它也能工作。) 有人知道
我正在使用 adaboost 构建一个模型,并尝试让 roc 图发挥作用。这是我的代码: ens=fitensemble(X,y,'AdaBoostM1',100,'Tree'); [ytest, s
当尝试使用 Protractor 和 Angular Testing 模态窗口上的可见按钮时,我收到以下错误: UnknownError: unknown error: Element is not
我正在尝试使用命令通过 Yeoman 构建 Angular “哟有 Angular ” 一切正常,直到我到达 tmp 目录: npm ERR! Error: EACCES, mkdir '/home/
我在使用 OpenCV 计算立体声对的校正时遇到一些问题:stereoCalibrate 返回高均方根误差,我得到了错误的校正对。我尝试了我的整改程序和 opencv 提供的 stereo_calib
我在 Mac (OS X 10.9) 上安装了 Yeoman,并且正在尝试运行 yo angular。 我收到以下错误: path.js:384 throw new TypeError('Ar
我有运行循环的线程。我需要该循环每 5 毫秒运行一次(1 毫秒错误)。我知道 Sleep() 函数并不精确。 你有什么建议吗? 更新。我不能用其他方式做到这一点。在循环结束时,我需要某种 sleep
我一直在试验 FFT 算法。我使用 NAudio 以及来自互联网的 FFT 算法的工作代码。根据我对性能的观察,生成的音调不准确。 我将 MIDI(从 GuitarPro 生成)转换为 WAV 文件(
我是一名优秀的程序员,十分优秀!