2018年12月25日 星期二

R語言使用lapply或sapply做T-tests

一個資料表中,根據某個欄做完分群後,想要對這些分群的某個數值做T檢定、甚至是兩兩做T檢定。這個時候可使用lapply(或sapply,會將lapply輸出表格化、易於判讀)來快速達成。以下舉例lapply與sapply要怎麼使用


## 1. 將InsectSpray資料表根據spray欄位使用split做分割

> d <- InsectSprays
> s <- split(d, d$spray)

## 2. 對於每個不同的spray裡面會一串count值,看這些數值的最大值與最小值等特性:

> tapply(df$count, df$spray, summary)
> lapply(s, function(x) summary(x$count))
> sapply(s, function(x) summary(x$count))
            A        B        C         D    E        F
Min.     7.00  7.00000 0.000000  2.000000 1.00  9.00000
1st Qu. 11.50 12.50000 1.000000  3.750000 2.75 12.50000
Median  14.00 16.50000 1.500000  5.000000 3.00 15.00000
Mean    14.50 15.33333 2.083333  4.916667 3.50 16.66667
3rd Qu. 17.75 17.50000 3.000000  5.000000 5.00 22.50000
Max.    23.00 21.00000 7.000000 12.000000 6.00 26.00000
這邊可以注意tapply與lapply出來的結果會是相同的,但用sapply比較易讀~
lapply與sapply的運作方式:先從s讀取出每個元素,將此元素存到後面的變數x裡面,後面的function在對於變數x做各種操作

## 3. 兩兩欄位做count的T檢定,印出p.value值。例如說使用spray A的counts和spray B的counts做T檢定,使用p-value來看平均值有沒有不同:

> lapply(s, function(x) { lapply(s, function(y) t.test(x$count, y$count)$p.value) })
> sapply(s, function(x) { lapply(s, function(y) t.test(x$count, y$count)$p.value) })
  A            B            C            D            E            F           
A 1            0.6546567    5.278477e-07 1.012091e-05 2.654548e-06 0.3472757   
B 0.6546567    1            5.170528e-08 9.743926e-07 2.940309e-07 0.5472263   
C 5.278477e-07 5.170528e-08 1            0.005729735  0.07536352   2.876313e-06
D 1.012091e-05 9.743926e-07 0.005729735  1            0.1229187    2.469968e-05
E 2.654548e-06 2.940309e-07 0.07536352   0.1229187    1            9.550002e-06
F 0.3472757    0.5472263    2.876313e-06 2.469968e-05 9.550002e-06 1    
可以看到p-value最小的會是B與C ≈ 5e-8,去看R預設的資料集InsectSprays這裡面的圖示可以發現他們的平均數的確是相差很多。
要做兩兩比較的話,必須要用到兩層lapply或sapply。可以理解成把lapply與sapply當成迴圈來使用~

參考資料與相關資料

_EOF_

沒有留言:

張貼留言