2013-05-24 5 views
1

У меня есть следующий список pvalues ​​Добавить na.omit в качестве аргумента в функции

pval.list <- list(list(a=c(0.05, 0.0001, 0.32, 0.45), b=c(0.1,0.12,0.01,0.06), c=c(0.1,0.12,0.01,0.06), d=c(0.01,0.02,0.03,0.04)), 
     list(e=c(0.04, NA, 0.232, 0.245), f=c(0.05, 0.01, 0.22, 0.54), g=c(0.005, 0.1, 0.032, 0.045)), 
     list(h=c(0.03, 0.01, NA, 0.4), i=c(0.5, 0.0001, 0.132, 0.045), j=c(0.005, 0.0001, 0.0032, 0.045), k=c(0.5, 0.1, 0.932, 0.545)), 
     list(l=c(0.022, NA, 0.32, 0.45), m=c(0.0589, 0.0001, NA, 0.0045)), 
     list(n=c(0.051, 0.01, 0.32, 0.45), o=c(0.05, 0.0001, 0.32, 0.45), p=c(0.05, 0.0001, 0.32, 0.45), q=c(0.05, 0.0001, NA, 0.45)), 
     list(r=c(NA, 0.001, 0.32, 0.45), s=c(0.05, 0.0001, NA, 0.45), t=c(0.05, 0.0001, 0.32, 0.45))) 

Я пытаюсь применить функцию (смотри ниже) к этому списку:

Fisher.test <- function(p) { 
Xsq <- -2*sum(log(p)) 
p.val <- 1-pchisq(Xsq, df = 2*length(p)) 
return(p.val) 
} 

После показания @ G.Grothendieck Я использовал эту команду: lapply(lapply(pval.list, Reduce, f = cbind), apply, 1, Fisher.test) однако, когда в списке отсутствуют значения, подход не работает. Я попытался включить na.omit в качестве аргумента в lapply, но это не устраняет проблему.

Должен ли я добавить na.omit в качестве аргумента в Fisher.test функции?

Благодаря

+0

Что вы хотите, чтобы выход был, когда входным значением является 'NA'? – Thomas

+0

Мой желаемый результат должен быть указан в ответе от пользователя @ user1981275 – user2380782

ответ

1

Ваш NAs производится в sum. Если передать аргумент na.rm=TRUE, вы не будете иметь в Nas ваш результат:

Xsq <- -2*sum(log(p), na.rm=TRUE) 

Вы могли бы сделать na.rm аргумент для Fisher.test, и передать истинное или ложное от lapply, но когда вы всегда хотите исключить NAs, вы должны просто установить аргумент в функции.

Вызов функции на вашей pvalues:

lapply(lapply(pval.list, Reduce, f = cbind), apply, 1, Fisher.test) 

дает:

[[1]] 
[1] 1.953968e-03 2.999509e-05 5.320831e-04 1.339104e-02 

[[2]] 
[1] 0.0007878665 0.0317662968 0.0457435481 0.1146067577 

[[3]] 
[1] 8.982382e-03 3.055250e-08 4.719676e-02 5.094879e-02 

[[4]] 
[1] 0.009911091 0.001021034 0.684618971 0.014584426 

[[5]] 
[1] 2.357950e-03 6.135981e-11 5.543601e-01 6.038488e-01 

[[6]] 
[1] 6.235072e-02 3.470933e-09 6.016501e-01 5.708789e-01 

Всем значения NA теперь удалены перед подсчетом суммы. Это делает то, что вы хотите?

+0

Спасибо @ user1981275, я получаю еще одну ошибку, но из-за того, что некоторые элементы в списке имеют только один уровень, например 'pval.list [[8]]' return 1, а затем 'cbind' не работает, я попытаюсь исправить его – user2380782

+0

Я только опубликовал первые 6 элементов из своего списка – user2380782

+0

Обходным решением может быть:' lapply (lapply (pval.list, function (x) as.matrix (Reduce (x, f = cbind))), apply, 1, Fisher.test) '. Поскольку 'reduce' и' cbind' дают вам матрицу для данных, которые вы указали выше, но если в 'pval.list' есть вектор, содержащий только один элемент, возвращается скаляр. – user1981275