Тест хи-квадрат на кадре данных с широкими данными

У меня есть данные, которые выглядят так:

ID  gamesAlone  gamesWithOthers  gamesRemotely  tvAlone  tvWithOthers  tvRemotely
1   1                                                    1
2                                1                       1
3                                1              1
4                                1              1
5                                1                       1
6                                1              1
7                                1              1
8               1                                        1
9   1                                                                   1

Я хотел бы код, который может делать следующие две вещи:

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

        Alone   WithOthers   Remotely
games   2       1            6
tv      4       4            1

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

Это код для генерации фрейма данных:

data<-data.frame(ID=c(1,2,3,4,5,6,7,8,9),
             gamesAlone=c(1,NA,NA,NA,NA,NA,NA,NA,1),
             gamesWithOthers=c(NA,NA,NA,NA,NA,NA,NA,1,NA),
             gamesRemotely=c(NA,1,1,1,1,1,1,NA,NA),
             tvAlone=c(NA,NA,1,1,NA,1,1,NA,NA),
             tvWithOthers=c(1,1,NA,NA,1,NA,NA,1,NA),
             tvRemotely=c(NA,NA,NA,NA,NA,NA,NA,NA,1))

person mob    schedule 08.08.2017    source источник


Ответы (2)


Опустите первый столбец id ([-1]), затем возьмите сумму каждого столбца (colSums), удалив значения NA (na.rm=TRUE), и поместите полученный вектор длины 6 в матрица с 2 строками. Если вы хотите, вы также можете соответствующим образом пометить размеры матрицы (аргумент dimnames):

m <- matrix(
  colSums(data[-1], na.rm=T), 
  nrow=2, byrow=T, 
  dimnames = list(c("games", "tv"), c("alone", "withOthers", "remotely"))
)
m
#       alone withOthers remotely
# games     2          1        6
# tv        4          4        1
chisq.test(m)
# 
#   Pearson's Chi-squared test
# 
# data:  m
# X-squared = 6.0381, df = 2, p-value = 0.04885
person lukeA    schedule 08.08.2017

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

library(dplyr)
library(tidyr)
data1_table <- data1 %>% 
  gather(key, value, -ID) %>% 
  mutate(activity = ifelse(grepl("^tv", key), substring(key, 1, 2), substring(key, 1, 5)), 
         context = ifelse(grepl("^tv", key), substring(key, 3), substring(key, 6))) %>% 
  group_by(activity, context) %>% 
  summarise(n = sum(value, na.rm = TRUE)) %>% 
  ungroup() %>% 
  spread(context, n)

# A tibble: 2 x 4
  activity Alone Remotely WithOthers
*    <chr> <dbl>    <dbl>      <dbl>
1    games     2        6          1
2       tv     4        1          4

Для хи-квадрата: это зависит от того, что вы хотите сравнить, и я бы предположил, что ваши реальные данные имеют более высокие значения. Вы можете передать все это в chisq.test вот так, но я не думаю, что это очень информативно:

data1_table %>%
  select(2:4) %>%
  chisq.test()
person neilfws    schedule 08.08.2017
comment
Простое и адекватное решение. - person Luis; 23.05.2021