2013-05-23 30 views
5

Sadece scikits aracılığıyla kullanılabilen güzel bir önyükleme paketi denemek için başladım önyükleyebilmek: https://github.com/cgevans/scikits-bootstrap(Python) tahmin regresyon parametre güven aralıkları

ama için güven aralıklarının tahmini çalışırken bir sorunla karşılaştık doğrusal regresyondan korelasyon katsayısı. Geri verilen güven aralıkları, orijinal istatistik aralığının dışında kalmaktadır. Burada

kodudur: Bu ci = [-0,605, 0.644] bir sonucu verir

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') 

, ancak orijinal istatistik r0 = 0.894 olan.

Bunu R'de denedim ve iyi çalışıyor gibi görünüyor: ci, beklendiği gibi r0'ı aşıyor.

Lütfen yardım edin!

cevap

8

R kodunuzu verebilir misiniz? Bu sorunun nasıl halledildiğini bilmek isterdim.

Burada sorun boot.ci'ye sadece y geçiyor olmanızdır, fakat my_function işlevini her çalıştırdığında, orijinal x (my_function için x giriş eksikliğini not edin). Önyükleme, istatistik işlevini yeniden örneklenen verilere uygular; bu nedenle, x numaralı orijinali ve y numaralı bir örneği kullanarak istatistik işlevinizi uygularsanız, saçma bir sonuç elde edersiniz. Bu yüzden BCA yöntemi hiç işe yaramıyor, aslında: istatistik fonksiyonunuzu aynı sayıda elemanı olmayan jackknife örneklerine uygulayamaz.

Örnekler, eksen 0 (satırlar) boyunca alınır, böylece birden çok 1D dizisini istatistik işlevinize iletmek isterseniz, birden çok sütun kullanabilirsiniz: xy = vstack((x,y)).T çalışır ve bu sütunlardan veri alan bir işlev kullanır: Eğer hiç verilerinizin karıştırmasını önlemek istiyorsa

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

Alternatif olarak, endeksler üzerinde faaliyet gösteren bir işlevi tanımlamak olabilir ve o zaman sadece boot.ci için endeksler geçmesi:

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') 

Not o bu davalardan birinde, BCA Çalışır, bu yüzden gerçekten yüzdelik aralıklarını kullanmak istemediğiniz sürece method = 'bca' kullanabilirsiniz; BCA hemen hemen her zaman daha iyidir.

Her iki yöntemin de idealin altında olduğunu anlıyorum. Dürüst olmak gerekirse, bu gibi işlevler için birden fazla diziyi geçme gereği duymadım ve insanların büyük bir çoğunluğu mean işlevini kullanıyor. Bence buradaki en iyi fikir, eşit boyutta [0] dizilerin listelenmesine izin vermek, örneğin, boot.ci([x,y],...), ve tüm bunları aynı anda örneklemek ve hepsini bağımsız değişkenler olarak göstergeye iletmek olabilir. Bu durumda, sadece bir my_function(x,y) olabilir. Bunu yapabileceğimi göreceğim, ama eğer R kodunuzu gösterebilirseniz, bu harika olurdu, bununla ilgili daha iyi bir yol olup olmadığını görmek istiyorum.


Güncelleme:

scikits.bootstrap (v0.3.1) en son sürümünde

, diziler bir tanımlama grubu sağlanabilir ve onlardan örnekler statfunction ayrı argümanlar olarak geçirilir. Ek olarak, arıza dizi çıkışı sağlayabilir ve çıktıdaki her nokta için güven aralıkları hesaplanacaktır.Böylece, bu şimdi yapmak çok kolay. Aşağıdaki linregress her çıkış için güven aralıkları verecektir: Bu durumda

cis = boot.ci((x,y), statfunction=stats.linregress) 

cis[:,2] istenen güven aralığı olacaktır.

+0

Mükemmel yanıtınız için teşekkürler, iyi çalıştı. R'de, benzer bir şekilde, bir veri yapısının (ve hatta açık bir modelin) istatistik hesaplama işlevine geçirilmesiyle gerçekleştirildiği görülmektedir: http://www.statmethods.net/advstats/bootstrapping.html – ToddP

+3

Şunlar için teşekkürler bunu gündeme getirmek; Bu arada, taşma yapmak için yeni olabileceğiniz görülüyor, bu yüzden, soldaki onay işaretiyle iyi bir cevabı kabul etmenin yararlı olduğunu belirtmem gerektiğini düşündüm, böylece başkalarının da sorunun yanıtlandığını bilmesi gerekiyor. – cge

+0

@ user2269232 cevabı kabul etmiş sayılırsınız. Bir ya da iki kimse kimseyi öldürmeyecek. – rll