Я пытаюсь рассказать своим ученикам о хи-квадрат, находясь здесь в ловушке дома. Я сделал видео, которое должно быть в основном полезным, однако у меня возникли проблемы при создании графика со специфицированными c свойствами распределения хи-квадрат. Форма правильная, однако шума много. Это данные симуляции, поэтому они никогда не будут идеально гладкими, однако это немного много.
Я пытался сгладить данные. Я зашел так далеко, что округлил данные до ближайшей десятой и выполнил скользящую среднюю (k = 3), чтобы получить график, такой же презентабельный, как этот:
Chi-Squared Simulation df = 3, размер выборки = 100, выборки = 100000, округлено и сглажено
Имитация хи-квадрат df = 3, размер выборки = 100, образцы = 100000, не округлено, сглажено
Несколько вещей, которые я заметил, работая над этой проблемой. Во-первых, шипы и провалы, кажется, происходят в предсказуемых местах. Во-вторых, без округления график, кажется, чередуется назад и вперед между шипом и падением регулярно. Я думаю, что это возможно из-за какой-то проблемы с двоичной точностью. Я попытался объяснить это, переключившись на использование numpy для своих операций и заставив данные быть float64. Это не имело никакого эффекта.
Я хотел бы знать следующее:
- Если эта проблема вызвана двоичной точностью, как я могу правильно ее уменьшить?
- Если это не может быть решено таким способом, есть ли лучшая операция сглаживания, которую я мог бы использовать?
Спасибо за помощь. Код ниже.
# Draw n samples of 25 and get Chi-Square list
chiSqrList = []
n = 100000
sampleSize = 100
j = 0
while j < n:
redTotal = 0
greenTotal = 0
yellowTotal = 0
blueTotal = 0
i = 0
while i < sampleSize:
x = random.random()
if x < redLim:
redTotal += 1
elif x < greenLim:
greenTotal += 1
elif x < yellowLim:
yellowTotal +=1
else:
blueTotal += 1
i += 1
observedBalls = np.array([redTotal, greenTotal, yellowTotal, blueTotal], dtype=np.float64)
expectedBalls = np.array([sampleSize*redBalls, sampleSize*greenBalls, sampleSize*yellowBalls, sampleSize*blueBalls], dtype=np.float64)
chiSqr = 0
chiSqr = np.power((observedBalls - expectedBalls), 2)/expectedBalls
chiSqr = np.sum(chiSqr)
chiSqr = round(chiSqr, 1)
chiSqrList.append(chiSqr)
j += 1
# Make count data
avgSqrDist = []
count = []
i = 0
for value in chiSqrList:
if len(avgSqrDist) == 0:
avgSqrDist.append(value)
count.append(1)
elif avgSqrDist[i] != value:
avgSqrDist.append(value)
count.append(1)
i += 1
else:
count[i] += 1
# Smooth curve
i = 0
smoothAvgSqrDist = []
smoothCount = []
while i < len(avgSqrDist)-2:
smoothCount.append((count[i]+count[i+1]+count[i+2])/3)
smoothAvgSqrDist.append(avgSqrDist[i+1])
i += 1