你能提供你的R码吗?我很想知道R是怎么处理的
这里的问题是,您只需将y传递给boot.ci,但每次它运行myu函数时,它都会使用整个原始的x(请注意,myu函数缺少x输入)。Bootstrapping将统计函数应用于重新采样的数据,因此,如果使用原始的x和y样本应用统计函数,将得到一个不合理的结果。实际上,这就是BCA方法根本不起作用的原因:它无法将统计函数应用于元素数量不相同的jackknife样本。
采样沿0轴(行)进行,因此如果要将多个1D数组传递给统计函数,可以使用多个列:xy = vstack((x,y)).T将起作用,然后使用从这些列获取数据的statf函数: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。我认为这里最好的方法是允许传递相同大小[0]数组的列表,例如,boot.ci([x,y],...),然后同时对所有这些数组进行采样,并将它们作为单独的参数传递给statfunction。在这种情况下,您只需要一个my_function(x,y)。我会看看我能不能做到,但如果你能给我看你的R代码,那就太好了,因为我想看看是否有更好的方法来处理这个问题。
更新:
在最新版本的scikits.bootstrap(v0.3.1)中,可以提供数组的元组,并将其样本作为单独的参数传递给statfunction。此外,statfunction可以提供数组输出,并且将为输出中的每个点计算置信区间。因此,现在很容易做到这一点。以下将给出线性回归的每个输出的置信区间:cis = boot.ci( (x,y), statfunction=stats.linregress )
在这种情况下,cis[:,2]将是所需的置信区间。