Формирование набора данных

Формирование набора данных

Как мы уже выяснили в наборе данных из теста «Баланс внимания»: 1-я колонка - моменты времени предъявления стимулов, 2-я колонка - время реакции, с.

Основной фактор, который изменялся в тесте - это частота предъявления стимулов. Поскольку мы знаем время предъявления стимулов, то можем посчитать межстимульный интервал (МСИ). На основе анализа МСИ мы сможем добавить в набор данных все необходимые для дальнейшего анализа признаки.

D = pd.read_table('d/rt.tsv')
D['isi']=D.t.diff()  #разница между соседними моментами времени 

D.plot('t','isi',kind='scatter', color='r');
_images/i_dataset_rt_3_0.png

Фактор модальности

На основании рассчитанных межстимульных интервалов (МСИ, isi) можно выделить блоки реакций на зрительные стимулы с изменением МСИ от 8 до 2 с и на слуховые стимулы с аналогичной динамикой МСИ.

Так как мы работаем с единым блоком данных, то эти признаки можно добавить в виде дополнительных колонок в эту же таблицу.

Способов задать пороговые значения для выделения групповых признаков может быть много. Желательно использовать более универсальные.

Например, можно ввести условие для отбора слуховых реакций D.t > 130 , т.е. время стимула более 130 с от начала теста. Однако, в другом тесте продолжительность может измениться, поэтому надежнее использовать разницу в МСИ. Для этого дифференцируем ряд значений МСИ. Переход МСИ от 2 к 8 с возможен только однажды - при смене модальности в середине теста. В этом месте разница между последовательными значениями МСИ резко возрастает более чем на 5 с.

D.isi.diff()>5
0     False
1     False
2     False
3     False
4     False
5     False
6     False
7     False
8     False
9     False
10    False
11    False
12    False
13    False
14    False
15    False
16    False
17    False
18    False
19    False
20    False
21    False
22    False
23    False
24     True
25    False
26    False
27    False
28    False
29    False
30    False
31    False
32    False
33    False
34    False
35    False
36    False
37    False
38    False
39    False
40    False
41    False
42    False
43    False
44    False
45    False
46    False
47    False
Name: isi, dtype: bool
iA=(D.isi.diff()>5).argmax()  #сохраняем позицию, где условие истинно.
iA
24

Это индекс того места в ряде значений, где начинаются слуховые реакции

# создадим колонку с одним значением v - visual
D['mod']='v'
# значение после найденого индекса заменим на 'a' - audial
D.loc[iA:, 'mod'] = 'a'
D.tail()
t v isi mod
43 230.642 0.372 1.805 a
44 232.313 0.357 1.671 a
45 234.108 0.378 1.795 a
46 235.799 0.391 1.691 a
47 238.050 0.396 2.251 a

Фактор частоты

Из процедуры тестирования мы знаем, что МСИ в тесте изменялся в ряду [8, 4, 2] с добавлением случайной вариации.

Чтобы распределить значения по группам можно найти крайние значения в ряду изменения МСИ и все промежуточные между ними зачислить в ту же группу.

(D.isi<5).argmax()
9
(D.loc[iA:,'isi']<5).argmax()
9
# создадим колонку с одним значением 8
D['g']=8

# заменим значения в колонке 'g' на 4 там, где начинаются МСИ менее 5 с
iV4 = (D.isi<5).argmax() #где начинаются 4
iA4 = iA + (D[iA:].isi<5).argmax()
D.loc[iV4:iA-1, 'g'] = D.loc[iA4:, 'g']= 4

# заменим значения в колонке 'g' на 2 там, где начинаются МСИ менее 3 с
iV2 = (D.isi<3).argmax() #где начинаются 4
iA2 = iA + (D[iA:].isi<3).argmax()
D.loc[iV2:iA-1, 'g']= D.loc[iA2:, 'g']= 2

D
t v isi mod g
0 9.585 0.429 NaN v 8
1 16.368 0.335 6.783 v 8
2 23.729 0.357 7.361 v 8
3 30.930 0.373 7.201 v 8
4 40.303 0.439 9.373 v 8
5 46.804 0.402 6.501 v 8
6 55.448 0.382 8.644 v 8
7 62.401 0.325 6.953 v 8
8 68.910 0.400 6.509 v 8
9 73.463 0.303 4.553 v 4
10 77.697 0.349 4.234 v 4
11 81.661 NaN 3.964 v 4
12 86.385 0.285 4.724 v 4
13 90.470 0.288 4.085 v 4
14 95.114 0.308 4.644 v 4
15 99.548 0.282 4.434 v 4
16 104.056 0.382 4.508 v 4
17 105.844 0.338 1.788 v 2
18 107.955 0.307 2.111 v 2
19 109.636 0.514 1.681 v 2
20 111.487 0.287 1.851 v 2
21 113.394 0.316 1.907 v 2
22 115.732 0.290 2.338 v 2
23 117.612 0.434 1.880 v 2
24 128.119 NaN 10.507 a 8
25 135.000 NaN 6.881 a 8
26 143.557 0.622 8.557 a 8
27 151.932 0.402 8.375 a 8
28 160.933 0.393 9.001 a 8
29 168.975 0.471 8.042 a 8
30 177.819 0.411 8.844 a 8
31 184.975 0.431 7.156 a 8
32 191.480 0.519 6.505 a 8
33 195.884 0.370 4.404 a 4
34 199.594 0.412 3.710 a 4
35 203.637 0.385 4.043 a 4
36 207.373 0.513 3.736 a 4
37 211.929 0.389 4.556 a 4
38 216.615 0.439 4.686 a 4
39 219.947 0.443 3.332 a 4
40 224.455 0.698 4.508 a 4
41 226.741 0.473 2.286 a 2
42 228.837 0.377 2.096 a 2
43 230.642 0.372 1.805 a 2
44 232.313 0.357 1.671 a 2
45 234.108 0.378 1.795 a 2
46 235.799 0.391 1.691 a 2
47 238.050 0.396 2.251 a 2

Теперь у нас есть готовый набор данных, с которым легко проводить анализ по группам, а также выявлять взаимосвязи между данными в разных колонках.

# можно сохранить готовый набор данных с другим именем
D.to_csv('rtgotov.csv', index=False)

Распределение МСИ

Итак у нас есть групповой фактор, задающий средний МСИ. Также мы можем определить конкретные МСИ по задержке между стимулами.

Давайте посмотрим отклонение отдельных МСИ от групповых.

(D.isi - D.g).plot(lw=0, marker='d', ylim=(-3,3));
_images/i_dataset_rt_20_0.png
(D.isi - D.g).hist(bins=arange(-3,3,0.25));
_images/i_dataset_rt_21_0.png

Создается впечатление, что вариация МСИ происходила по нормальному закону - гистограмма в центре выше и снижается к краям. Однако, мы не учли, что тут смешаны и длинные и короткие МСИ.

Пересчитаем остатки, нормализовав их по групповому значению.

r=((D.isi - D.g)/D.g)
r.plot(lw=0, marker='d', ylim=(-3,3));
_images/i_dataset_rt_23_0.png
# из-за выбросов приходится задавать жесткие границы классов
r.hist(bins=arange(-1,1,0.05));
_images/i_dataset_rt_24_0.png
r.hist(bins=arange(-.5,.5,0.1));
_images/i_dataset_rt_25_0.png

Столбцы гистограммы не снижаются к бокам и при этом видны четкие границы (без учета двух выборосов, которые не видны на рисунке) - это признаки равномерного распределения в заданных пределах \(\pm 20\%\).