Python-как сделать f-тест на 2D-массивах?

Проблема

У меня есть два массива, назовем их ar1 и ar2 (размер (192 289)), которые представляют карты стандартных отклонений широты и долготы, и у меня есть массив их разностей аналогичного размера. Я хочу нанести на график разницу, а сверху — штриховой рисунок, где разница между двумя массивами статистически значима для уровня достоверности 95% (альфа = 0,05).

Код

Я использовал этот пример для своего кодирования -

Как выполнить F-тест в python

Я использовал решение Джоэла Корнетта, заменив X и Y на ar1 и ar2.

F = np.var(ar1) / np.var(ar2)
print np.var(ar1), np.var(ar2)
print F

0.118586507371 0.161485609461 0.734347213766

В следующей части мне нужны N-2 степени свободы для моего анализа, где N — количество точек в массивах, в данном случае 55848 (192 x 289). len(ar1) и len(ar2) здесь не работают, так как они дают только длину первого измерения, поэтому я попытался сгладить массивы для получения правильной длины.

df1 = len(np.ndarray.flatten(sdmod)) - 2
df2 = len(np.ndarray.flatten(sdcon)) - 2
print df1, df2

55486 55486

Однако, продвигаясь вперед, я получил p-значение 9,88365269356e-289 (по сути, 0). Это единственное значение и, как я и ожидал в этом конкретном случае, статистически незначимое, но мне нужен массив значений, чтобы сделать пунктирную разметку, чтобы я мог видеть, есть ли место в сетке, где разница существенна. Я просто не уверен, как выполнить этот тест на двумерном массиве, поскольку все примеры, которые я нахожу, используют списки или другие одномерные типы данных, и я также никогда раньше не проводил подобного анализа. (Я делаю это по просьбе моего консультанта, который не использует Python).

Вопрос

Как вы выполняете f-тест для двух двумерных массивов, где результат дает массив одинакового размера, который дает вам значение p для каждой точки сетки?

Я могу исправить это, если возможно, чтобы заполнить все, что я мог пропустить из-за непонимания предмета (и дайте мне знать, что полученное мной p-значение кажется неправильным), но если это слишком сложно или неполное для получить помощь, я просто удалить его.


person ChristineB    schedule 02.12.2017    source источник


Ответы (1)


Это зависит от ваших массивов. В случае, если шаг достаточно велик для разделения массива широты/долготы на более мелкие части, вы можете оценивать квадраты 24x24, а не весь массив. Вы можете проверить разные масштабы и посмотреть, что имеет смысл. Чтобы реализовать это, попробуйте что-то вроде этого:

F = np.zeros((derp.shape[0]-24, derp.shape[1]-24))
for a in np.arange(0, F.shape[0]):
    for b in np.arange(0, F.shape[1]):
        F[a,b] = np.var(ar1[a:a+24, b:b+24])/np.var(ar2[a:a+24, b:b+24])

Это даст выходной массив аналогичного размера (168 265), поскольку квадраты 24x24 оцениваются в коде выше шага 1, возможно, больше не имеют смысла. Полуперекрывающиеся квадраты дадут более разумные результаты для небольших размеров шага:

F = np.zeros(((derp.shape[0]-24)//12, (derp.shape[1]-24)//12))
for a in np.arange(0, F.shape[0]):
    for b in np.arange(0, F.shape[1]):
        F[a,b] = np.var(derp[a*12:a*12+24, b*12:b*12+24])/np.var(derp2[a*12:a*12+24, b*12:b*12+24])

Это дает (14,22) массив.

person zck    schedule 03.12.2017
comment
Спасибо за ответ. Я попробовал ваш метод и присвоил значения, где p_value ‹ (›) alpha массиву, где они = 1 (0). Однако в результирующем массиве мои значимые результаты не совпадают с моими областями большой разницы между ar1 и ar2, как я ожидал. Просто для ясности: df1 и df2 = размеры размеров, используемые в F? - person ChristineB; 03.12.2017