2010-08-16 84 views
28

Làm cách nào để chuyển đổi một số Z-score từ Z-distribution (standard normal distribution, Gaussian distribution) thành p-value? Tôi vẫn chưa tìm thấy chức năng phép thuật trong Scipy's stats module để thực hiện việc này, nhưng phải có chức năng đó.Chuyển đổi Z-score (giá trị Z, điểm chuẩn) thành giá trị p cho phân phối bình thường bằng Python

+0

Tôi đã bắt đầu ai ở đây http://statsandprobability.codeplex.com/ – user123976

Trả lời

30

Tôi thích các chức năng sinh tồn (phía trên đuôi xác suất) của phân phối bình thường tốt hơn một chút, bởi vì tên chức năng có nhiều thông tin hơn:

p_values = scipy.stats.norm.sf(abs(z_scores)) #one-sided 

p_values = scipy.stats.norm.sf(abs(z_scores))*2 #twosided 

bình thường phân phối "chuẩn mực" là một trong khoảng 90 phân phối trong scipy.stats

norm.sf cũng gọi hàm tương ứng trong scipy.special như trong gotgenes dụ

lợi thế nhỏ của chức năng sinh tồn, sf: độ chính xác số nên tốt hơn cho các số lượng gần 1 bằng cách sử dụng cdf

8

Aha! Tôi đã tìm thấy nó: scipy.special.ndtr! Điều này cũng dường như dưới scipy.stats.stats.zprob cũng (chỉ là một con trỏ đến ndtr).

Cụ thể, được đưa ra một chiều numpy.array dụ z_scores, người ta có thể có được p-giá trị làm

p_values = 1 - scipy.special.ndtr(z_scores) 

hoặc cách khác

p_values = scipy.special.ndtr(-z_scores) 
+0

ngữ Strange, "Z-phân phối" thay vì "đường cong bình thường". Điểm số Z có lẽ tôi cũng muốn gọi độ lệch chuẩn trong ngữ cảnh này. –

+0

Vâng, phân phối Z == "phân bố chuẩn chuẩn" == 'N (0, 1)'. Điều đó nói rằng, quan điểm của bạn được thực hiện tốt. Tôi đã cập nhật câu hỏi để phản ánh các thuật ngữ khác nhau cho cùng một khái niệm. – gotgenes

12

Tôi nghĩ hàm phân phối tích lũy (cdf) được ưu tiên hơn so với chức năng sống sót. Chức năng của người sống sót được định nghĩa là 1-cdf và có thể giao tiếp không đúng các giả định mà mô hình ngôn ngữ sử dụng cho các phần trăm định hướng. Ngoài ra, hàm điểm phần trăm (ppf) là nghịch đảo của cdf, rất thuận tiện.

>>> import scipy.stats as st 
>>> st.norm.ppf(.95) 
1.6448536269514722 
>>> st.norm.cdf(1.64) 
0.94949741652589625 
1

Từ công thức:

import numpy as np 
import scipy.special as scsp 
def z2p(z): 
    """From z-score return p-value.""" 
    return 0.5 * (1 + scsp.erf(z/np.sqrt(2))) 
+0

Đây không phải là giải pháp tốt nhất; nó không được vector hóa như câu trả lời ở trên. – hlin117

+1

Bạn có thể nhận phiên bản vectơ đơn giản bằng cách thay thế 'math.erf' và' math.sqrt' bằng 'erf' và' sqrt' khỏi scipy. – NullSpace

Các vấn đề liên quan