1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
*(Вопрос) Получен по электронной почте 09.05.2002.
У меня есть база по временам реакции в тестах на визуальные сравнения. Разумеется,
данные сильно отрицательно скошены, так как испытуемые в течение 2 часов отвечали на вопросы,
требующие в среднем 2-3 секунды на ответ. Похоже, что в некоторых случаях они утомлялись или 
отвлекались, или усаживались поудобнее в креслах, в результате чего ответ занимал более 20 секунд.
В некоторых случаях реакция, наоборот, составляла менее 100 миллисекунд
(дети в школе, конечно, шустрые, но не настолько).
В любом случае, как мне заменить такие "выборосы" на среднее время реакции, НО основанное не на 
среднем времени реакции всех испытуемых, а на среднем времени реакции этого испытуемого при похожих условиях.
Я поясню это на небольшом примере. Вот пример данных....

ID sides change RT
1  4     7      750
1  4     10     1000
1  5     7      850
1  4     10     22000
2  4     7      14750
2  4     10     1000
2  5     7      50
2  4     10     900
...

ID = код испытуемого
sides = число сторон фигуры для визуального сравнения
change = процент изменения фигуры
RT = задержка (время реакции)
выбросы = RT > 600 & RT < 10000

Т.е. надо определить выброс, определить респондента, определить, какого типа этот вопрос (по 
значениям переменных sides и change). Определить при этих условиях среднее время реакции и заменить
им выброс.

*(Ответ) Автор: Ray, 09.05.2002.


DATA LIST LIST /ID sides change RT.
BEGIN DATA
1  4     7      750
1  4     10     1000
1  5     7      850
1  4     10     22000
2  4     7      14750
2  4     10     1000
2  5     7      50
2  4     10     900
END DATA.
LIST.

SORT CASES BY id sides change.
SAVE OUTFILE='c:\\temp\\original data.sav'.
SELECT IF RANGE(RT,600,10000).
AGGREGATE
  /OUTFILE='C:\\temp\\aggr.sav'
  /BREAK=id sides change
  /mean_rt = MEAN(rt).

MATCH FILES /FILE='c:\\temp\\original data.sav'
	/TABLE='C:\\temp\\aggr.sav'
	/BY=id sides change.
COMPUTE newrt=rt.
IF ~RANGE(RT,600,10000) newrt=mean_rt.
EXECUTE.

* Обратите внимание, что в 2 случаях значения остались пустыми, т.к. нет  таких же вопросов для 
	этих испытуемых, чтобы посчитать среднее. Вы можете оставить там старое значение, либо заменить их
	на общее среднее. В общем, много способов есть.

* Возможно также (хотя это и более сложно) попробовать заменить выборосы значениями из тех наблюдений, которые
	в некотором смысле 'похожи'. Например, см. синтаксис номер 12 на стр.
	http://www.spsstools.net/SampleSyntax.htm#RandomSampling.