Данные моделирования сглаживания для демонстрации хи-квадрат - PullRequest
1 голос
/ 24 марта 2020

Я пытаюсь рассказать своим ученикам о хи-квадрат, находясь здесь в ловушке дома. Я сделал видео, которое должно быть в основном полезным, однако у меня возникли проблемы при создании графика со специфицированными c свойствами распределения хи-квадрат. Форма правильная, однако шума много. Это данные симуляции, поэтому они никогда не будут идеально гладкими, однако это немного много.

Я пытался сгладить данные. Я зашел так далеко, что округлил данные до ближайшей десятой и выполнил скользящую среднюю (k = 3), чтобы получить график, такой же презентабельный, как этот:

Chi-Squared Simulation df = 3, размер выборки = 100, выборки = 100000, округлено и сглажено

Имитация хи-квадрат df = 3, размер выборки = 100, образцы = 100000, не округлено, сглажено

Несколько вещей, которые я заметил, работая над этой проблемой. Во-первых, шипы и провалы, кажется, происходят в предсказуемых местах. Во-вторых, без округления график, кажется, чередуется назад и вперед между шипом и падением регулярно. Я думаю, что это возможно из-за какой-то проблемы с двоичной точностью. Я попытался объяснить это, переключившись на использование numpy для своих операций и заставив данные быть float64. Это не имело никакого эффекта.

Я хотел бы знать следующее:

  1. Если эта проблема вызвана двоичной точностью, как я могу правильно ее уменьшить?
  2. Если это не может быть решено таким способом, есть ли лучшая операция сглаживания, которую я мог бы использовать?

Спасибо за помощь. Код ниже.

# 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
...