你能提供一下你的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]
将是所需的置信区间。