2016-12-21 10 views
0

私は、各行にchisquare値(X-squaredとpvalue)を生成し、別々の列にテスト結果を追加することに興味があります。私が持っているデータは、各列の遺伝子と2つの別々のグループの変異(野生型)の数です。ここでは一例データセットの設定は次のとおりです。chi square testの結果を各行に追加

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

任意のアイデアはどのように私ができますリストを反復処理し、メインテーブルの各遺伝子のX平方とp値を追加する2x2テーブル用の関数を作成しますか?

注:私はSFでは、この他の例を参照しました:chi square test for each row in data frame

を、それは非常に私はここに適用しようとしていたものを適合しませんでした。

答えて

3

を期待しているデータchisq.testのタイプを使用してデータを比較、エラーが通信しようとしている理由を確認するには:

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 

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ベクターにあなたのデータを強制することです

結果を各行に追加する場合は、まず「結果」を選択する必要があります。つまり、結果は実際には内部的にいくつかの一口で、少しアップprettiedされています。あなたは数として(例えば)検定統計量を含めるしたい場合

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 

この例では、どちらの使用方法に組み込むことを望むことができる1つの事を示しています。つまり、入力マトリックスによって「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

関連する問題