Sunday, 18 September 2016

T
rong quá trình xử lý, phân tích số liệu vì một lý do nào đó, chúng ta muốn phân tích riêng cho từng đối tượng, địa điểm, độ tuổi hay từng công thức thí nghiệm tùy theo mục đích nghiên cứu. Lệnh subset trong R giúp chúng ta làm chuyện này với một vài thao tác đơn giản, không mất nhiều thời gian như các biện pháp thông thường.

Để minh chứng, tiện cho việc theo dõi và hiểu “câu chuyện” tôi xin được lấy một ví dụ mà tôi đã xử lý, để ôn lại cho nhớ và muốn lưu lại tham khảo. Lệnh subset (data, cond), trong đó data là data.frame mà chúng ta muốn tách rời và cond là điều kiện. Ví dụ:

> kllBTB
data (kllBTBT) gồm các biến sau (biến liên tục, biến không liên tục):

> names(kllBTB)
 [1] "Local"                  "Age"                    "CTTN"                 
 [4] "stump_diameter"         "tree_height"            "canopy_diameter"      
 [7] "Main_trunk"             "bough_50"               "phan_than"             
[10] "stump_diameter_growth"  "tree_height_growth"     "canopy_diameter_growth"

Tuy nhiên, vấn đề gặp phải là trong data (kllBTB) ở biến Local có 3 địa phương (Cam_Duong, Le_Thuy và Trieu_Phong), biến Age có (1.0, 1.2, 2.3), biến CTTN có 4 công thức (DC, CT 1, CT 2, CT 3). Với mục đích phân tích 12 biến trên cho từng địa phương, cho từng độ tuổi và từng công thức thí nghiệm, ngay cả vẽ biểu đồ sau này. Như thông thường chúng ta có các cách sau: (i) Nhập và lưu số liệu cho từng địa phương (Local), cho từng độ tuổi (Age); (ii) Tách số liệu thủ công bằng cách lưu cho từng địa phương cho từng độ tuổi khác nhau (coppy paste trong excel). Trong khi, data (kllBTB) nhập đầy đủ số liệu cho các địa phương, ở các độ tuổi và CTTN khác nhau với hàng ngàn dữ liệu. Nếu làm thủ công sẽ lưu nhiều file, mất nhiều thời gian, và nếu có sử dụng trong r cũng khá mất công (thực ra trong r vẫn còn nhiều cách để thực hiện, tuy nhiên trong giới hạn vốn hiểu biết, tìm tòi của mình có hạn nên rất mong được quý độc giả góp ý để mình biết thêm những packages, những hàm, những lệnh hữu ích hơn. Cũng xin mạn phép được bỏ quá cho, bởi mình đang trong quá trình tìm hiểu, và thực hành nên không tránh khỏi những thiếu sót. Trân trọng).

Lệnh subset trong r sẽ giúp chúng ta một cách đơn giản, gọn nhẹ, nhanh chóng và khoa học. Chúng ta cùng bắt đầu nhé.

> kllBTB
id
Local
Age
CTTN
stum_
diameter
tree_
height
canopy_
diameter
main_
trunk
bough_50
phan_than
1
Le_Thuy
1.0
DC
2.6
0.8
0.8
4
2
0
2
Le_Thuy
1.0
DC
1.9
0.8
1.3
4
3
0
3
Le_Thuy
1.0
DC
1.9
0.8
1.3
6
2
0
4
Le_Thuy
1.0
DC
2.7
1.1
1.4
3
2
0
5
Le_Thuy
1.0
DC
2.6
1.1
1.5
6
1
0
...
1673
Cam_Duong
2.0
CT 3
4.1
1.8
2.0
1
16
1
1674
Cam_Duong
2.0
CT 3
6.5
2.7
2.3
1
21
1
1675
Cam_Duong
2.0
CT 3
4.7
2.2
2.8
2
26
1

Thứ nhất, tách dữ liệu cho từng địa phương.

> TrieuPhong=subset(kllBTB, Local=="Trieu_Phong")
> LeThuy=subset(kllBTB, Local=="Le_Thuy")
> CamDuong=subset(kllBTB, Local=="Cam_Duong")

Từ các data.frame (TrieuPhong, LeThuy và CamDuong) được tách chiết từ data (kllBTB), chúng ta có thể xử lý riêng cho từng địa phương. Tuy nhiên, vấn đề gặp phải tiếp theo là ở mỗi địa phương lại có các độ tuổi và các CTTN khác nhau, vì vậy việc phân tích thống kê hay vẽ biểu đồ vẫn gặp một số khó khăn nhất định.

Phân tích thống kê ở đây tôi chỉ đề cập đến một số thông số cơ bản như: mean, sd (độ lệch chuẩn), se (sai số chuẩn), median, min, max, bách phân vị 25%, bách phân vị 75%... Vẽ biểu đồ ở đây tôi chỉ đề cập đến các loại biểu đồ thông dụng như: boxplot, point, tương quan, kết hợp giữa biểu đồ tương quan với histogram hay density...
Trong data mới có tên là CamDuong (chiết dữ liệu từ kllBB bằng lệnh):

> CamDuong=subset(kllBTB, Local=="Cam_Duong")

 Trong data.frame (CamDuong) có 2 độ tuổi khác nhau với 4 CTTN. Vấn đề đặt ra là chiết dữ liệu tiếp theo các độ tuổi khác nhau, để tiện cho việc phân tích và vẽ biểu đồ. Cụ thể như sau:

Thứ hai, sử dụng tiếp lệnh subset để chiết tách theo các độ tuổi khác nhau

Ta lại có thêm 2 data mới tách chiết từ data (CamDuong) là Age1.2 và Age2.3. Có nghĩa là ở Age1.2 các dữ liệu ở độ tuổi 1.2 còn các biến số và CTTN vẫn giữ nguyên, tương tự Age2.3.

> Age1.2CamDuong=subset(CamDuong, Age=="1.2")
> Age2.3CamDuong=subset(CamDuong, Age=="2.3")

Đến đây ta dùng lệnh describyBy trong packages (psych) để phân tích thống kê.
Kết quả như sau:

> library(psych)
> describeBy(Age1.2CamDuong, gruop=CTTN, skew=F, range=F)
> attach(Age1.2)
> library(psych)
> describeBy(Age1.2CanDuong, group=CTTN, skew=F, range=F)
group: CT 1
                       vars  n mean   sd   se
Local*                    1 47 1.00 0.00 0.00
Age                       2 47 1.20 0.00 0.00
CTTN*                     3 47 1.00 0.00 0.00
stump_diameter            4 47 2.58 0.69 0.10
tree_height               5 47 0.87 0.25 0.04
canopy_diameter           6 47 1.06 0.25 0.04
Main_trunk                7 47 3.49 1.32 0.19
bough_50                  8 47 2.30 1.08 0.16
phan_than                 9 47 0.21 0.41 0.06
stump_diameter_growth    10 47 2.15 0.57 0.08
tree_height_growth       11 47 0.72 0.21 0.03
canopy_diameter_growth   12 47 0.86 0.21 0.03
litter_fall              13 47 0.12 0.04 0.01
---------------------------------------------
group: CT 2
                       vars  n mean   sd   se
Local*                    1 71 1.00 0.00 0.00
Age                       2 71 1.20 0.00 0.00
CTTN*                     3 71 2.00 0.00 0.00
stump_diameter            4 71 2.31 0.77 0.09
tree_height               5 71 0.77 0.20 0.02
canopy_diameter           6 71 0.92 0.31 0.04
Main_trunk                7 71 2.86 1.38 0.16
bough_50                  8 71 1.77 1.00 0.12
phan_than                 9 71 0.06 0.23 0.03
stump_diameter_growth    10 71 1.93 0.64 0.08
tree_height_growth       11 71 0.64 0.17 0.02
canopy_diameter_growth   12 71 0.75 0.26 0.03
litter_fall              13 71 0.11 0.04 0.00
---------------------------------------------
group: CT 3
                       vars   n mean   sd   se
Local*                    1 110 1.00 0.00 0.00
Age                       2 110 1.20 0.00 0.00
CTTN*                     3 110 3.00 0.00 0.00
stump_diameter            4 110 2.67 0.81 0.08
tree_height               5 110 0.97 0.33 0.03
canopy_diameter           6 110 1.17 0.40 0.04
Main_trunk                7 110 3.55 1.54 0.15
bough_50                  8 110 2.32 1.17 0.11
phan_than                 9 110 0.13 0.33 0.03
stump_diameter_growth    10 110 2.23 0.68 0.06
tree_height_growth       11 110 0.79 0.28 0.03
canopy_diameter_growth   12 110 0.97 0.33 0.03
litter_fall              13 110 0.13 0.04 0.00
----------------------------------------------
group: DC
                       vars  n mean   sd   se
Local*                    1 19 1.00 0.00 0.00
Age                       2 19 1.20 0.00 0.00
CTTN*                     3 19 4.00 0.00 0.00
stump_diameter            4 19 2.20 0.59 0.14
tree_height               5 19 0.72 0.25 0.06
canopy_diameter           6 19 0.85 0.30 0.07
Main_trunk                7 19 2.16 1.12 0.26
bough_50                  8 19 1.26 0.81 0.18
phan_than                 9 19 0.26 0.45 0.10
stump_diameter_growth    10 19 1.83 0.49 0.11
tree_height_growth       11 19 0.59 0.19 0.04
canopy_diameter_growth   12 19 0.69 0.25 0.06
litter_fall              13 19 0.10 0.03 0.01
Tương tự ở độ tuổi 2.3
> describeBy(Age2.3CamDuong, group=CTTN, skew=F, range=F)
group: CT 1
                       vars  n mean   sd   se
Local*                    1 64 1.00 0.00 0.00
Age                       2 64 2.30 0.00 0.00
CTTN*                     3 64 1.00 0.00 0.00
stump_diameter            4 64 3.22 0.95 0.12
tree_height               5 64 1.39 0.40 0.05
canopy_diameter           6 64 1.76 0.33 0.04
Main_trunk                7 64 2.33 0.84 0.10
bough_50                  8 64 9.95 3.01 0.38
phan_than                 9 64 0.38 0.49 0.06
stump_diameter_growth    10 64 1.43 0.42 0.05
tree_height_growth       11 64 0.61 0.19 0.02
canopy_diameter_growth   12 64 0.78 0.15 0.02
litter_fall              13 64 0.16 0.05 0.01
----------------------------------------------
group: CT 2
                       vars  n mean   sd   se
Local*                    1 69 1.00 0.00 0.00
Age                       2 69 2.30 0.00 0.00
CTTN*                     3 69 2.00 0.00 0.00
stump_diameter            4 69 3.30 1.31 0.16
tree_height               5 69 1.39 0.42 0.05
canopy_diameter           6 69 1.80 0.45 0.05
Main_trunk                7 69 2.67 1.22 0.15
bough_50                  8 69 9.49 2.74 0.33
phan_than                 9 69 0.38 0.49 0.06
stump_diameter_growth    10 69 1.47 0.58 0.07
tree_height_growth       11 69 0.61 0.19 0.02
canopy_diameter_growth   12 69 0.79 0.20 0.02
litter_fall              13 69 0.16 0.07 0.01
---------------------------------------------
group: CT 3
                       vars   n  mean   sd   se
Local*                    1 228  1.00 0.00 0.00
Age                       2 228  2.30 0.00 0.00
CTTN*                     3 228  3.00 0.00 0.00
stump_diameter            4 228  3.81 1.47 0.10
tree_height               5 228  1.63 0.63 0.04
canopy_diameter           6 228  2.06 0.54 0.04
Main_trunk                7 228  2.27 0.97 0.06
bough_50                  8 228 12.85 6.58 0.44
phan_than                 9 228  0.61 0.49 0.03
stump_diameter_growth    10 228  1.69 0.66 0.04
tree_height_growth       11 228  0.72 0.29 0.02
canopy_diameter_growth   12 228  0.91 0.24 0.02
litter_fall              13 228  0.19 0.08 0.01
-----------------------------------------------
group: DC
                       vars  n  mean   sd   se
Local*                    1 30  1.00 0.00 0.00
Age                       2 30  2.30 0.00 0.00
CTTN*                     3 30  4.00 0.00 0.00
stump_diameter            4 30  4.88 1.57 0.29
tree_height               5 30  1.78 0.51 0.09
canopy_diameter           6 30  2.47 0.40 0.07
Main_trunk                7 30  1.70 0.65 0.12
bough_50                  8 30 12.60 4.11 0.75
phan_than                 9 30  0.73 0.45 0.08
stump_diameter_growth    10 30  2.17 0.70 0.13
tree_height_growth       11 30  0.78 0.24 0.04
canopy_diameter_growth   12 30  1.08 0.18 0.03
litter_fall              13 30  0.24 0.08 0.02
Thứ ba, phân tích các chỉ tiêu bách phân vị 25%, bách phân vị 75%, median, max, min. Chúng ta sử dụng tiếp lệnh summary (data). Tuy nhiên ta chưa thể phân tích các chỉ tiêu trên cho tất cả các biến ở cùng độ tuổi trong cùng một công thức thí nghiệm. Nếu ta sử dụng lệnh summary (data=cd) thì cho kết quả các thông tin cần phân tích, nhưng lại phân tích chung cho tất cả các CTTN. Kết quả như sau:

> summary(Age1.2CamDuong)

      Age          CTTN     stump_diameter    tree_height   canopy_diameter
 Min.   :1.000   CT 1: 57   Min.   : 1.400   Min.   :0.40   Min.   :0.60   
 1st Qu.:1.000   CT 2:102   1st Qu.: 3.000   1st Qu.:0.90   1st Qu.:1.40   
 Median :1.600   CT 3:116   Median : 3.900   Median :1.50   Median :1.90   
                   Mean   :1.475   DC  : 94   Mean   : 4.215   Mean   :1.58   Mean   :1.88   
                   3rd Qu.:2.000              3rd Qu.: 5.200   3rd Qu.:2.10   3rd Qu.:2.40   
                   Max.   :2.000              Max.   :10.700   Max.   :3.50   Max.   :3.80   
                                                                                             
   Main_trunk       bough_50        phan_than      stump_diameter_growth tree_height_growth
 Min.   :1.000   Min.   : 0.000   Min.   :0.0000   Min.   :1.200         Min.   :0.400     
 1st Qu.:1.000   1st Qu.: 1.000   1st Qu.:0.0000   1st Qu.:2.300         1st Qu.:0.800     
 Median :2.000   Median : 2.000   Median :1.0000   Median :2.800         Median :1.000     
 Mean   :2.664   Mean   : 9.558   Mean   :0.5583   Mean   :2.894         Mean   :1.043     
 3rd Qu.:4.000   3rd Qu.:18.000   3rd Qu.:1.0000   3rd Qu.:3.300         3rd Qu.:1.200     
 Max.   :8.000   Max.   :38.000   Max.   :1.0000   Max.   :6.300         Max.   :1.900     
                 NA's   :104                                                               
 canopy_diameter_growth
 Min.   :0.600         
 1st Qu.:1.100         
 Median :1.300         
 Mean   :1.271         
 3rd Qu.:1.400         
 Max.   :1.900

Thứ tư, vấn đề đặt ra là, sử dụng lệnh summary để phân tích các chỉ tiêu thống kê cho tất cả các biến cho riêng từng CTTN. Ta lại dùng lệnh subset để tách riêng từng công thức, cụ thể như sau:
> DC=subset(Age1.2tp, CTTN=="DC")

> DC
          Local Age CTTN stump_diameter tree_height canopy_diameter
135 Trieu_Phong 1.2   DC            1.7         0.6             0.6
136 Trieu_Phong 1.2   DC            1.3         0.4             0.7
137 Trieu_Phong 1.2   DC            1.9         0.6             0.9
138 Trieu_Phong 1.2   DC            1.7         0.6             0.6
139 Trieu_Phong 1.2   DC            1.8         0.6             0.6
140 Trieu_Phong 1.2   DC            2.4         0.7             0.8
141 Trieu_Phong 1.2   DC            1.8         0.5             0.6
142 Trieu_Phong 1.2   DC            2.5         1.0             1.1
143 Trieu_Phong 1.2   DC            1.7         0.4             0.6
144 Trieu_Phong 1.2   DC            2.0         0.7             0.7
145 Trieu_Phong 1.2   DC            2.0         0.7             0.7
146 Trieu_Phong 1.2   DC            3.2         0.9             1.2
147 Trieu_Phong 1.2   DC            2.2         1.0             0.9
148 Trieu_Phong 1.2   DC            3.2         1.1             1.4
149 Trieu_Phong 1.2   DC            3.1         1.3             1.4
150 Trieu_Phong 1.2   DC            2.5         0.7             1.1
151 Trieu_Phong 1.2   DC            2.5         0.9             1.2
152 Trieu_Phong 1.2   DC            2.9         0.4             0.6
153 Trieu_Phong 1.2   DC            1.4         0.5             0.4
    Main_trunk bough_50 phan_than stump_diameter_growth tree_height_growth
135          1        1         1                   1.4                0.5
136          5        0         0                   1.1                0.4
137          2        2         0                   1.6                0.5
138          1        1         0                   1.4                0.5
139          1        1         1                   1.5                0.5
140          2        2         0                   2.0                0.6
141          1        1         1                   1.5                0.4
142          2        1         1                   2.1                0.8
143          3        0         0                   1.4                0.3
144          2        1         0                   1.7                0.6
145          2        2         0                   1.6                0.6
146          1        1         1                   2.7                0.8
147          3        1         0                   1.9                0.8
148          2        2         0                   2.7                0.9
149          3        3         0                   2.5                1.0
150          2        2         0                   2.1                0.6
151          3        2         0                   2.0                0.7
152          4        1         0                   2.4                0.4
153          1        0         0                   1.2                0.4
    canopy_diameter_growth litter_fall
135                    0.5        0.07
136                    0.5        0.06
137                    0.7        0.08
138                    0.5        0.08
139                    0.5        0.08
140                    0.7        0.11
141                    0.5        0.08
142                    0.9        0.12
143                    0.5        0.07
144                    0.5        0.09
145                    0.6        0.09
146                    1.0        0.15
147                    0.7        0.10
148                    1.1        0.15
149                    1.2        0.15
150                    0.9        0.12
151                    1.0        0.12
152                    0.5        0.14
153                    0.3        0.06

Tương tự cho các công thức còn lại:

> CT1=subset(Age1.2tp, CTTN=="CT 1")
> CT2=subset(Age1.2tp, CTTN=="CT 2")
> CT3=subset(Age1.2tp, CTTN=="CT 3")

Thứ năm, bây giờ ta có thể sử dụng lệnh summary cho từng công thức, cụ thể:

> summary(DC)

     Age        CTTN    stump_diameter  tree_height     canopy_diameter    Main_trunk   
   Min.   :1.2   CT 1: 0   Min.   :1.30   Min.   :0.4000   Min.   :0.4000   Min.   :1.000  
   1st Qu.:1.2   CT 2: 0   1st Qu.:1.75   1st Qu.:0.5500   1st Qu.:0.6000   1st Qu.:1.000  
   Median :1.2   CT 3: 0   Median :2.00   Median :0.7000   Median :0.7000   Median :2.000  
   Mean   :1.2   DC  :19   Mean   :2.20   Mean   :0.7158   Mean   :0.8474   Mean   :2.158  
   3rd Qu.:1.2             3rd Qu.:2.50   3rd Qu.:0.9000   3rd Qu.:1.1000   3rd Qu.:3.000  
   Max.   :1.2             Max.   :3.20   Max.   :1.3000   Max.   :1.4000   Max.   :5.000  
bough_50       phan_than      stump_diametergrowth treeheightgrowth canopydiametergrowth
 Min.   :0.000   Min.   :0.0000   Min.   :1.100         Min.   :0.3000     Min.   :0.3000        
 1st Qu.:1.000   1st Qu.:0.0000   1st Qu.:1.450         1st Qu.:0.4500     1st Qu.:0.5000        
 Median :1.000   Median :0.0000   Median :1.700         Median :0.6000     Median :0.6000        
 Mean   :1.263   Mean   :0.2632   Mean   :1.832         Mean   :0.5947     Mean   :0.6895        
 3rd Qu.:2.000   3rd Qu.:0.5000   3rd Qu.:2.100         3rd Qu.:0.7500     3rd Qu.:0.9000        
 Max.   :3.000   Max.   :1.0000   Max.   :2.700         Max.   :1.0000     Max.   :1.2000        
  litter_fall    
 Min.   :0.0600  
 1st Qu.:0.0800  
 Median :0.0900  
 Mean   :0.1011  
 3rd Qu.:0.1200  
 Max.   :0.1500 

Tương tự cho CT1, CT2 và CT3.

Thứ sáu, từ đây ta có thể vẽ các loại biểu đồ cho từng địa phương, cụ thể như sau:

Vẽ biểu đồ boxplot:

Mã codes như sau:
> tp=ggplot(data=klltp, aes(klltp$CTTN, y=stump_diameter, fill=CTTN))+ geom_boxplot(aes(fill=CTTN))+ theme_bw()+ theme_classic()+ ylab("stump diameter, cm")+xlab("CTTN")
> tp5=tpp+ geom_rangeframe()+ theme_tufte()+ scale_y_continuous(breaks=extended_range_breaks()(klltp$stump_diameter))

Vẽ biểu đồ tương quan tiếp

# Codes như sau:
> tp=ggplot(data=klltp, aes(x=stump_diameter, y=tree_height, fill=CTTN))+ geom_point(aes(color=CTTN, size=Main_trunk))+ theme_bw()+ theme_classic()+ xlab("stump diameter, cm")+ ylab("tree height, m")+ geom_smooth(method="lm") + ggtitle("The correlation between tree height with stump diameter of Acacia crassicarpa \n in coastal sandy regions of Quang Tri province")
> tp1= tp+ geom_rangeframe()+ theme_tufte()+ scale_x_continuous(breaks=extended_range_breaks()(klltp$stump_diameter))+ scale_y_continuous(breaks=extended_range_breaks()(klltp$tree_height))

Vẽ biểu đồ tương quan tiếp

> ggMarginal(tp1, type="histogram", color="violet", size=2.5)


Vẽ biểu đồ tương quan tiếp

> ggMarginal(tp1, type="density", color="red", size=2.5)


Trên đây là một vài trường hợp mà chúng ta muốn phân tích riêng cho một đối tượng (hay địa điểm), và để làm điều này chúng ta dùng lệnh subset(data, cond), trong đó, datadata.frame mà chúng ta muốn tác rời, và cond là điều kiện để tách. Như vậy, với một vài thao tác chúng ta có dữ liệu mà cần phân tích riêng như ý muốn mà không phải qua các bước trung gian như thường làm trong Excel.

0 nhận xét:

Post a Comment

Powered by Blogger.

Contact Form

Name

Email *

Message *

Pages - Menu

Popular

Total Pageviews

Popular Posts

Recent Posts

Text Widget