2016-12-21 39 views
0

我有興趣在每行上生成一個χ2值(X平方和p值),並將測試結果附加到單獨的列中。我擁有的數據是每個行的基因和兩個不同組的正常(野生型)突變的計數。下面是一個例子數據集的設置:將卡方檢驗結果添加到每行

Genes<-c("GENE_A", "GENE_B","GENE_C") 
Group1_Mut<-c(20,10,5) 
Group1_WT<-c(40,50,55) 
Group2_Mut<-c(10, 30, 10) 
Group2_WT<-c(80, 60, 80) 
main<-data.frame(Genes,Group1_Mut,Group1_WT,Group2_Mut,Group2_WT) 

當我嘗試的第一行通作爲基體的卡方檢驗我得到這個錯誤:

chisq.test(matrix(main[1,2:5], nrow=2, 2,2)) Error in sum(x) : invalid 'type' (list) of argument

任何想法我怎麼會創建一個2x2表的函數來遍歷列表,併爲主表中的每個基因附加X平方和pvalues?

注:我確實看到了SF這個其他例子:chi square test for each row in data frame

但它並不太適合我試圖在這裏適用。

回答

3

明白爲什麼錯誤是試圖傳達的信息,數據chisq.test的類型比較數據期待:

dput(matrix(main[1,2:5,drop=T], nrow=2, 2,2)) 
# structure(list(20, 10, 40, 80), .Dim = c(2L, 2L)) 
dput(matrix(1:4, nrow=2, 2,2)) 
# structure(c(1L, 3L, 2L, 4L), .Dim = c(2L, 2L)) 

補救的辦法是迫使你的數據到一個numeric載體:

res <- chisq.test(matrix(as.numeric(main[1,2:5]), nrow=2, 2,2)) 
res 
# Pearson's Chi-squared test with Yates' continuity correction 
# data: matrix(as.numeric(main[1, 2:5]), nrow = 2, 2, 2) 
# X-squared = 9.7656, df = 1, p-value = 0.001778 

現在,如果你想將結果添加到每一行,你首先需要選擇「哪些結果」。也就是說,結果實際上是美化了一番一點,與國內一些花絮:

str(unclass(res)) 
# List of 9 
# $ statistic: Named num 9.77 
# ..- attr(*, "names")= chr "X-squared" 
# $ parameter: Named int 1 
# ..- attr(*, "names")= chr "df" 
# $ p.value : num 0.00178 
# $ method : chr "Pearson's Chi-squared test with Yates' continuity correction" 
# $ data.name: chr "matrix(as.numeric(main[1, 2:5]), nrow = 2, 2, 2)" 
# $ observed : num [1:2, 1:2] 20 10 40 80 
# $ expected : num [1:2, 1:2] 12 18 48 72 
# $ residuals: num [1:2, 1:2] 2.309 -1.886 -1.155 0.943 
# $ stdres : num [1:2, 1:2] 3.33 -3.33 -3.33 3.33 

如果你想包括(例如)檢驗統計量的數字,你可以這樣做:

chisq.statistic <- sapply(seq_len(nrow(main)), function(row) { 
    chisq.test(matrix(as.numeric(main[row,2:5]), nrow=2, 2,2))$statistic 
}) 
main$chisq.statistic <- chisq.statistic 
main 
# Genes Group1_Mut Group1_WT Group2_Mut Group2_WT chisq.statistic 
# 1 GENE_A   20  40   10  80  9.76562500 
# 2 GENE_B   10  50   30  60  4.29687500 
# 3 GENE_C   5  55   10  80  0.07716049 

注像dplyrdata.table這樣的工具可能會促進這一點。例如:

library(dplyr) 
main %>% 
    rowwise() %>% 
    mutate(
    chisq.statistic = chisq.test(matrix(c(Group1_Mut, Group1_WT, Group2_Mut, Group2_WT), nrow = 2))$statistic 
) 
# Source: local data frame [3 x 6] 
# Groups: <by row> 
# # A tibble: 3 × 6 
# Genes Group1_Mut Group1_WT Group2_Mut Group2_WT chisq.statistic 
# <fctr>  <dbl>  <dbl>  <dbl>  <dbl>   <dbl> 
# 1 GENE_A   20  40   10  80  9.76562500 
# 2 GENE_B   10  50   30  60  4.29687500 
# 3 GENE_C   5  55   10  80  0.07716049 

此示例顯示了您可能希望將其中一種方法合併到您使用的任何一種方法:顯式命名列。也就是說,「2:5」可能會根據您的輸入矩陣而變化。

0

這裏的奇怪之處在於,你並沒有給matrix一個向量,而是給它一個數據幀。

main[1,2:5] 
    Group1_Mut Group1_WT Group2_Mut Group2_WT 
1   20  40   10  80 

而且由於矩陣中的每個元素必須具有相同的類型,因此您的矩陣元素最終都會成爲列表。

m <- matrix(main[1,2:5], nrow=2, byrow = TRUE) 

class(m) 
"matrix" 
typeof(m) 
"list" 

class(m[1, 1]) 
"list" 

你需要調用matrix

chisq.test(matrix(unlist(main[1, 2:5], nrow = 2, byrow = TRUE))) 

這將產生你想要什麼之前,你unlist數據幀元素。

+0

打了我33秒...... ;-) – r2evans

+0

可能是因爲我放鬆了一些細節。 :) – Benjamin

+0

80%「現在」與95%33秒「太晚」... – r2evans