(Python) 使用Scikits Bootstrap估计回归参数置信区间

7

我刚开始尝试使用scikits提供的一个很好的引导包:https://github.com/cgevans/scikits-bootstrap

但是在尝试从线性回归中估计相关系数的置信区间时,我遇到了一个问题。返回的置信区间完全位于原始统计数据范围之外。

以下是代码:

import numpy as np
from scipy import stats
import bootstrap as boot

np.random.seed(0)
x     = np.arange(10)
y     = 10 + 1.5*x + 2*np.random.randn(10)
r0    = stats.linregress(x, y)[2]

def my_function(y):
    return stats.linregress(x, y)[2]

ci    = boot.ci(y, statfunction=my_function, alpha=0.05, n_samples=1000, method='pi')

这会得到 ci = [-0.605, 0.644] 的结果,但原始统计量为 r0=0.894。
我已经在 R 中尝试过并且看起来它在那里能够正常工作:ci 跨越了预期的 r0。
请帮忙!
1个回答

10

你能提供一下你的R代码吗?我很想知道在R中如何处理这个问题。

这里的问题是你只传递了y给boot.ci,但每次它运行my_function时,它都使用整个原始的x(注意my_function没有x输入)。引导应用统计函数到重采样数据,因此如果你使用原始的x和一个样本的y来应用你的统计函数,你会得到一个毫无意义的结果。这就是BCA方法实际上根本不起作用的原因:它不能将你的统计函数应用于具有不同元素数量的jackknife样本。

样本沿轴0(行)取样,因此如果你想将多个1D数组传递给你的统计函数,你可以使用多个列:xy = vstack((x,y)).T会起作用,然后使用一个从这些列中获取数据的statfunction:

def my_function(xysample):
    return stats.linregress(xysample[:,0], xysample[:,1])[2]

或者,如果您想完全避免操作数据,可以定义一个仅对索引进行操作的函数,然后将索引传递给boot.ci:

def my_function2(i):
    return stats.linregress(x[i], y[i])[2]

boot.ci(np.arange(len(x)), statfunction=my_function2, alpha=0.05, n_samples=1000, method='pi')

请注意,无论哪种情况,BCA都能发挥作用,因此除非您真正想使用百分比间隔,否则最好使用 method='bca'。BCA几乎总是更好的。
我确实意识到这两种方法都不太理想。老实说,我从来没有需要像这样将多个数组传递给我的statfunction,大多数人可能正在使用mean作为他们的statfunction。我认为这里最好的想法可能是允许通过列表传递大小相等的数组,例如 boot.ci([x,y],...),然后同时对所有这些进行采样,并将它们作为单独的参数传递给statfunction。在这种情况下,您可以只有一个my_function(x,y)。我会看看我是否能做到这一点,但如果您能向我展示您的R代码,那就太好了,因为我想看看是否有更好的处理方式。
更新:
在最新版本的scikits.bootstrap(v0.3.1)中,可以提供一组数组,并将从它们中取样的结果作为单独的参数传递给statfunction。此外,statfunction可以提供数组输出,并且将计算每个输出点的置信区间。因此,现在非常容易实现这一点。以下内容将为linregress的每个输出提供置信区间:
cis = boot.ci( (x,y), statfunction=stats.linregress )

在这种情况下,cis[:,2] 将是所需的置信区间。

非常感谢您的优秀回复,效果很不错。在R中,似乎是通过将整个数据结构(甚至显式模型)传递到统计计算函数来实现的。请参阅:http://www.statmethods.net/advstats/bootstrapping.html - ToddP
5
谢谢提出这个问题;顺便说一下,看起来你可能是 stack overflow 的新手,所以我想提醒一下,在左边的复选标记中接受一个好的答案是有帮助的,这样其他人就会知道问题已经得到了解答。 - cge

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接