2015-01-28 3 views
2

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

obs.1 <- c(2,10,53,13,12,15,5) 
obs.2 <- c(3,12,45,2,7,17,5) 
df <- data.frame(obs.1,obs.2) 

Я хочу использовать тест хи-квадрат (chisq.test в R «MASS») на каждой строке, чтобы увидеть, если существует значительная разница между obs.1 к obs.2. Я хотел бы добавить результаты (x-squared, p-value) в df. У меня такое чувство, что функция apply - это правильный способ реализовать это, но не удалось.

+0

Вы пробовали 'cbind (Д.Ф., т (применяются (ДФ, 1, функция (х) {ч <- chisq.test (х) ; c (noname (ch $ статистика), ch $ p.value)}))) ' – akrun

+0

@CathG Я использую chisq, поскольку он используется в других подобных примерах. Каппа только для категориальных данных? – doncarlos

+1

@doncarlos Если у вас есть сомнения относительно того, какой тест использовать (в общих статистических вопросах), http://stats.stackexchange.com/, возможно, лучше разместить сообщение – akrun

ответ

2

Вы можете использовать apply с "MARGIN = 1", а затем сделать chisq.test. Извлеките значения с помощью $statistic и $p.value и cbind в набор данных.

df1 <- cbind(df, t(apply(df, 1, function(x) { 
      ch <- chisq.test(x) 
      c(unname(ch$statistic), ch$p.value)}))) 

colnames(df1)[3:4] <- c('x-squared', 'p-value') 
+0

это работает. изначально возникла проблема, так как несколько строк содержат NA. Это было разрешено (na.omit (data)). – doncarlos

+0

@doncarlos Спасибо за ваши отзывы. – akrun

2

Существует несколько способов сделать это. Один использует apply для прохождения каждой строки (MARGINE = 1), а затем извлекает любую часть требуемого результата (я использую lapply для перехода по каждому элементу списка).

xy <- data.frame(obs1 = c(3,12,45,2,7,17,5), obs2 = c(2,10,53,13,12,15,5)) 
result <- apply(X = xy, MARGIN = 1, FUN = chisq.test) 

Warning message: 
In FUN(newX[, i], ...) : Chi-squared approximation may be incorrect 

# see where p-value is stored 
str(chisq.test(xy[1, ])) 

List of 9 
$ statistic: Named num 0.2 
    ..- attr(*, "names")= chr "X-squared" 
$ parameter: Named num 1 
    ..- attr(*, "names")= chr "df" 
$ p.value : num 0.655 # thar she blows 
$ method : chr "Chi-squared test for given probabilities" 
$ data.name: chr "xy[1, ]" 
$ observed : num [1:2] 3 2 
$ expected : num [1:2] 2.5 2.5 
$ residuals: num [1:2] 0.316 -0.316 
$ stdres : num [1:2] 0.447 -0.447 
- attr(*, "class")= chr "htest" 

Warning message: 
In chisq.test(xy[1, ]) : Chi-squared approximation may be incorrect 

unlist(lapply(result, "[", "p.value"), use.names = FALSE) 

[1] 0.654720846 0.669815358 0.419020334 0.004508698 0.251349109 0.723673610 1.000000000 
3

Вот еще один вариант использования dplyr:

library(dplyr) 

df %>% 
    rowwise() %>% 
    mutate(
    test_stat = chisq.test(c(obs.1, obs.2))$statistic, 
    p_val = chisq.test(c(obs.1, obs.2))$p.value 
    ) 
Смежные вопросы