Рассылка закрыта
Вы можете найти рассылки сходной тематики в Каталоге рассылок.
Статистика в SPSS: за пределами кнопочного интерфейса. Выпуск 20
В рассылке используются материалы веб-сайта
www.spsstools.ru
Содержание выпускаГрафики функций в SPSS (часть 1) Новое на сайте www.spsstools.ru Здравствуйте, уважаемые подписчики! Довожу до вашего сведения, что проект "Справочник по синтаксису SPSS", анонсированный в 14-м выпуске рассылки, не состоялся из-за малого числа поступивших заявок. Не исключено, что позднее материалы проекта будут выпущены в ином формате, о чём подписчики рассылки будут обязательно уведомлены. Графики функций в SPSS (часть 1)Сегодняшний выпуск - в продолжение предыдущего. И носит, в некотором смысле, развлекательный характер. Из к/ф "Моя мачеха - инопланетянка": - Чем вы там занимаетесь? - Решаем задачки. - А как развлекаетесь? - Строим графики. В прошлом выпуске мы оценивали по данным такие параметры, как среднее и стандартное отклонение, а затем строили графики плотности вероятности нормального распределения с данными параметрами, сравнивая формы графиков между собой. Графики строились точками на диаграмме разброса, при этом количество точек совпадало с количеством исходных наблюдений. Поставим в некотором смысле, более узкую, а в некотором - более общую задачу - построение графика произвольной, заданной пользователем, функции путём предварительной генерации её значений. Недавно, кстати, я разместил на сайте макрос, делающий построение пользовательской функции совсем простым делом: Рисование пользовательской функции.SPS. Лёгких путей мы, однако же, не ищем, посему рассмотрим задачу более подробно. Общий принцип таков. С помощью команд INPUT PROGRAM - END INPUT PROGRAM создаём некоторое число значений аргумента и вычисляем значения функции. При создании значений аргумента можно их вводить через генератор случайных чисел или генерировать в некотором монотонном порядке с заданным шагом. Разберём оба варианта, создав следующими командами 100 значений переменной x и вычислив для них 100 значений функции "икс-квадрат" и "два икс квадрат" (квадрат вводится как x*x или как x**2). Обратите внимание, что для упрощения восприятия кода мы выделили команды внутри цикла LOOP отступом с дефисом. Такой вариант написания команд не вызывает проблем при их исполнении. Внутри цикла мы определяем окончание формирование очередного наблюдения (END CASE). Таким образом, будет сформировано 100 наблюдений. А после окончания цикла вставляем команду окончания формирования файла данных - END FILE. INPUT PROGRAM. LOOP #i=1 TO 100. * Первый способ ввода аргумента: монотонный с фиксированным шагом. - COMPUTE x = -5 + #i/10. * Второй способ ввода аргумента - через генератор случайных чисел. - COMPUTE x1 = RV.UNIFORM (-5,5). - COMPUTE y = x*x. - COMPUTE y1 = x1**2. - COMPUTE y2 = (2*x)**2. - END CASE. END LOOP. END FILE. END INPUT PROGRAM. EXECUTE. Для генерации случайных значений переменной x1 использовалась функция RV.UNIFORM, возвращающая значения случайной величины, равномерно распределённой на отрезке [-5, 5]. Монотонно заданный аргумент x был определёно почти на таком же отрезке, с той лишь разницей, что минимальное значение его равно -4.9, шаг составил 0.1. Теперь можно отобразить ту и другую пару значений на графиках (диаграммах разброса, меню Graphs - Scatter): GRAPH /SCATTERPLOT(BIVAR)=x WITH y. GRAPH /SCATTERPLOT(BIVAR)=x1 WITH y1. Графики очень схожи, но, как видно, первый вариант имеет видимое преимущество в эстетике, так как точки на нём распределены равномерно. Первый вариант генерации значений хорош ещё и тем, что график функции может быть построен без точек, в виде ломаной линии с помощью команды TSPLOT (меню Graphs - Sequence) - графика последовательности или временнОго ряда: TSPLOT VARIABLES = y /ID = x. Собственно, x в данном случае нужен лишь для подписи значений - значения по оси абсцисс, согласно логике команды TSPLOT, рассматриваются как равномерно распределённые засечки времени: TSPLOT VARIABLES = y. Использование этой команды для вывода значений функции от случайного аргумента невозможно: TSPLOT VARIABLES = y1 /ID = x1. Не поможет даже сортировка наблюдений по переменной x1, ведь на графике шаг между значениями оси абсцисс полагается постоянным, а фактически он постоянным для x1 не является: SORT CASES BY x1. TSPLOT VARIABLES= y1 /ID = x1. Наложение двух и более графиков возможно в команде TSPLOT следующим образом: * Вернём исходный порядок наблюдений. SORT CASES BY x. TSPLOT VARIABLES= y y2 /ID = x. ...а в команде GRAPH так: GRAPH /SCATTERPLOT(OVERLAY)=x x WITH y y2. Мы рассмотрели общий принцип построения графика пользовательской функции. При более подробном рассмотрении задачи, даже не будучи математиком, можно увидеть некоторые специальные случаи её решения и вопросы, на которые стоит обратить внимание, а именно: 1. Вопрос области определения функции и необходимого интервала значений аргумента, иллюстрирующего её основные свойства. 2. Вопрос выбора необходимой частоты значений аргумента (ведь слишком редкие значения могут не позволить увидеть, например, изгиб графика на некотором участке). 3. Построение псевдотрёхмерных графиков функции двух аргументов. 4. Построение графиков функций в полярных координатах. Вероятно, этот список можно продолжать, однако мы остановимся и с помощью синтаксиса SPSS приведём примеры для каждого из этих пунктов. Каждый раз мы будем генерировать подходящие данные с помощью уже знакомой конструкции INPUT PROGRAM - END INPUT PROGRAM.
1. Область определения функции и интервал значений аргумента. Не всякая функция определена во всякой точке и не всякий интервал значений аргумента позволит нам получить целостное представление о графике функции. Рассмотрим график y = 1/x. Очевидно, что функция не определена в точке x=0, но определена как при положительных, так и при отрицательных значениях x. Первое обстоятельство не создаст нам проблем при вычислении функции даже если мы подкинем программе x=0 - SPSS выдаст предупреждение о попытке деления на 0 и оставит одно из значений переменной y пустым. Однако это сделает некорректным отображение графика функции командой TSPLOT, так как ось абсцисс в данном графике является псевдочисловой и значение x=0 просто не будет присутствовать на оси - вслед за -0.1 через интервал 0.1 будет идти сразу 0.1. Будем отображать эту функцию точками на диаграмме разброса. Второе обстоятельство нужно учитывать ещё до вычисления значений функции. Так, задание лишь положительных аргументов (см. x1 и соответствующие им y1) позволит нам увидеть лишь часть графика. INPUT PROGRAM. LOOP #i=1 TO 100. - COMPUTE x = -5 + #i/10. - COMPUTE y = 1/x. - COMPUTE x1 = 0 + #i/10. - COMPUTE y1 = 1/x1. - END CASE. END LOOP. END FILE. END INPUT PROGRAM. GRAPH /SCATTERPLOT(BIVAR)=x WITH y. GRAPH /SCATTERPLOT(BIVAR)=x1 WITH y1.
2. "Сетка" графика. Построим график функции y = sin(x), определив её на одном и том же отрезке, первый раз с шагом аргумента, равным "пи", начав с "минус пяти пи", а второй раз - с шагом "одна десятая пи". Ясно, что в первом случае график не будет демонстрировать нам периодический характер функции, а будет представлять собой линию, совпадающую с осью абсцисс, а во втором случае мы увидим более правдоподобную картину. В данном случае гораздо больший интерес представляет техническая реализация генерирования данных разом для двух случаев. Надо сделать так, чтобы на каждое наблюдение с шагом аргумента, равным "пи", приходилось десять наблюдений с шагом "одна десятая пи". Тут мы проявим дьявольскую хитрость. Обратите внимание на структуру генерирующей программы. Она содержит вложенный цикл LOOP, который создаёт нам при каждом значении индекса #i десять наблюдений с индексом #j от 0 до 9. Это даёт нам возможность сгенерировать два набора данных с разным шагом x. Инструкция END CASE переместилась в тело второго цикла, так как завершение формирования наблюдения теперь происходит там. Кроме этого, в конец второго цикла было добавлено дополнительное условие его прекращения (IF), чтобы значения x и x1 находились в пределах одного и того же числового отрезка. Если бы этого условия не было, то наибольшим значением переменной x было бы 15.7, а переменная x1 "уехала" бы ещё на одно "пи" вправо. Кроме этого, чтобы для каждого значения x1 сохранялось исходное значение x (относительно которого мы смещаем x1), мы использовали команду LEAVE, подавляющую "реинициализацию" значений переменной при переходе к новому наблюдению. Иными словами, данная команда в каждое наблюдение, генерируемое внутри вложенного цикла, подставляет значения x и y, сгенерированные во внешнем цикле. INPUT PROGRAM. LOOP #i=0 TO 10. - COMPUTE x = -15.7 + #i*3.14. - COMPUTE y = sin(x). - LOOP #j=0 TO 9. - LEAVE x y. - COMPUTE x1 = x + 0.314*#j. - COMPUTE y1 = sin(x1). - END CASE. - END LOOP IF (#i=10 AND #j=0). END LOOP. END FILE. END INPUT PROGRAM. GRAPH /SCATTERPLOT (BIVAR) x WITH y. GRAPH /SCATTERPLOT (BIVAR) x1 WITH y1. GRAPH /SCATTERPLOT (OVERLAY) x x1 WITH y y1 (PAIR). Поясним построенные графики. Первый из них отображает значения функции sin(x), где x взят с периодом "пи", начиная с "минус пяти пи". Как сказано выше, график должен был бы совпасть с осью абсцисс, однако это не так. По краям графика, по мере удаления от нуля, у нас накапливается погрешность задания числа "пи", поэтому график всё заметнее отклоняется от нуля. Так или иначе, о периодичности графика остаётся только догадываться. Второй график является более приемлемым. Наилучшее впечатление достигается совмещением двух предыдущих графиков на третьем и добавлением вручную линии, соединяющей точки. Кстати, без инструкции LEAVE вполне можно было бы обойтись, если во вложенном цикле первую команду COMPUTE (COMPUTE x1 = x + 0.314*#j) переписать как COMPUTE x1 = -15.7 + #i*3.14 + 0.314*#j. В этом случае 9 из 10 значений переменных x и y оказались бы пустыми, что, однако, не исказило бы первых двух построенных графиков (в нашем варианте точки с координатами x и y в 90% случаев просто накладываются друг на друга). Третий график в таком случае следует строить с подкомандой "/missing=variablewise", иначе будут выведены лишь наблюдения, не имеющие пропусков у всех четырёх переменных. Другим случаем, когда недостаточно малый размер сетки искажает представление о графике, является функция sin(1/x), x<>0 y = 0, x=0. Мы специально доопределили функцию в нуле, так как в данном случае нагляднее будет использовать линейный график из команды TSPLOT и точка x=0 нам нужна, чтобы выдержать масштаб (график, тем не менее, всё равно будет не слишком корректен, так как соединит точку (0, 0) с соседними точками напрямую. Ну да мы, сделав такую оговорку, примиримся с этим). Так вот, в данном случае (выполните код, приведённый ниже), может сложиться впечатление, что, по мере приближения x к нулю, график не только меняет свою периодичность, но и амплитуду, хотя, на самом деле, очевидно, амплитуда остаётся постоянной. INPUT PROGRAM. LOOP #i=1 TO 200. - COMPUTE x = -1+#i/100. - COMPUTE y = sin(1/x). - IF (x=0) y=0. END CASE. END LOOP. END FILE. END INPUT PROGRAM. TSPLOT VARIABLES = y /ID = x. Из способов построения "правильного" графика данной функции можно предложить либо заметное увеличение числа точек на графике, либо генерацию значений аргумента так, чтобы они соответствовали всем визуально важным точкам, в т.ч. точкам перегиба (например, так, чтобы 1/x давал период "пи, делённое на 4"), либо иной метод более "плотной" генерация значений аргумента по мере уменьшения периода графика. Это, однако же, является уже самостоятельной задачей. Мы разобрали 1 и 2 специальные вопросы построения графика произвольной функции в SPSS. Следующие два пункта оставим на следующий выпуск, который я планирую сделать на этой же неделе. При подготовке этого и следующего выпусков я пользовался вводными разделами из учебника для втузов: "Пискунов Н.С. Дифференциальное и интегральное исчисления для втузов, Т. 1, М.: 1978". В качестве приложения привожу здесь сгенерированные данные для построения графиков некоторых элементарных функций. В упражнениях к первой главе учебника студентам, чтобы жизнь мёдом не казалась, предлагалось нарисовать эти графики (очевидно, на бумаге, без калькулятора, пользуясь устным счётом и таблицами значений тригонометрических функций и логарифмов)... Здесь тоже есть на что обратить внимание. Например, на то, как вводится степень, квадратный корень, корень произвольной степени, логарифм произвольного основания (в SPSS присутствуют лишь функции десятичных и натуральных логарифмов). Обратите внимание, что после генерации значений в окне результатов появится ряд предупреждений, связанных с попытками некорректных вычислений. Линейка значений аргумента у нас была одна на всех, а многие функции не определены в отдельных точках и(или) на отрезках. INPUT PROGRAM. LOOP #I = 1 TO 1000. COMPUTE x= rv.uniform(-25,25).
COMPUTE y1=-3*x+5. VARIABLE LABEL y1 'y1=-3*x+5'.
COMPUTE y2=0.5*x**2+1. VARIABLE LABEL y2 'y=0.5*x**2+1 (x**2 = квадрат x)'.
COMPUTE y3=3-2*x**2. VARIABLE LABEL y3 'y=3-2*x**2'.
COMPUTE y4=x**2+2*x-1. VARIABLE LABEL y4 'y=x**2+2*x-1'.
COMPUTE y5=1/(x-1). VARIABLE LABEL y5 'y=1/(x-1)'.
COMPUTE y6=sin(2*x). VARIABLE LABEL y6 'y=sin(2*x)'.
COMPUTE y7=cos(3*x). VARIABLE LABEL y7 'y=cos(3*x)'.
COMPUTE y8=x**2-4*x+6. VARIABLE LABEL y8 'y=x**2-4*x+6'.
COMPUTE y9=1/(1-x**2). VARIABLE LABEL y9 'y=1/(1-x**2)'.
COMPUTE y10=sin(x+3.14/4). VARIABLE LABEL y10 'y=sin(x+3.14/4)'.
COMPUTE y11=cos(x-3.12/3). VARIABLE LABEL y11 'y=cos(x-3.12/3)'.
COMPUTE y12=sin(0.5*x)/cos(0.5*x). VARIABLE LABEL y12 'y=sin(0.5*x)/cos(0.5*x)'.
COMPUTE y13=cos(x/4)/sin(x/4). VARIABLE LABEL y13 'y=cos(x/4)/sin(x/4)'.
COMPUTE y14=3**x. VARIABLE LABEL y14 'y=3**x' (три в степени x).
COMPUTE y15=2**(-(x**2)). VARIABLE LABEL y15 'y=2**(-(x**2))'.
COMPUTE y16=ln(1/x)/ln(2). VARIABLE LABEL y16 'y=ln(1/x)/ln(2)'.
COMPUTE y17=x**3+1. VARIABLE LABEL y17 'y=x**3+1'.
COMPUTE y18=4-x**3. VARIABLE LABEL y18 'y=4-x**3'.
COMPUTE y19=1/x**2. VARIABLE LABEL y19 'y=1/x**2'.
COMPUTE y20=x**4. VARIABLE LABEL y20 'y=x**4'.
COMPUTE y21=x**5. VARIABLE LABEL y21 'y=x**5'.
COMPUTE y22=sqrt(x). VARIABLE LABEL y22 'y=sqrt(x) (квадратный корень из x)'.
COMPUTE y23=1/sqrt(x). VARIABLE LABEL y23 'y=1/sqrt(x)'.
COMPUTE y24=x**(1/3). VARIABLE LABEL y24 'y=x**(1/3) (кубический корень из x)'.
COMPUTE y25=ABS(x). VARIABLE LABEL y25 'y=ABS(x) (модуль x)'.
COMPUTE y26=ln(ABS(x))/ln(2). VARIABLE LABEL y26 'y=ln(ABS(x))/ln(2) (логарифм модуля x по основанию 2)'.
COMPUTE y27=ln(1-x)/ln(2). VARIABLE LABEL y27 'y=ln(1-x)/ln(2)'.
COMPUTE y28=3*sin(2*x+3.14/3). VARIABLE LABEL y28 'y=3*sin(2*x+3.14/3)'.
COMPUTE y29=4*cos(x+3.14/2). VARIABLE LABEL y29 'y=4*cos(x+3.14/2)'.
END CASE. END LOOP. END FILE. END INPUT PROGRAM. EXECUTE. GRAPH /SCATTERPLOT(BIVAR)=x WITH y1. GRAPH /SCATTERPLOT(OVERLAY)=x x x WITH y6 y5 y15 (PAIR).
Всего доброго!
Ведущий рассылки, Балабанов Антон Новое на сайте www.spsstools.ruПереведены и добавлены примеры синтаксиса: Кластеризованные столбцовые диаграммы с процентами от численности кластера.SPS Пример графика поверхности.SPS Рисование пользовательской функции.SPS Отображение эффекта взаимодействия во множественной регрессии.SPS Как ускорить построение графиков.SPS
© См. www.spsstools.ru, 2005-2006 |
В избранное | ||