> incomes <– c (60, 49, 40, 61, 64, 60, 59, 54, 62, 69, 70, 42, 56,
61, 61, 61, 58, 51, 48, 65, 49, 49, 41, 48, 52, 46,
59, 46, 58, 43)
Чтобы вычислить средний доход в выборке по каждому штату используем теперь специальную функцию tapply ():
> incmeans <– tapply (incomes, statef, mean)
дающей вектор средних с компонентами, маркированными уровнями:
Функция tapply () используется для применения здесь функции mean () к каждой группе компонентов первого параметра, здесь доходов, определенные уровнями второго компонента, здесь statef, как будто они были отдельными векторными структурами. Результат – структура той же самой длины как атрибут уровней фактора, содержащего результаты.
Обратите внимание на то, что tapply () также работает в этом случае, когда его второй параметр не фактор, например, «tapply (incomes, state)», и это верно для довольно многих других функций, так как при необходимости параметры преобразованы в факторы (используется as. factor ()).
Читатель должен консультироваться с документом справки для большего количества деталей.
Предположи далее, что необходимо вычислить стандартные ошибки средних доходов штата. Для этого следует записать функцию R для вычисления стандартной ошибки для любого данного вектора. Так как существует встроенная функция var () для вычисления дисперсии выборки, то такая функция записывается в виде одной строки, задаваемая присвоением:
> stderr <– function (x) sqrt (var (x) /length (x))
Написание функций рассмотрим позже в Главе 10 [Написание собственных функций], и в этом случае было ненужным, поскольку R также имеет встроенную функцию sd (). После этого присвоения стандартные ошибки вычислены:
> incster <– tapply (incomes, statef, stdError)
и затем вычисленные величины:
> incster
В качестве примера можно вычислить обычные 95%-ые доверительные границы для средних доходов штата. Для этого можно использовать tapply () еще раз с функцией length (), чтобы найти размеры выборки, и функцию qt (), чтобы найти процентные точки соответствующих t-распределений. Также можно рассмотреть средства R для t-тестов.
Также можно применить функцию tapply () к более сложной индексация вектора на несколько категорий. Например, можно разделить налоговые счета как по штатам, так и по полу. Однако в этом простом примере (только один фактор) то, что происходит, можно представить следующим образом. Значение в векторе собрано в группы, соответствующие различным позициям в факторе. Затем функция применяется к каждой из этих групп отдельно. Результат – это вектор значений функции, маркированных согласно levels фактора.
Комбинация вектора и фактора меток – пример того, что иногда называют неровными массивами, так как размеры подкласса возможно не одинаковы. Когда размеры подкласса всегда одинаковы, то индексация может быть сделана неявно и намного более эффективно, как увидим в следующем разделе.
4.3. Упорядоченные факторы
Уровни факторов сохраняются в алфавитном порядке, или в том порядке, в котором они указывались к фактору, если они указывались явно.
Иногда у уровней будет естественное упорядочивание, которое записали и хотели использовать в статистическом анализе. Функция ordered () создает такие упорядоченные факторы, но, в противном, она идентична factor. В большинстве целей единственной разницей между упорядоченными и неупорядоченными факторами является то, что прежде напечатанное для упорядоченных уровней отличается от генерируемых для них в подгонке линейных моделей.
5. Массивы и матрицы
5.1. Массивы
Массив (array) можно рассмотреть как множество, приписанное к набору входов данных, например числовых. R позволяет простые средства для создания и обработки массивов, и их особый случай – матриц.
Размерностью вектора является вектор неотрицательных целых чисел. Если его длина равна k, то массив является k-мерным, например, матрица является 2-мерным массивом. Размерности индексированы от единицы до значения, данного в векторе размерности.
Вектор может использоваться в R в качестве массива, только если у него имеется вектор размерности как его атрибут dim. Предположим, например, z – вектор из 1500 элементов.
> dim (z) <– c (3,5,100)
дает ему атрибут dim, который позволяет его обрабатывать как массив 3-на-5-на-100.
Доступны другие функции, такие как matrix () и array (), для более простых и более естественно выглядящих присвоений, как увидим в Разделе 5.4 [Функция array ()].
Значение в векторе данных дает значение в массиве в том же самом порядке, как и в ФОРТРАНЕ, который является «столбцом главного порядка» с первым нижним индексом, изменяющимся быстрее, и последним самым медленным нижним индексом.
Например, если вектор размерности для массива, скажем a, является c (3,4,2) то есть 3 * 4 * 2 = 24 записи в a и векторе данных содержит их в порядке [1,1,1], [2,1,1], …, [2,4,2], [3,4,2].
Массивы могут быть одномерными: такие массивы обычно обрабатываются таким же образом как векторы (включая печать), но исключения могут вызвать беспорядок.
5.2. Индексация массива. Подразделы массива
На отдельные элементы массива можно сослаться, давая имя массива, сопровождаемого нижними индексами в квадратных скобках, разделенных запятыми.
Более широко можно указать подразделы массива, давая последовательность векторов индексов вместо нижних индексов; однако, если какая-либо позиция индекса дана пустым индексным вектором, то берется полный спектр этого нижнего индекса.
Продолжая предыдущий пример, а [2,,] является массивом 4х2 с вектором размерности с (4,2) и вектором данных, содержащим значение:
c ([2,1,1], [2,2,1], [2,3,1], [2,4,1],
[2,1,2], [2,2,2], [2,3,2], [2,4,2])
в том порядке. а [,,] стоит для всего массива, который является таким же с исключенными нижними индексами полностью и использованием а отдельно.
Для любого массива, скажем Z, на вектор размерности можно сослаться явно как dim (Z) (по обе стороны от присвоения).
Кроме того, если имя массива дано только с одним нижним индексом, или индексируется вектором, то только используется соответствующее значение вектора данных; в этом случае вектор размерности игнорируется. Дело обстоит не так, однако, если отдельный индекс не вектор, но он непосредственно массив, как обсуждим позже.
5.3. Индекс матрицы
Включая индексный вектор в любой позиции нижнего индекса, матрица может использоваться с отдельной матрицей индексов в порядке либо присвоения вектора количеству нерегулярной коллекции элементов в массиве, либо в извлечении нерегулярной коллекции как вектора.
Пример матрицы ясно дает понять процесс. В случае вдвойне индексированного массива индексная матрица может состоять из двух столбцов и так много строк как требуется. Входы в индексной матрице – строка и индексы столбца для вдвойне индексированного массива. Предположим, например, что у нас есть массив X4-на-5, и хотим сделать следующее:
– извлечь элементы X [1,3], X [2,2] и X [3,1] как векторную структуру, и
– заменить эти записи в массиве X нулями.
В этом случае необходим массив нижнего индекса 3-на-2, как в следующем примере.
> x <– array (1:20, dim=c (4,5)) # генерирует массив 4 на 5.
> x
Пример массива 4 на 5
> i <– array (c (1:3,3:1), dim=c (3,2))
> i # i является индексным массивом 3 на 2
Использование индексного массива