2012-04-06 14 views
6

मैं एक और दो पूंछ स्वतंत्र टी परीक्षण के लिए टी सांख्यिकी और पी-मूल्यों की गणना करने के लिए अपने खुद के अजगर कोड लिखने की कोशिश कर रहा हूँ। मैं सामान्य अनुमान का उपयोग कर सकता हूं, लेकिन इस पल के लिए मैं केवल टी-वितरण का उपयोग करने की कोशिश कर रहा हूं। मैं अपने परीक्षण डेटा पर SciPy की सांख्यिकी लाइब्रेरी के परिणामों से मेल खाने में असफल रहा हूं। मैं आंखों की एक नई जोड़ी का उपयोग यह देखने के लिए कर सकता हूं कि मैं सिर्फ एक गूंगा गलती कर रहा हूं या नहीं।SciPy के `ttest_ind द्वारा बनाई गई मान्यताओं नीचे ट्रैकिंग()` समारोह

नोट, यह cross-posted from Cross-Validated है क्योंकि यह बिना किसी प्रतिक्रिया के थोड़ी देर के लिए रहा है, इसलिए मैंने सोचा कि यह कुछ सॉफ़्टवेयर डेवलपर राय प्राप्त करने के लिए भी चोट नहीं पहुंचा सकता है। मैं वहाँ एल्गोरिथ्म मैं उपयोग कर रहा हूँ, जो SciPy का परिणाम पुन: पेश करना चाहिए में कोई त्रुटि है, तो समझने की कोशिश कर रहा हूँ। यह एक साधारण एल्गोरिदम है, इसलिए यह परेशान है कि मैं गलती का पता क्यों नहीं लगा सकता।

मेरे कोड:

import numpy as np 
import scipy.stats as st 

def compute_t_stat(pop1,pop2): 

    num1 = pop1.shape[0]; num2 = pop2.shape[0]; 

    # The formula for t-stat when population variances differ. 
    t_stat = (np.mean(pop1) - np.mean(pop2))/np.sqrt(np.var(pop1)/num1 + np.var(pop2)/num2) 

    # ADDED: The Welch-Satterthwaite degrees of freedom. 
    df = ((np.var(pop1)/num1 + np.var(pop2)/num2)**(2.0))/( (np.var(pop1)/num1)**(2.0)/(num1-1) + (np.var(pop2)/num2)**(2.0)/(num2-1)) 

    # Am I computing this wrong? 
    # It should just come from the CDF like this, right? 
    # The extra parameter is the degrees of freedom. 

    one_tailed_p_value = 1.0 - st.t.cdf(t_stat,df) 
    two_tailed_p_value = 1.0 - (st.t.cdf(np.abs(t_stat),df) - st.t.cdf(-np.abs(t_stat),df))  


    # Computing with SciPy's built-ins 
    # My results don't match theirs. 
    t_ind, p_ind = st.ttest_ind(pop1, pop2) 

    return t_stat, one_tailed_p_value, two_tailed_p_value, t_ind, p_ind 

अद्यतन:

वेल्श की टी परीक्षण पर थोड़ा अधिक पढ़ने के बाद, मैंने देखा कि मैं की डिग्री की गणना करने के वेल्च-Satterthwaite सूत्र का उपयोग किया जाना चाहिए आजादी। मैंने इसे प्रतिबिंबित करने के लिए ऊपर दिए गए कोड को अपडेट किया है।

स्वतंत्रता के नए डिग्री के साथ, मैं एक करीब परिणाम मिलता है। मेरा दो तरफा पी-वैल्यू साइपी संस्करण से लगभग 0.008 तक बंद है ... लेकिन यह अभी भी बहुत बड़ी त्रुटि है इसलिए मुझे अभी भी कुछ गलत करना होगा (या SciPy वितरण कार्य बहुत खराब हैं, लेकिन विश्वास करना मुश्किल है वे केवल 2 दशमलव स्थानों के लिए सटीक हैं)।

दूसरा अद्यतन:

चीजों की कोशिश करने के लिए जारी रखने, वहीं मैंने सोचा कि शायद SciPy के संस्करण स्वचालित रूप से टी-वितरण के लिए सामान्य सन्निकटन की गणना करता है जब स्वतंत्रता की डिग्री काफी अधिक होती है (मोटे तौर पर> 30)। इसलिए मैं बजाय सामान्य वितरण का उपयोग कर मेरे कोड को फिर से भाग गया, और गणना परिणाम वास्तव में आगे SciPy के से दूर जब मैं t- बंटन का उपयोग की तुलना में कर रहे हैं।

बोनस सवाल :) (अधिक सांख्यिकीय संबंधित सिद्धांत, की अनदेखी करने के लिए स्वतंत्र महसूस)

इसके अलावा, टी आंकड़ा नकारात्मक है। मैं बस सोच रहा था कि इसका एक तरफा टी-टेस्ट के लिए क्या मतलब है। क्या इसका आमतौर पर मतलब है कि मुझे परीक्षण के लिए नकारात्मक धुरी दिशा में देखना चाहिए? मेरे परीक्षण आंकड़ों में, आबादी 1 एक नियंत्रण समूह है जिसे एक निश्चित रोजगार प्रशिक्षण कार्यक्रम नहीं मिला। जनसंख्या 2 इसे प्राप्त किया, और मापा डेटा इलाज से पहले/बाद में मजदूरी मतभेद हैं।

तो मेरे पास यह सोचने का कोई कारण है कि आबादी 2 का मतलब बड़ा होगा। लेकिन एक सांख्यिकीय सिद्धांत बिंदु से, यह इस तरह से एक परीक्षण concoct सही प्रतीत नहीं होता है। मैं डेटा के बारे में व्यक्तिपरक ज्ञान पर निर्भर रहे बिना नकारात्मक दिशा में (एक तरफा परीक्षण के लिए) की जाँच के लिए जाना जाता हो सकता था? या यह सिर्फ उन frequentist चीजें हैं जो, जबकि दार्शनिक कठोर नहीं, व्यवहार में किया जाना चाहिए में से एक है?

+0

इस गणना के लिए scipy.stats में पहले से ही फ़ंक्शंस हैं: ttest_ind और ttest_rel –

+2

कृपया मेरा प्रश्न दोबारा पढ़ें। – ely

+1

दो कारण हैं। (ए) यह अंतिम कोड नहीं है (जो सी ++ में होगा), लेकिन मैं यह सुनिश्चित करना चाहता था कि .cpp संस्करण लिखने से पहले मेरा एल्गोरिदम सही है। बूस्ट के माध्यम से मैं सीडीएफ सुविधा कार्यों में से अधिकांश प्राप्त कर सकता हूं और अपना खुद का मतलब और भिन्न कैलकुलेटर लिखना आसान है। तो यह चित्रित करता है कि यह पाइथन में मेरे परीक्षण डेटा पर काम करता है (सी ++ में इसका परीक्षण करने से बहुत आसान है जहां मेरे पास तुलना करने के लिए एक प्रतिस्पर्धी विधि नहीं है) मुझे यह बताना है कि मैं इसे सही कर रहा हूं ताकि मैं आगे बढ़ सकूं। – ely

उत्तर

7

SciPy अंतर्निहित फ़ंक्शन source() का उपयोग करके, मैं ttest_ind() फ़ंक्शन के लिए स्रोत कोड का प्रिंटआउट देख सकता था। स्रोत कोड के आधार पर, साइपी अंतर्निहित टी-टेस्ट कर रहा है यह मानते हुए कि दो नमूने के भिन्नता बराबर हैं। यह स्वतंत्रता के वेल्च-सतरथवाइट डिग्री का उपयोग नहीं कर रहा है। SciPy बराबर भिन्नता मानता है लेकिन यह धारणा नहीं बताता है।

मैं बस यह इंगित करना चाहता हूं कि, महत्वपूर्ण रूप से, यही कारण है कि आपको पुस्तकालय कार्यों पर भरोसा नहीं करना चाहिए। मेरे मामले में, मुझे वास्तव में असमान भिन्नताओं की आबादी के लिए टी-टेस्ट की आवश्यकता होती है, और स्वतंत्रता समायोजन की डिग्री कुछ छोटे डेटा सेटों के लिए महत्वपूर्ण हो सकती है, जिसे मैं इसे चलाऊंगा।

जैसा कि मैंने कुछ टिप्पणियों में उल्लेख किया है, मेरे कोड और विज्ञान के बीच विसंगति 30 से 400 के बीच नमूना आकार के लिए लगभग 0.008 है, और फिर धीरे-धीरे बड़े नमूना आकारों के लिए शून्य हो जाती है। यह बराबर-भिन्नता टी-आंकड़े संप्रदाय में अतिरिक्त (1/एन 1 + 1/एन 2) शब्द का प्रभाव है। शुद्धता के अनुसार, यह विशेष रूप से छोटे नमूना आकारों के लिए बहुत महत्वपूर्ण है। यह निश्चित रूप से मुझे पुष्टि करता है कि मुझे अपना खुद का कार्य लिखना होगा। (संभवतः अन्य, बेहतर पायथन पुस्तकालय हैं, लेकिन कम से कम यह ज्ञात होना चाहिए। वाकई, यह आश्चर्य की बात है कि यह ttest_ind() के लिए SciPy दस्तावेज़ में कहीं भी आगे और केंद्र नहीं है)।

+0

क्या आपने scipy के साथ एक प्रलेखन बग दायर किया है? – Dougal

+0

मैं कोशिश कर रहा हूँ।लेकिन उपयोगकर्ता नाम और पासवर्ड बनाने के बाद, मैं देव विकी साइट पर लॉग इन नहीं कर सकता। जब मैं 'लॉगिन' पर क्लिक करता हूं तो यह बस लटकता है। मैंने यह भी देखा है कि SciPy दस्तावेज़ कभी-कभी दिमागी-धीमी गति से धीमे होते हैं। मुझे लगता है कि यह उनके सर्वर के साथ कुछ मुद्दा होना चाहिए, लेकिन जो भी हो, यह निराशाजनक है। मुझे लगता है कि एक बग रिपोर्ट दर्ज करना जितना संभव हो उतना समय लेना चाहिए, और शायद किसी को पंजीकृत उपयोगकर्ता होने की आवश्यकता नहीं है। – ely

+0

हम्म ... मैं तीन सप्ताह पहले बहुत अधिक कठिनाई के बिना एक अलग NumPy बग फ़ाइल करने में सक्षम था (हालांकि यह अब तक कोई प्रतिक्रिया नहीं मिली है)। वैसे, मैं आमतौर पर github.com/scipy/scipy पर scipy स्रोत ब्राउज़ करते हैं; वहाँ भी/numpy/numpy और/matplotlib/matplotlib है। आईएमओ सब कुछ देखने के लिए यह एक और अधिक सुविधाजनक तरीका है। – Dougal

0

ऐसा लगता है कि आप अपने डीएफ के नंबरर को ** 2 भूल गए हैं। स्वतंत्रता के वेल्च-सैटरथवाइट डिग्री।

df = (np.var(pop1)/num1 + np.var(pop2)/num2)/( (np.var(pop1)/num1)**(2.0)/(num1-1) + (np.var(pop2)/num2)**(2.0)/(num2-1)) 

होना चाहिए:

df = (np.var(pop1)/num1 + np.var(pop2)/num2)**2/( (np.var(pop1)/num1)**(2.0)/(num1-1) + (np.var(pop2)/num2)**(2.0)/(num2-1)) 
+0

इसे इंगित करने के लिए धन्यवाद। मैंने यह सुझाव देने के लिए उम्मीदवार शॉर्ट-सर्किट को किसी भी व्यक्ति को संपादित करने के लिए संपादित किया था। यदि आप क्रॉस-मान्य लिंक पर अनुसरण करते हैं तो आप देखेंगे कि किसी ने भी वही अवलोकन किया है। मैंने कोड बदल दिया, लेकिन यह सटीकता में सुधार नहीं हुआ। मेरा परिणाम अभी भी SciPy से 0.008 तक अलग है। सीवी पर उन्होंने सुझाव दिया कि यह संख्यात्मक रद्दीकरण त्रुटि के कारण हो सकता है कि मैं पी-मानों की गणना कर रहा हूं, इसलिए मैं ऐसा करने के लिए स्थिर तरीकों की जांच कर रहा हूं। – ely

+0

हाँ, मैंने अपना जवाब लिखने के एक मिनट बाद इसे सचमुच देखा। –

2

आप नमूना प्रसरण की गणना नहीं कर रहे हैं, लेकिन इसके बजाय आप जनसंख्या का उपयोग कर रहे प्रसरण। n के बजाय नमूना भिन्नता n-1 द्वारा विभाजित होती है। np.var के पास इसी तरह के कारणों के लिए ddof नामक एक वैकल्पिक तर्क है।

यह आपको अपनी अपेक्षित परिणाम देना चाहिए:

import numpy as np 
import scipy.stats as st 

def compute_t_stat(pop1,pop2): 

    num1 = pop1.shape[0] 
    num2 = pop2.shape[0]; 
    var1 = np.var(pop1, ddof=1) 
    var2 = np.var(pop2, ddof=1) 

    # The formula for t-stat when population variances differ. 
    t_stat = (np.mean(pop1) - np.mean(pop2))/np.sqrt(var1/num1 + var2/num2) 

    # ADDED: The Welch-Satterthwaite degrees of freedom. 
    df = ((var1/num1 + var2/num2)**(2.0))/((var1/num1)**(2.0)/(num1-1) + (var2/num2)**(2.0)/(num2-1)) 

    # Am I computing this wrong? 
    # It should just come from the CDF like this, right? 
    # The extra parameter is the degrees of freedom. 

    one_tailed_p_value = 1.0 - st.t.cdf(t_stat,df) 
    two_tailed_p_value = 1.0 - (st.t.cdf(np.abs(t_stat),df) - st.t.cdf(-np.abs(t_stat),df))  


    # Computing with SciPy's built-ins 
    # My results don't match theirs. 
    t_ind, p_ind = st.ttest_ind(pop1, pop2) 

    return t_stat, one_tailed_p_value, two_tailed_p_value, t_ind, p_ind 

पुनश्च: SciPy खुला स्रोत और ज्यादातर अजगर के साथ लागू किया है। आप ttest_ind के लिए स्रोत कोड चेक कर सकते हैं और अपनी गलती को स्वयं ढूंढ सकते हैं।

बोनस पक्ष के लिए: आप अपने टी-वैल्यू को देखकर एक-पूंछ परीक्षण के पक्ष में निर्णय नहीं लेते हैं। आप इसे अपने परिकल्पना के साथ पहले तय करते हैं। यदि आपकी शून्य परिकल्पना यह है कि साधन बराबर हैं और आपकी वैकल्पिक परिकल्पना यह है कि दूसरा मतलब बड़ा है, तो आपकी पूंछ बाएं (नकारात्मक) तरफ होनी चाहिए। चूंकि आपके टी-वैल्यू के पर्याप्त छोटे (ऋणात्मक) मान इंगित करेंगे कि वैकल्पिक परिकल्पना शून्य परिकल्पना के बजाय सत्य होने की अधिक संभावना है।

+0

जब मैं 'ddof' परिवर्तन करता हूं (जिसे क्रॉस-मान्य पर भी सुझाव दिया गया था), यह संख्यात्मक विसंगति को प्रभावित नहीं करता है। यहां तक ​​कि अगर मैं सामान्य वितरण से चित्रण करके सिंथेटिक डेटा बना देता हूं, तो भी मेरी विधि और उपभेद भिन्न होता है। अंतर भी घटता है क्योंकि मैंने अपना नमूना आकार बड़ा होने दिया है, जो सबूत की तरह लगता है कि इसे स्वतंत्रता की डिग्री के साथ करना है, या जिस तरह से SciPy टी-सांख्यिकी के denominator की गणना करता है। – ely

+0

हां, ऐसा लगता है कि मैं सही हूं। 'स्रोत() 'फ़ंक्शन का उपयोग करने के बाद जो मैं प्रदान करता हूं, मैं देख सकता हूं कि' ttest_ind' टी आंकड़े के denominator के लिए एक बहुत अजीब गणना कर रहा है। यह किसी भी मूलभूत मामलों से मेल नहीं खाता है, इसलिए मैं यह देखने की कोशिश करूंगा कि यह क्या करता है। – ely

+0

मुझे याद दिलाने के लिए उपरोक्त कि मैं स्रोत देख सकता हूं। मुझे ऑनलाइन स्रोत नहीं मिला और फ़ाइल के लिए कोई भाग्य नहीं है। गुगलिंग ने अभी सुपर मूल्यवान 'स्रोत() 'फ़ंक्शन का खुलासा किया है। – ely

संबंधित मुद्दे