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ụ:
> data =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. Cụ thể
như sau:
> kllBTB
> fix(kllBTB)
Thứ nhất, tách dữ liệu cho
từng địa phương.
> CamDuong = subset(kllBTB, Local == "Cam
Duong")
> LeThuy = subset(kllBTB, Local == "Le
Thuy")
> TrieuPhong = subset(kllBTB, Local == "Trieu
Phong")
Từ các data.frame (cd, lt, tp) đượ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 type histogram hay type density...
Trong data mới có tên là cd (chiết dữ liệu từ kllBB bằng lệnh: > cd=subset(kllBTB, Local=="Cam_Duong")).
Trong data.frame (cd) 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
> Age1.2=subset(cd,
Age=="1.2")
> Age2.3=subset(cd,
Age=="2.3")
Ở đây, chúng ta lại có thêm 2 data mới
tách chiết từ data (cd) 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.
Lúc này, chúng ta dùng lệnh describyBy
trong packages (psych) để phân tích thống kê.
Kết quả như sau:
> head(CamDuong_Age2)
Local Age CTTN stump_diameter tree_height
1691 Cam_Duong 2 DC 8.12 2.45
1692 Cam_Duong 2 DC 3.25 1.30
1693 Cam_Duong 2 DC 4.33 1.60
1694 Cam_Duong 2 DC 5.00 2.10
1695 Cam_Duong 2 DC 4.87 2.80
1696 Cam_Duong 2 DC 5.09 1.80
canopy_diameter main_trunk bough_50_cm phan_than
1691 3.55 1 22 1
1692 1.55 2 11 1
1693 2.95 3 18 0
1694 2.40 2 17 1
1695 3.30 3 32 1
1696 2.50 1 15 1
song_chet stump_diameter_growth tree_height_growth
1691 1 4.06 1.23
1692 1 1.62 0.65
1693 1 2.16 0.80
1694 1 2.50 1.05
1695 1 2.44 1.40
1696 1 2.55 0.90
canopy_diameter_growth litter_fall
1691 1.78 0.42
1692 0.78 0.16
1693 1.48 0.21
1694 1.20 0.25
1695 1.65 0.24
1696 1.25 0.26
> library(psych)
> describeBy(CamDuong_Age2,
group=CTTN, skew=F, range=F)
group: CT 1
vars n
mean sd se
Local* 1 14
1.00 0.00 0.00
Age 2 14 2.00 0.00 0.00
CTTN* 3 14 1.00 0.00 0.00
stump_diameter 4 14 5.33 0.93 0.25
tree_height 5 14 2.44 0.55 0.15
canopy_diameter 6 14
2.58 0.44 0.12
main_trunk 7 14 1.64 0.63 0.17
bough_50_cm 8 14 22.43 7.44 1.99
phan_than 9 14 1.00 0.00 0.00
song_chet 10 14 1.00 0.00 0.00
stump_diameter_growth 11 14
2.67 0.46 0.12
tree_height_growth 12 14
1.22 0.27 0.07
canopy_diameter_growth 13 14
1.29 0.22 0.06
litter_fall 14 14 0.27 0.05 0.01
---------------------------------------------------------------
group: CT 2
vars n
mean sd se
Local* 1 32 1.00 0.00 0.00
Age 2 32 2.00 0.00 0.00
CTTN* 3 32 2.00 0.00 0.00
stump_diameter 4 32 5.62 1.31 0.23
tree_height 5 32 2.36 0.51 0.09
canopy_diameter 6 32
2.68 0.44 0.08
main_trunk 7 32 1.72 0.58 0.10
bough_50_cm 8 32 21.38 5.82 1.03
phan_than 9 32 0.97 0.18 0.03
song_chet 10 32 1.00 0.00 0.00
stump_diameter_growth 11 32
2.81 0.66 0.12
tree_height_growth 12 32
1.18 0.26 0.05
canopy_diameter_growth 13 32
1.34 0.22 0.04
litter_fall 14 32 0.28 0.07 0.01
---------------------------------------------------------------
group: CT 3
vars n
mean sd se
Local* 1 35 1.00 0.00 0.00
Age 2 35 2.00 0.00 0.00
CTTN* 3 35 3.00 0.00 0.00
stump_diameter 4 35 5.26 1.45 0.25
tree_height 5 35 2.15 0.48 0.08
canopy_diameter 6 35
2.33 0.41 0.07
main_trunk 7 35 1.46 0.66 0.11
bough_50_cm 8 35 21.09 6.72 1.14
phan_than 9 35 0.97 0.17 0.03
song_chet 10 35 1.00 0.00 0.00
stump_diameter_growth 11 35
2.63 0.73 0.12
tree_height_growth 12 35
1.08 0.24 0.04
canopy_diameter_growth 13 35
1.17 0.21 0.03
litter_fall 14 35 0.26 0.08 0.01
---------------------------------------------------------------
group: DC
vars
n mean sd
se
Local* 1 32 1.00 0.00 0.00
Age 2 32 2.00 0.00 0.00
CTTN* 3 32 4.00 0.00 0.00
stump_diameter 4 32 5.46 1.51 0.27
tree_height 5 32 2.19 0.51 0.09
canopy_diameter 6 32
2.57 0.49 0.09
main_trunk 7 32 1.88 0.75 0.13
bough_50_cm 8 32 19.38 5.91 1.05
phan_than 9 32 0.94 0.25 0.04
song_chet 10 32 1.00 0.00 0.00
stump_diameter_growth 11 32
2.73 0.76 0.13
tree_height_growth 12 32
1.09 0.25 0.05
canopy_diameter_growth 13 32
1.29 0.25 0.04
litter_fall 14 32 0.27 0.08 0.01
---------------------------------------------------------------
Tương tự ở các độ tuổi khác.
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:
> head(CamDuong)
Local Age CTTN
stump_diameter tree_height
1417 Cam_Duong 1.6 DC 5.51 1.54
1418 Cam_Duong 1.6 CT 1
6.11 1.76
1419 Cam_Duong 1.6 CT 1
3.63 1.38
1420 Cam_Duong 1.6 CT 1
4.20 1.65
1421 Cam_Duong 1.6 DC NA NA
1422 Cam_Duong 1.6 DC 6.24 2.15
canopy_diameter
main_trunk bough_50_cm phan_than
1417 2.29 3 1 1
1418 2.15 1 2 1
1419 2.03 3 1 0
1420 1.97 5 1 1
1421 NA NA NA NA
1422 2.47 3 0 1
song_chet
stump_diameter_growth tree_height_growth
1417 1 3.44 0.96
1418 1 3.82 1.10
1419 1 2.27 0.86
1420 1 2.63 1.03
1421 0 NA NA
1422 1 3.90 1.34
canopy_diameter_growth
litter_fall
1417
1.43 0.28
1418
1.34 0.31
1419
1.27 0.18
1420
1.23 0.21
1421
NA NA
1422
1.54 0.32
> summary(CamDuong)
Local Age CTTN stump_diameter
Cam_Duong :399
Min. :1.000 CT 1: 59
Min. : 1.430
Le_Thuy :
0 1st Qu.:1.000 CT 2:117
1st Qu.: 2.960
Trieu_Phong: 0
Median :1.600 CT 3:118 Median : 3.950
Mean :1.497 DC
:105 Mean : 4.216
3rd
Qu.:2.000 DC :
0 3rd Qu.: 5.160
Max. :2.000 Max. :10.700
NA's :30
tree_height canopy_diameter main_trunk bough_50_cm
Min. :0.400
Min. :0.64 Min.
:1.000 Min. : 0.000
1st Qu.:0.940 1st Qu.:1.38 1st Qu.:1.000 1st
Qu.: 1.000
Median :1.500 Median :1.85 Median :2.000 Median : 2.000
Mean :1.573
Mean :1.87 Mean
:2.664 Mean : 7.434
3rd Qu.:2.100 3rd Qu.:2.35 3rd Qu.:4.000 3rd Qu.:15.000
Max. :3.500
Max. :3.80 Max.
:8.000 Max. :38.000
NA's :30
NA's :30 NA's
:30 NA's :30
phan_than song_chet stump_diameter_growth
Min. :0.0000
Min. :0.0000 Min.
:1.230
1st Qu.:0.0000 1st Qu.:1.0000 1st Qu.:2.320
Median :1.0000 Median :1.0000 Median :2.790
Mean :0.5583
Mean :0.9248 Mean
:2.896
3rd Qu.:1.0000 3rd Qu.:1.0000 3rd Qu.:3.340
Max. :1.0000
Max. :1.0000 Max.
:6.330
NA's :30 NA's :30
tree_height_growth
canopy_diameter_growth
litter_fall
Min. :0.400
Min. :0.640 Min. :0.0600
1st Qu.:0.830 1st Qu.:1.080 1st Qu.:0.1400
Median :1.010 Median :1.280 Median :0.1900
Mean :1.036
Mean :1.266 Mean :0.2086
3rd Qu.:1.210 3rd Qu.:1.440 3rd Qu.:0.2600
Max. :1.940
Max. :1.900 Max. :0.5500
NA's :30
NA's :30 NA's :30
|
|
Vẽ biểu đồ boxplot:
> 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))
# result
Vẽ biểu đồ tương quan tiếp,
> 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))
# result
Vẽ biểu đồ tương quan tiếp,
> ggMarginal(tp1,
type="histogram", color="violet", size=2.5)
# result
Vẽ biểu đồ tương quan tiếp
> ggMarginal(tp1,
type="density", color="red", size=2.5)
# result
0 comments:
Post a Comment