Hôm nay, đang ngồi xử lý số liệu thì
gặp trường hợp số liệu trống không (missing
value). Để thuận tiện cho các phân tích tiếp theo, thì loại bỏ “số liệu trống không” trong data.frame là
rất cần thiết. Vì R không tính toán được các phân tích tiếp theo.
Loại bỏ số liệu trống không
Trong nghiên cứu, vì nhiều lý do, số
liệu không thể thu thập được cho tất cả các đối tượng, hay không thể đo lường tất
cả các biến số cho một đối tượng, đặc biệt các nghiên cứu theo thời gian (số liệu
theo thời gian). Trong phạm vi bài viết, số liệu về sinh trưởng cây Keo lá liềm
được thử nghiệm trên vùng cát ven biển (3 huyện của 3 tỉnh vùng BTB), với 4
công thức thí nghiệm (CTTN) khác nhau, theo dõi qua các độ tuổi khác nhau. Trong
trường hợp đó, số liệu trống được xem là “missing
value”, có thể gọi là số liệu trống không. Trong R xem các số liệu trống
không là NA (xem hình dưới đây, ví dụ các đối tượng (id) từ 171 đến 177).
Có một số kiểm định thống kê đòi hỏi
phải loại các số liệu trống không ra (vì không tính toán được) trước khi phân
tích. Số liệu trống không trong ví dụ, là các biến của cây Keo lá liềm bị chết,
nên không có số liệu. Vậy câu hỏi đặt ra, tại sao không loại bỏ trước khi nhập
số liệu? Như trên mình có nói, trường hợp nghiên cứu là đánh giá các biến (các
chỉ tiêu sinh trưởng) của cây Keo lá liềm ở các CTTN theo thời gian (qua các
năm, các độ tuổi khác nhau). Trong quá trình theo dõi việc đối tượng bị mất,
hay bị chết, đặc biệt trong công tác trồng vùng đất cát ven biển là điều khó
tránh khỏi. Vấn đề được đặt ra tiếp theo, loại bỏ các số liệu trống không ra khỏi
data để phân tích tiếp theo? Thông thường, mình hay vào file gốc xóa bỏ các
dòng (đối tượng) trống không. Như vậy rất mất thời gian (thủ công), dễ sai sót.
Tuy nhiên, trong R có một lệnh rất có ích cho việc này: na.omit. Cách sử dụng như sau:
> LeThuy_Age1.3=na.omit(LT_Age1.3)
Trong lệnh trên, chúng ta yêu cầu R
loại bỏ các số liệu trống không trong data.frame (LT_Age1.3) và data.frame
(LeThuy_Age1.3) mới đã được loại bỏ các số liệu trống không. Kết quả thể hiện
trong hình dưới đây (để ý cột id và cột mới row.names).
Kết quả hình trên cho thấy (để ý dòng
cuối cùng), cột id có số thứ tự cuối cùng là 227 và cột row.names có số thứ tự
243. Tức là, có 16 đối tượng có số liệu trống không đã được loại bỏ.
Từ đây (data.frame đã loại bỏ số liệu
trống không – LeThuy_Age1.3) có thể xử lý thống kê thông thường.
Trong phạm vi bài viết, mục tiêu là
phân tích một số thông số thống kê thông thường như: mean, sd
(độ lệch chuẩn), se (sai số chuẩn), median, bách phân vị 75%, bách phân vị 25%, max, min...
Kết quả tính thông số thống kê: mean,
sd, se như sau:
#attach(LeThuy_Age1.3)
#head(LeThuy_Age1.3)
> library(psych)
> describeBy(LeThuy_Age1.3,
group=CTTN, skew=F, range=F)
#result
group: CT 1
vars n
mean sd se
Local* 1 67 2.00 0.00 0.00
Age 2 67 2.30 0.00 0.00
CTTN* 3 67 1.00 0.00 0.00
stump_diameter 4 67 3.52 1.37 0.17
tree_height 5 67 1.47 0.45 0.05
canopy_diameter 6 67
1.99 0.48 0.06
main_trunk 7 67
2.00 0.78 0.10
bough_50_cm 8 67 13.73 5.24 0.64
phan_than 9 67 0.67 0.47 0.06
song_chet 10 67 1.00 0.00 0.00
stump_diameter_growth 11 67
1.53 0.60 0.07
tree_height_growth 12 67
0.64 0.19 0.02
canopy_diameter_growth 13 67
0.86 0.21 0.03
litter_fall 14 67 0.19 0.05 0.01
-------------------------------------------
group: CT 2
vars n
mean sd se
Local* 1 80 2.00 0.00 0.00
Age 2 80 2.30 0.00 0.00
CTTN* 3 80 2.00 0.00 0.00
stump_diameter 4 80 3.77 1.37 0.15
tree_height 5 80 1.58 0.51 0.06
canopy_diameter 6 80
2.06 0.46 0.05
main_trunk 7 80 1.91 0.92 0.10
bough_50_cm 8 80 12.40 5.85 0.65
phan_than 9 80 0.79 0.41 0.05
song_chet 10 80 1.00 0.00 0.00
stump_diameter_growth 11 80
1.64 0.60 0.07
tree_height_growth 12 80
0.69 0.22 0.02
canopy_diameter_growth 13 80
0.89 0.20 0.02
litter_fall 14 80 0.20 0.06 0.01
-------------------------------------------
group: CT 3
vars n
mean sd se
Local* 1 75 2.00 0.00 0.00
Age 2 75
2.30 0.00 0.00
CTTN* 3 75 3.00 0.00 0.00
stump_diameter 4 75 4.52 1.43 0.16
tree_height 5 75 1.92 0.58 0.07
canopy_diameter 6 75
2.20 0.44 0.05
main_trunk 7 75 1.83 0.88 0.10
bough_50_cm 8 75 14.33 5.59 0.65
phan_than 9 75 0.95 0.23 0.03
song_chet 10 75 1.00 0.00 0.00
stump_diameter_growth 11 75
1.97 0.62 0.07
tree_height_growth 12 75
0.83 0.25 0.03
canopy_diameter_growth 13 75
0.96 0.19 0.02
litter_fall 14 75 0.23 0.07 0.01
-------------------------------------------
group: DC
vars n
mean sd se
Local* 1 50 2.00 0.00 0.00
Age 2 50
2.30 0.00 0.00
CTTN* 3 50 4.00 0.00 0.00
stump_diameter 4 50 4.19 0.79 0.11
tree_height 5 50 1.50 0.44 0.06
canopy_diameter 6 50
1.91 0.33 0.05
main_trunk 7 50 1.50 0.65 0.09
bough_50_cm 8 50 11.84 4.24 0.60
phan_than 9 50 0.90 0.30 0.04
song_chet 10 50 1.00 0.00 0.00
stump_diameter_growth 11 50
1.82 0.34 0.05
tree_height_growth 12
50 0.65 0.19 0.03
canopy_diameter_growth 13 50
0.83 0.14 0.02
litter_fall 14 50 0.21 0.04 0.01
-------------------------------------------
#Tương tự cho các độ tuổi còn
lại.
Tuy nhiên, để phân tích được các
thông số thống kê như: bách phân vị 75%, bách phân vị 25%, max, min... Chúng ta
lại sử dụng lệnh subset trong R mà
bài trước mình đã giới thiệu. Sau khi subset riêng cho từng CTTN, thì việc tiếp
theo rất đơn giản cho phân tích thống kê cũng như vẽ các biểu đồ theo ý muốn.
#> LeThuy_DC=subset(LeThuy_Age1.3,
CTTN=="DC")
#> attach(LeThuy_DC)
#> head(LeThuy_DC)
> summary(LeThuy_DC)
Local Age CTTN stump_diameter
Cam_Duong : 0
Min. :1.3 CT 1: 0
Min. :1.460
Le_Thuy :34
1st Qu.:1.3 CT 2: 0 1st Qu.:1.995
Trieu_Phong: 0 Median :1.3 CT 3: 0
Median :2.530
Mean :1.3 DC
:34 Mean :2.601
3rd
Qu.:1.3 DC : 0
3rd Qu.:2.913
Max. :1.3 Max. :4.620
------------------------------------------------------
tree_height canopy_diameter main_trunk
Min. :0.6000
Min. :0.450 Min.
:1.000
1st Qu.:0.8050 1st Qu.:0.935 1st Qu.:2.000
Median :0.9400 Median :1.050 Median :2.500
Mean :0.9859
Mean :1.055 Mean
:2.676
3rd Qu.:1.2300 3rd Qu.:1.188 3rd Qu.:3.000
Max. :1.4700
Max. :1.650 Max.
:6.000
---------------------------------------------
bough_50_cm phan_than song_chet
Min. :1.000
Min. :0.0000
Min. :1
1st Qu.:1.000 1st Qu.:0.0000 1st Qu.:1
Median :2.000 Median :0.0000 Median :1
Mean :1.912
Mean :0.3529 Mean
:1
3rd Qu.:2.000 3rd Qu.:1.0000 3rd Qu.:1
Max. :4.000
Max. :1.0000 Max.
:1
------------------------------------------
stump_diameter_growth
tree_height_growth
Min. :1.130 Min. :0.4600
1st Qu.:1.538 1st Qu.:0.6225
Median :1.945 Median :0.7250
Mean :2.001 Mean :0.7585
3rd Qu.:2.237 3rd Qu.:0.9425
Max. :3.550 Max. :1.1300
------------------------------------
canopy_diameter_growth
litter_fall
Min. :0.3500 Min. :0.0600
1st Qu.:0.7225 1st Qu.:0.0900
Median :0.8100 Median :0.1200
Mean :0.8121 Mean :0.1235
3rd Qu.:0.9100 3rd Qu.:0.1400
Max. :1.2700 Max. :0.2300
|
#Tương tự cho các CTTN còn lại.
Vẽ biểu đồ cho đối tượng nghiên cứu
Biểu đồ hộp (boxplot)
#library(ggplot2)
> l=ggplot(data=LeThuy_Age1.3,
aes(LeThuy_Age1.3$CTTN, y=stump_diameter))+ theme_bw()+ theme_classic()+
geom_boxplot(aes(fill=CTTN))+ xlab("CTTN")+ ylab("stump
diameter, cm")
> lt3=l+ geom_rangeframe()+
theme_tufte()+
scale_y_continuous(breaks=extended_range_breaks()(LeThuy_Age1.3$stump_diameter))
Biểu đồ tương quan
> lt=ggplot(data=LeThuy_Age1.3,
aes(x=stump_diameter, y=tree_height))+ theme_bw()+ theme_classic()+
xlab("stump diameter, cm")+ ylab("tree height, m")+
geom_point(aes(color=CTTN, size=Main_trunk))+ geom_smooth(method="lm")
> lt2=lt+ geom_rangeframe()+
theme_tufte()+
scale_x_continuous(breaks=extended_range_breaks()(LeThuy_Age1.3$stump_diameter))+
scale_y_continuous(breaks=extended_range_breaks()(LeThuy_Age1.3$tree_height))
#library(ggExtra)
Biểu đồ tương quan kết hợp với type=”histogram”
> ggMarginal(lt2,
type="histogram", color="White", size=2)
Biểu đồ tương quan kết hợp với type=”density”
> ggMarginal(lt2,
type="density", color="green", size=2)
=====================================================================
Tham khảo: Nguyễn Văn Tuấn
(2014). Phân tích dữ liệu với R. Nxb Tổng hợp TP HCM.
0 comments:
Post a Comment