Matlab in Python
Good time of day.
Please help me with the code in Pyton. I have the value of statistical and result should match, but it turns out the following statistic =2.14, result = 0.0214. Maybe I'm not passing the correct data to the scipy.stats.chisquare function.
MatLab
clc; % очищает окно команд
clear;% удаление элементов из рабочей области, очистка системной памяти
%задаётся шаг
interval = 0.13;
%задаётся половинный интервал
centers = 0.065 : interval : 0.845;
%количество попаданий в интервал
counts = [6, 13, 14, 23, 19, 14, 11];
%считается сумма попаданий
sumCounts = sum(counts);
%вероятность попадания в интервал
probability = counts./sumCounts;
%строется гистограмма
bar(centers, probability./interval, 1, 'r');
hold on;
%считается ма ожидание
m = sum(centers.*probability);
%считается дисперсия
d = sum(((centers - m).^2).*probability);
%для бэта распределения вычисляется альфа и бетта
a = m*(m*(1-m)/d-1);
b = a*(1-m)/m;
%вычисление точек по закону бета
betaPlot = betapdf(centers, a, b);
centers_1 = 0.065:0.01:0.845; % новые значения по оси x (с постоянным и частым шагом)
betaPlot_1 = interp1(centers,betaPlot,centers_1,'pchip'); % получение новых значений при интерполяции
myPlot = plot(centers_1, betaPlot_1, 'k');%строим новый график после интерполяции
myPlot.LineWidth = 2;
%проверка гипотезы методом К.Пирсона
alpha = 0.025;%уровень значимости согласно варианту
%вероятность попадания СВ в заданный интервал
P = betacdf(centers+interval./2, a, b) - betacdf(centers-interval./2, a, b);
%Вычисляется наблюдаемое значение показателя согласованности гипотезы
statistic = sum(((counts-sumCounts.*P).^2)./(sumCounts.*P));
kritikal_value = chi2inv(1-alpha, 7-2-1);%Критическая граница
%проверяем гипотезу Ho
if statistic <kritikal_value
disp('Гипотеза принимается');
else
disp('Гипотеза отклоняется');
end
Python
import scipy
import numpy as np
import pylab as py
import math
from scipy.stats import chi2
from scipy.stats import beta
interval = 0.13;
centers = np.arange(0.065,0.975,interval);
counts = [6, 13, 14, 23, 19, 14, 11];
sumCounts = sum(counts);
probability = [];
for i in counts:
probability.append(i/sumCounts);
#мат ожидание
cp =[];
for i in range(0,len(centers)):
cp.append(centers[i]*probability[i]);
mat_ozhidaniye = sum(cp);
#дисперсия
cm =[]
for i in centers:
cm.append((i-mat_ozhidaniye)**2);
cpr = []
for i in range(len(cm)):
cpr.append(cm[i]*probability[i]);
d = sum(cpr);
#критерии для beta распределения
a = (mat_ozhidaniye)*((mat_ozhidaniye*(1-mat_ozhidaniye))/d-1);
b = (a*(1-mat_ozhidaniye))/mat_ozhidaniye;
betaPlot = scipy.stats.beta.pdf(centers, a, b);
#проверка гипотех методом К.Пирсона
alpha = 0.025;
#вероятность попадания СВ в заданный интервал
cint = []
for i in centers:
cint.append(i+interval/2);
cmint = []
for i in centers:
cmint.append(i-interval/2);
P = scipy.stats.beta.cdf(cint, a, b) - scipy.stats.beta.cdf(cmint, a, b);
#Вычисляется наблюдаемое значение показателя согласованности гипотезы
cs = []
for i in range(len(counts)):
cs.append(counts[i]-(sumCounts*P[i]));
csq = []
for i in cs:
csq.append(i**2);
csqscp =[]
for i in range(len(csq)):
csqscp.append(csq[i]/(sumCounts*P[i]));
u = sum(csqscp);
print ("statistic = ",u);
result = scipy.stats.chisquare(probability,P,ddof = 4);
print(result.statistic)
1