Как сделать таблицу сопряженности в r

Добавил пользователь Владимир З.
Обновлено: 04.10.2024

Можно ли в R построить удобоваримые таблицы сопряженности, содержащие одновременно, например, частоты, накопленные частоты и проценты? Желательно так, чтобы потом экспортировать можно было в файл или через буфер обмена
Может есть какой пакет под это заточенный? Или где описание хорошее встречали?

Upd: Разобрался как построить таблицу частот и таблицу процентов. Но никак не могу понять, как их можно совместить?

Upd: Нашел совмещение в пакете gmodels, функция CrossTable(). Строит таблицы сопряженности в формате SAS или SPSS. Как раз то что нужно. Однако никак не получается нормально их экспортировать для вставки в документ. Через буфер обмена не получается (да и с кириллицей проблема), через импорт в csv тоже не выходит.

Байесовские сети позволяют вычислять условную вероятность и в случае, когда сеть охватывает все стороны изучаемого явления, позволяют восстановить причинно-следственные связи.

Новый пакет R позволяет проводить данный вид анализа данных.

bts

Итак, имеется анкета (опросник) для оценки экономической идентичности, которая состоит из 9 пунктов (ниже приведен фрагмент матрицы (n=20)).
Из них:
- 6 пунктов (q4-q9) - выражены в дихотомической шкале "Да-Нет";
- 2 пункта (q1, q2) - выражены в интервальной шкале (диапазон оценок по обоим пунктам 1-4, и 0-10);
- 1 пункт (q3) - выражается в интервальной шкале, и является составным баллом, который был получен путем суммирования 4-х бинарных пунктов типа "Да-Нет" (информации об ответах на каждый из этих 4-х пунктов, к сожалению, не имеется).
Реальное количество респондентов = 206 чел.

Resp. q1 q2 q3 q4 q5 q6 q7 q8 q9
R1 2 5 0 1 1 1 1 1 1
R2 3 5 0 1 1 1 1 1 1
R3 2 4 1 1 1 1 1 1 0
R4 3 6,5 3 1 1 1 1 1 0
R5 2 3,5 2 1 1 1 1 1 0
R6 3 5 3 0 1 1 1 1 0
R7 3 7 4 0 0 1 1 1 1
R8 3 5,5 4 0 0 1 1 1 1
R9 3 4,5 4 1 0 1 0 1 0
R10 3 7,5 4 1 0 0 0 0 0
R11 3 6,5 2 1 0 1 0 1 1
R12 3 4,5 3 0 0 0 0 0 0
R13 3 5,5 3 1 1 1 1 1 1
R14 3 5 3 1 0 1 0 1 0
R15 3 6 4 1 0 1 1 1 0
R16 3 6 4 1 0 1 1 1 0
R17 3 4,5 2 0 0 1 1 0 1
R18 3 8 4 0 0 0 1 1 0
R19 3 6,5 4 1 0 1 1 0 1
R20 3 6,5 4 0 0 1 1 0 1

Задача: изучить корреляционные связи между пунктами для получения составных баллов и построения шкалы/шкал анкеты.

Сложность: переменные выражены в разных измерительных шкалах, и я не знаю как проверить взаимосвязи сразу между всеми пунктами опросника.

Предупреждение: работать в среде R начал совсем недавно, рассчитываю на снисходительность к новичку со стороны тех кто откликнется.

Полученную таблицу хочу скормить критерию Манна-Уитни. И вообще часто упорядоченные категории приводят в виде таблиц сопряжённости, которые можно проанализировать ранговыми критериями, но для этого их нужно предварительно развернуть в привычный формат, а при сотнях наблюдений ручной набор крайне трудоёмок. Буду очень признателен также за наводку на источник, где можно прочитать про такие операции с таблицами. Благодарю!

Вероятно, там есть терминологические огрехи. Прошу, по возможности, указать мне на них.

Логлинейный анализ предназначен для исследования связей в многомерных таблицах сопряженности (т.е. таблиц, образованных более чем двумя переменными). В ходе анализа исследователь строит модели, цель которых состоит в объяснении частот в ячейках многомерной таблицы при помощи набора параметров. Эти параметры характеризуют вклад категорий каждой из переменных, а также их сочетаний в частоты многомерной таблицы. Чем больше переменныз участвует в анализе, тем больше разнообразных сочетаний их категорий можно составить. Например, если таблица образована тремя переменными А, В и С, то модель может содержать взамодействия всех трех переменных (обозначается А:В:С), а также три попарных взаимодействий А:В, А:С, В:С. При построении так называемых "иерархических логлинейных моделей" предполагается, что включение в модель взаимодействия более высокого порядка (например, А:В:С) автоматически влечет за собой необходимость включить в нее все связанные с ней взаимодействия более низкого порядка (т.е., в нашем случае, попарные взаимодействия А:В, А:С и В:С, а также эффекты категорий А, В и С). Поиск наилучшей модели начинают с рассмотрения так называемой "насыщенной" модели, в которой находятся все мыслимые эффекты изучаемых переменных. Поскольку в насыщенной модели количество параметров в точности равно количеству объясняемых частот, она идеально соответствует данным. Отталкиваясь от нее, исследователь старается построить модель с как можно меньшим количеством параметров, которая при этом удовлетворительно объясняет наблюдаемые частоты в многомерной таблице. Рассмотрим пример взаимосвязи трех переменных, приведенный А.Агрести. В опросе 2276 учеников старших классов г. Дейтон (штат Огайо) респондентам задавали вопросы о том, пробовали ли они хоть раз в жизни: курить сигареты (перемееная С), употреблять алкогольные напитки (переменная А) и курить марихуану (переменная М). Данные сведены в следующую таблицу:

Факторизация неотрицательных матриц (NMF) — это представление матрицы V в виде произведения матриц W и H, в котором все элементы трех матриц неотрицательны. Это разложение используется в различных областях знаний, например, в биологии, компьютерном зрении, рекомендательных системах. В этой публикации пойдет речь о таблицах сопряженности социологических и маркетинговых данных, факторизация которых помогает понять структуру данных этих таблиц.



Удивительно, но на Хабре, видимо, еще не писали о NMF. История этого метода и общие сведения доступны в Википедии (eng). Но сначала ответим на вопрос зачем вообще как-либо преобразовывать таблицы сопряженности.

Исторически одним из первых методов графического представления структуры преобразованной таблицы является анализ соответствий (CA). Он восходит к методу главных компонент, и основан на сингулярном разложении матрицы (SVD). Об SVD можно почитать в этой статье на Хабре. Там же упоминается превосходное видео с определением SVD и примером построения анализа соответствий. Анализ соответствий популярный метод, но факторизация неотрицательных матриц, на мой взгляд, имеет ряд преимуществ. Соображения по этому поводу будут представлены в конце этой статьи.

Далее даны только те определения факторизации, которые необходимы для анализа таблиц сопряженности. Пусть таблица V имеет размер m x n. Обозначим через r ранг матриц W и H, как правило r min. В нашем случае D задается на основе дивергенции Кульбака-Лейблера

image

Остается вопрос с выбором ранга r. Есть несколько методов для оценки r (как, например, и в случае параметра k в методе k-средних). Но лучше вопрос выбора r оставить на усмотрения исследователя/пользователя, тот ранг, при котором структура таблиц наиболее понятна, проста, уместна, и является оптимальным.

В среде R есть пакет nmf [1], в котором реализованы несколько алгоритмов факторизации неотрицательных матриц, визуализации разложения и его диагностика. Возможности NMF будут продемонстрированы на данных 6 раунда европейского социального исследования (ESS). В предыдущей публикации было показано как можно загрузить эти данные в R.


Данные исследования уже загружены, имена объектов остались без изменений.
Перечисляем имена переменных в базе исследования соответствующих вопросам о человеческих ценностях


Добавляем в базу логические переменные, конвертированные в numeric тип и умноженные на веса респондентов

Строим требуемую таблицу (обозначена через cntry.human.values)

И выполняем факторизацию неотрицательных матриц ранга 5

Теперь строим теплокарты матриц W и H. Они определяют разложение исследуемых характеристик в пространстве 5 латентных переменных. Чем темнее клетка, тем более выражено соответствие между латентной переменной и ценностью или страной. Я опускаю математические детали точного определения, подробности можно найти в [1].

Далее отбираем лишь те human.values переменные, которые выражены только по одной из осей в этом пространстве. Названия осей даны мной самостоятельно.


Ниже показан итоговый результат — представление всех 29 стран. Цветом выражены степени соответствия переменных. К тому же страны группируются следуя иерархической кластеризации с евклидовой метрикой в 5-мерном пространстве латентных переменных.


Видим, что в этом пространстве наиболее близкая страна к России — Словакия. Эти страны, в частности, выделяются выраженностью по первой оси, чего нельзя сказать, например, о Франции. Подробнее этот момент будет рассмотрен в следующей части статьи. Диаграмма также показывает какие страны составляют кластеры, в зависимости от требуемой подробности. Например, кластер из стран восточной Европы (Словакия, Россия, Чехия, Украина, Болгария, Венгрия, Литва) и Израиля. Любопытный кластер из Албании, Косово и… Польши. А Норвегия с Финляндией достаточно далеко расположены от Дании со Швецией.


Какие преимущества у NMF?
— В отличии от NMF, в графическом представлении классического анализа соответствий используются только два собственных значения (на графике выше кумулятивная инерция осей CA равна 57.4 %). В NMF визуализация наглядна и для ранга большего двух.
— Во-вторых, теплокарты представляют информацию более структурировано и наглядно, нежели плоскость CA.

С применением NMF для маркетинговой таблицы сопряженности можно познакомиться в этой публикации. В ней рассмотрен пример анализа восприятия 14 автомобильных марок.

Диаграммы NMF, на сколько хороши бы они не были, в общем случае, не дают оснований делать доказательные выводы о сходствах и различиях разных стран относительно представлений о ценностях. Эта задача будет рассмотрена в следующей части статьи.

Литература:
[1] Renaud Gaujoux et al. A flexible R package for nonnegative matrix factorization. In: BMC Bioinformatics 11.1 (2010), p. 367.

У меня есть большой фрейм данных со многими переменными. Многие из них представляют собой ответы по шкале Лайкерта, и школы, к которым относятся наблюдения, являются логическими переменными (и могут включать в себя совпадение).

Пример:

Вывод, который я хочу, - это таблица непредвиденных обстоятельств:

где я могу сделать chi2 тест между школами - здесь A а также B , Ничто из того, что я пробовал, не работает.

Я думаю, что, возможно, есть ответ в том, что я прочитал онлайн, но мне не хватает знаний, чтобы распознать это!

1 ответ

Мы можем использовать dplyr/tidyr , Группируем по "Q1", получаем sum столбцов "A", "B" с использованием summarise_each конвертируйте "широкий" в "длинный" формат с помощью gather и измените его обратно на "широкий" с помощью "распространения".

Редактирование таблиц в R

В прошлый раз мы говорили о том, как загрузить данные в среду R. Следующим важным этапом является их подготовка к визуализации и статистическому анализу. Для этого нам, как правило, необходимо внести некоторые изменения в таблицу, например: удалить столбец или строку, переименовать колонку, произвести сортировку или фильтрацию данных. Многие из этих операций можно сделать в Excel. Однако, зачастую возникают ситуации, когда необходимо изменить структуру или содержание таблицы прямо в ходе анализа. И вот тут у начинающих пользователей R могут возникнуть проблемы. В этой статье мы научимся их решать.

Структура таблицы и изменение типов данных

Лучший способ для закрепления новых знаний - это практика. Поэтому мы продолжим работать с таблицей физических данных студентов одного из военных вузов "voenvuz". Итак, загрузим знакомую уже нам таблицу в Rgui (таблицу можно скачать здесь).

Функции head и str

Для того, чтобы посмотреть правильно ли загрузились данные, введем команду head(voenvuz) , которая покажет первые 6 строчек нашей таблицы. Если все загрузилось нормально, то переходим к команде str(voenvuz) , которая выведет в консоль структуру таблицы.

Функция str R

Итак, в поле "data.frame" мы видим, что наша таблица состоит из 20 строк и 6 столбцов. Под ним располагается список названий столбцов, тип данных и первые шесть элементов каждого столбца. Обратите внимание, что колонки "Name" и "Rhesus.factor" сейчас хранят в себе категориальный тип данных (Factor), а остальные - целочисленный. Компьютер вычислил это автоматически, но в нашем случае - вычислил неверно. Прежде чем мы исправим типы этих данных, немного теоретической информации.

О типах данных

Почему важно правильно распознать тип данных в столбцах таблицы? Потому что при проведении статистических тестов, информация о типе данных учитывается и влияет на результат.

В языке R можно выделить 5 основных типов данных, хранящихся в столбцах таблицы:

  • числовой (numeric);
  • целочисленный (integer);
  • текстовый (character);
  • категориальный (Factor);
  • логический (logical).

Есть также комплексный (complex) и сырой (raw) типы данных, но они редко встречаются, и поэтому я о них здесь писать не буду. Пропущенные данные обозначаются как "NA" (от англ. not available - недоступно), и тогда R игнорирует их.

Изменим типы данных на практике

Посмотрим еще раз на таблицу. Логично предположить, что столбец "Name" с именами студентов не содержит никаких категорий, поэтому, преобразуем эту колонку в обычный текстовый тип данных:

Идем дальше, столбец "Age" был правильно идентифицирован как целочисленный. А вот столбцы "Height" и "Weight" являются скорее числовыми, т.к. могут содержать промежуточные значения, например 182.5. Переделаем их из типа Integer в тип Numeric:

Последнее, что нам нужно - это изменить тип данных в столбце "Blood.group". Каждый из студентов так или иначе имеет одну из 4 групп крови, соответственно, этот столбец содержит четыре категории: "1", "2", "3", "4". Другими словами, в нем должен находиться категориальный тип данных:

В итоге, повторив команду str(voenvuz) , мы должны получить вот такую картинку.

Меняем тип данных в R

Редактирование элементов таблицы

Иногда возникают ситуации, когда необходимо вставить в таблицу столбец или строку, изменить значение элемента или название колонки. Наша таблица - не исключение и нуждается в доработке.

Добавление строк

Добавим в таблицу данные о двух новых студентах: Иване и Олеге. Для этого необходимо создать новую структуру - список (list) , В список мы по порядку вносим параметры, совпадающие со структурой таблицы (напомню, что в кавычках мы пишем нечисловые типы данных):

После, при помощи функции rbind (от англ. row bind, что дословно означает "связать строчки") мы объединим эти два списка с нашей таблицей:

Добавление столбцов

Теперь у нас в таблице два Ивана и два Олега. В данном случае хорошо было бы прописать для каждого студента свой идентификационный номер (ID), чтобы не запутаться, кто есть кто. Для этого создадим структуру, которая называется вектор (последовательность элементов одного типа). В него мы запишем последовательность от 1 до 22, так, чтобы у каждого из наших 22 студентов был свой уникальный ID:

Теперь объединим наш вектор с таблицей, воспользовавшись функцией cbind (от англ. column bind):

Не забудьте поменять тип данных нового столбца на символьный:

В качестве еще одного примера добавления новых столбцов с данными в таблицу, рассчитаем индекс массы тела (BMI) для каждого студента. Для этого, мы воспользуемся новым способом: напишем математическую формулу индекса на языке R и присвоим ей новое имя столбца "BMI" внутри нашей таблицы:

Проверьте, что получилось, используя уже знакомые нам функции head и str

Удаление строк и столбцов

Существует относительно "универсальная формула" для удаления элементов таблицы: new.data
Для того, чтобы корректно ее использовать необходимо запомнить несколько правил:

  1. После имени таблицы пространство внутри квадратных скобок следует разделить на две части запятой.
  2. Все, что находится до запятой, относится к строчкам, все что после - к столбцам.
  3. Поставьте минус перед номером столбца или номером строки, которую собираетесь удалить.
  4. Если таких элементов несколько, используйте функцию c(. ) : внутри скобок перечисление элементов через запятую.

В нашем случае, удалять из таблицы ничего не надо, но я покажу пару примеров, назвав "укороченные" таблицы именами "trash1", "trash2", "trash3", "trash4":

Изменение имен столбцов и данных в ячейках:

Переименуем колонку "Rhesus.factor" на укороченное "Rhesus". Для этого нужно вызвать функцию names , написать в параметрах функции имя таблицы и номер столбца, и присвоить ему новое имя :

Изменение данные в ячейках таблицы не представляет особой сложности. В квадратных скобках прописываем координаты нужной ячейки (до запятой - строка, после запятой - столбец) и присваиваем новое значение:

Редактируем таблицу в R

После всех наших манипуляций мы должны получить вот такую таблицу данных:

Фильтрация и сортировка данных

В качестве примера, исключим из таблицы данных студентов, чей возраст больше 23 лет. Существует множество способов решения подобного рода задач, включая циклы if-else, for или while (о них будет написана отдельная статья). Однако в нашем случае хватит простого фильтра, основанного на логическом операторе " voenvuz.final

Того же результата мы добьемся, если будем использовать логические операторы ">" (больше) и "!" (исключить):

Итак, мы получили финальную версию таблицы "voenvuz.final ". Осталось лишь упорядочить столбцы:

И произвести сортировку данных по имени студентов, используя функцию order :

Результат обработки данных R

После завершения редактирования таблицы, обновим имена строк, т.к. сейчас они не соответствуют действительности, и выведем таблицу на экран, введя имя таблицы в консоль:

Заключение

Описанные выше способы редактирования данных в таблице не уникальны, существует множество других методов и команд, позволяющих получить желаемый результат. Я рассказал лишь о наиболее простых и часто используемых. Для более детального ознакомления с этой темой я хотел бы порекомендовать два источника на английском языке:

  1. сайт http://stackoverflow.com/ (уже подробно разобраны тысячи вопросов по этой теме)
  2. книгу-справочник "R book" by Michael J. Crawley (легко найти бесплатную PDF версию в интернете).

Если у Вас возникли вопросы или проблемы с редактированием таблиц данных, Вы всегда можете оставить комментарий под этой статьей, и он не останется без внимания. А в качестве продолжения, читайте следующую статью, посвященную сохранению данных в среде R.

kod col.x col.y delta
1 00046949 1,000 1,000 2
2 00047069 3,000 3,000 2
3 00047070 19,000 19,000 2
4 00047071 49,000 49,000 2
5 00047072 21,000 21,000 2
356 CB128164 2,000 2
252 CB164884 1,000 2
Всем привет! Только начал изучать R и столкнулся с некой проблемой: Есть такая волшебная таблица. И задача, вывести в последний столбец разницу 2 и 3 го, и с учетом того что данные в последних строках NA, соответственно вывести в последний столбец NA2 или NA3, в зависимости от того где стоит NA. Проблема в том, что стандартные функции(о которых я еще мало знаю) удаляют строки с NA, а мне важно их сохранить и обработать.
Если у кого то будут мысли по теме, буду рад помощи. Да и еще, у меня типы данных факторы в первых трех столбцах, а последний число.

Привет, Олег! А где у тебя NA?
Столбец со значениями 1,2,3,4,5,356,252 — это что?
delta — это столбец со значениями 2?

((ETH1567:0.07723012967,((ETH1478:0.03477412382,ETH1481:0.03998172409)100:0.01982264043,(LAV2470:0.04453502013,LAV2519:0.04666678739) и т.д. без пробелов.

Мне нужно извлечь блоки содержащие буквы и последующие цифры до знака двоеточия, т.е.: ETH1567 ETH1478 ETH1481 LAV2470 LAV2519

Я подобрал регулярку для этого: ([A-z]5*)

Здравствуйте, Данила! Вот одно из возможных решений Вашей задачи:

Читайте также: