Hướng dẫn ks test poisson python - kiểm tra ks poisson trăn

Vì vậy, tôi nghĩ rằng phương pháp chi bình phương hoạt động tốt cho dữ liệu Poisson trung bình thấp, vì việc đặt các thùng ở các giá trị số nguyên là lựa chọn hợp lý. Mặc dù có phương tiện cao hơn, nó trở nên khó khăn hơn - bạn sẽ nhận được câu trả lời khác nhau với các chiến lược khác nhau. Do đó, đề xuất của tôi cho bài kiểm tra KS trong các bình luận - bạn không cần phải chia dữ liệu, chỉ cần nhìn vào CDF.

Nội phân Chính showShow

  • Làm thế nào để bạn tìm thấy sự tốt đẹp của sự phù hợp trong phân phối Poisson?
  • Bài kiểm tra nào được áp dụng để xác định mức độ phù hợp của phân phối Poisson?
  • Làm thế nào để bạn làm một bài kiểm tra phù hợp trong Python?
  • Làm thế nào để tôi biết nếu dữ liệu của tôi phù hợp với phân phối Poisson?

Nhưng Glen_B là đúng, trong đó thử nghiệm KS mà không cần định trước giá trị trung bình sẽ có lỗi loại II quá cao (âm tính sai). Một giải pháp thay thế là thử nghiệm Lilliefors, sử dụng phương pháp CDF tương tự như thử nghiệm KS, nhưng sử dụng các mô phỏng để tạo phân phối null cho thống kê KS.

Mặc dù vậy, trước tiên, hãy nhìn vào CDF của dữ liệu của bạn. Tôi nghĩ rằng biểu đồ của bạn trông khá phù hợp với dữ liệu Poisson và biểu đồ CDF cũng bắt buộc với điều đó. Ở đây tôi tạo ra 10 mô phỏng của 112 quan sát để hiển thị biến thể điển hình với dữ liệu thực sự là Poisson (có cùng ý nghĩa với dữ liệu của bạn):

from datetime import datetime
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from scipy.stats import poisson

obs = np.array([1125, 1117, 1056, 1069, 1060, 1009, 1065, 1031, 1082, 1034,  985,
       1022, 1020, 1108, 1084, 1049, 1032, 1064, 1036, 1034, 1046, 1086,
       1098, 1054, 1032, 1101, 1044, 1035, 1018, 1107, 1039, 1038, 1045,
       1063,  989, 1038, 1038, 1048, 1040, 1050, 1046, 1073, 1025, 1094,
       1007, 1090, 1100, 1051, 1086, 1051, 1106, 1069, 1044, 1003, 1075,
       1061, 1094, 1052,  981, 1022, 1042, 1057, 1028, 1023, 1046, 1009,
       1097, 1081, 1147, 1045, 1043, 1052, 1065, 1068, 1153, 1056, 1145,
       1073, 1042, 1081, 1046, 1042, 1048, 1114, 1102, 1092, 1006, 1056,
       1039, 1036, 1039, 1041, 1027, 1042, 1057, 1052, 1058, 1071, 1029,
        994, 1025, 1051, 1095, 1072, 1054, 1054, 1029, 1026, 1061, 1153,
       1046, 1076])

# Simple ecdf function
def ecdf(x):
    sx = np.sort(x)
    n = sx.size
    sy = np.arange(1,n+1)/n
    return sx,sy

fig, ax = plt.subplots(figsize=(6,4))
# CDF for observed data
ecdf_x,ecdf_y = ecdf(obs)
ax.step(ecdf_x,ecdf_y,color='red',label='ECDF',
        linewidth=3,zorder=3)

# CDF for hypothetical poisson
pcdf_x = np.arange(obs.min(),obs.max()+1)
pcdf_y = 1 - poisson.cdf(obs.mean(),pcdf_x)
ax.step(pcdf_x,pcdf_y, color='k',linewidth=3,
        label=f'Poisson {obs.mean():.1f}',zorder=2)

# Random variates of same size as obs
for i in range(10):
    randp = poisson.rvs(obs.mean(),size=len(obs))
    rcdf_x,rcdf_y = ecdf(randp)
    if i == 0:
        ax.step(rcdf_x,rcdf_y, color='grey',
                label=f'Simulated Poisson',zorder=1)
    else:
        ax.step(rcdf_x,rcdf_y, color='grey',alpha=0.35,zorder=3)

ax.legend(loc='upper left')
plt.show()

Hướng dẫn ks test poisson python - kiểm tra ks poisson trăn

Vì vậy, bạn có thể thấy dữ liệu của bạn không giống tất cả những điều đó ngoài quy trình Poisson. Ở đây tôi đã mã hóa phiên bản của Lilliefor cho Poisson (nếu bạn có dấu thời gian ban đầu, bạn có thể ước tính phân phối theo cấp số nhân và kiểm tra với các bảng tra cứu mô phỏng của Lilliefor hoặc StatSmodels).

def lill_poisson(x,sim=10000,seed=10):
    n = len(x)
    nu = np.arange(1.0,n+1)/n
    nm = np.arange(0.0,n)/n
    # Fit parameters
    m = x.mean()
    fp = poisson(m) # frozen Poisson
    # in function for KS stat
    def ks(obs):
        x = np.sort(obs)
        cv = fp.cdf(x)
        Dp = (nu - cv).max()
        Dm = (cv - nm).max()
        return np.max([Dp,Dm])
    # KS stat observed
    ks_obs = ks(x)
    # Generate simulation
    np.random.seed(seed)
    sa = np.zeros(sim)
    for i in range(sim):
        s = fp.rvs(n)
        sa[i] = ks(s)
    # calculate p-value
    p_val = np.append(sa,ks_obs).argsort()[-1]/sim
    return ks_obs, p_val, sa

kstat, pval, svals = lill_poisson(obs)
print(f'KS Stat: {kstat:0.2f}, p-value {pval:0.2f}')

Giá trị p của bạn có thể hơi khác một chút do chạy mô phỏng, nhưng tôi không nghĩ rằng nó có khả năng là bất cứ thứ gì gần rìa của phân phối.

Để kiểm tra và đảm bảo lill_poisson của tôi có gần với phân phối null đồng nhất bên phải, tôi đã mô phỏng dữ liệu Poisson với các phương tiện khác nhau và kích thước mẫu. Nó có vẻ tốt cho các giá trị quan trọng là 0,05 và 0,10, nhưng càng gần đuôi bạn nhận được nó cũng không hoạt động. Điều đó có thể là do kích thước mẫu nhỏ hơn, mặc dù sẽ có nhiều cuộc điều tra hơn.

# Check out p-values for actual distributions
# should be approximately uniform
# On my machine, takes about 3 minutes to 
# crunch through 100 simulations
# So this took me ~5 hours

res_p = []
for i in range(10000):
    if (i % 100) == 0:
        print(f'Sim {i} @ {datetime.now()}')
    mu = np.random.uniform(low=5,high=1000,size=1)[0]
    si = np.random.randint(low=10,high=100,size=1)[0]
    simloc = poisson.rvs(mu,size=si)
    ks,pv,sv = lill_poisson(simloc)
    res_p.append(pv)

Caveat Emptor, tôi không biết sức mạnh của cách tiếp cận Chi-Square của Binning. Nhưng đây là cách tôi sẽ thực hiện phương pháp chi bình phương (tôi không tin cách tiếp cận bạn đã làm là chính xác). Ở đây tôi bin theo lượng tử Poisson, thay vì dựa trên dữ liệu. (Vì vậy, số dự kiến ​​trên mỗi thùng là như nhau.)

# Chi-square approach bins
# Use quintiles of the hypothetical Poisson
df = pd.DataFrame(obs,columns=['counts'])
df['quantile'] = poisson.cdf(obs.mean(),obs)
df['quin'] = np.floor(df['quantile']/0.2)

obs_counts = df['quin'].value_counts()
exp_counts = len(obs)/5
chi_stat = ((obs_counts - exp_counts)**2/exp_counts).sum()
# Chi-square value of 6.66

Như tôi đã nói, các chiến lược Binning khác nhau sẽ cung cấp các giá trị P khác nhau. Tại đây nếu bạn làm chisquare(obs_counts) hoặc giảm mức độ tự do xuống một, chisquare(obs_counts,ddof=1), nó vẫn dẫn đến giá trị p> 0,05. Nếu bạn thực hiện 10 thùng trong phương pháp này với dữ liệu này, giá trị p sẽ lớn hơn.

Nói chung, tôi nghĩ rằng dữ liệu ví dụ của bạn khá phù hợp với phân phối Poisson.

Làm thế nào để bạn tìm thấy sự tốt đẹp của sự phù hợp trong phân phối Poisson?

Bài kiểm tra nào được áp dụng để xác định mức độ phù hợp của phân phối Poisson?Values must be integers that are greater than or equal to zero. For example, the number of sales per day in a store can follow the Poisson distribution. If these data follow the Poisson distribution, you can use this distribution to make predictions.

Bài kiểm tra nào được áp dụng để xác định mức độ phù hợp của phân phối Poisson?

Làm thế nào để bạn làm một bài kiểm tra phù hợp trong Python? determines how well theoretical distribution (such as normal, binomial, or Poisson) fits the empirical distribution. In Chi-Square goodness of fit test, sample data is divided into intervals.

Làm thế nào để bạn làm một bài kiểm tra phù hợp trong Python?

Làm thế nào để tôi biết nếu dữ liệu của tôi phù hợp với phân phối Poisson?create a data frame with 8 intervals as below. Create two columns each for observed and expected frequency. Use Pandas' apply method to calculate the observed frequency between intervals. We are now ready to perform the Goodness-of-Fit test.

Làm thế nào để tôi biết nếu dữ liệu của tôi phù hợp với phân phối Poisson?

Nhưng Glen_B là đúng, trong đó thử nghiệm KS mà không cần định trước giá trị trung bình sẽ có lỗi loại II quá cao (âm tính sai). Một giải pháp thay thế là thử nghiệm Lilliefors, sử dụng phương pháp CDF tương tự như thử nghiệm KS, nhưng sử dụng các mô phỏng để tạo phân phối null cho thống kê KS.Data are counts of events. All events are independent. The average rate of occurrence does not change during the period of interest.