2013-07-09 63 views
0

我有以下功能:錯誤的功能,試圖刪除NAS計算值

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

我猜命令na.rm=TRUE正在處理我的數據NA。但是,當我用簡單的值測試函數時,行爲不是預期的。例如:

Fisher.test(c(0.1,0.4,0.1,NA)) 
[1] 0.199279 


Fisher.test(c(0.1,0.4,0.1)) 
[1] 0.08705891 

爲什麼在第一個選項中我沒有得到與第二個選項相同的結果? na.rm=TRUE應該刪除NA ??

非常感謝

回答

2

由於這些兩個向量的長度是不同的。如果你只是想篩選出NA是你可以使用sum(!is.na(p))代替length(p),但由於log可產生NaN爲負值,這也將被你sum過濾掉了,我會用sum(p >= 0, na.rm = T)代替(或只是sum(!is.na(log(p)))R弄清楚細節本身):

Fisher.test <- function(p) { 
    Xsq <- -2*sum(log(p), na.rm=TRUE) 
    p.val <- 1-pchisq(Xsq, df = 2*sum(p >= 0, na.rm = T)) 
    return(p.val) 
} 
+0

感謝@eddi,如果不存在負值在我的數據,該方法在「速度」方面,你會用? 'sum(!is.na(p))'或'sum(p> = 0,na.rm = T)'? – user2380782

+0

'sum(!is.na(p))'有點快;請查看'microbenchmark'軟件包以輕鬆檢查這些類型的東西 – eddi