1 Trích xuất dữ liệu từ một dataframe có sẵn

Trong một số trường hợp chúng ta có thể không sử dụng hết các biến số hoặc tất cả các quan sát trong 1 file dữ liệu, chúng ta có thể trích dữ liệu từ 1 dataframe có sẵn bằng những câu lệnh đơn giản, trong nội dung này chúng ta sử dụng bộ số liệu CPS1988.csv để làm ví dụ minh họa. Trước hết chúng ta sơ bộ file dữ liệu có tên CPS1988.csv bằng câu lệnh sau:

CPS1988 <- read.csv(“crab.csv”, header =TRUE): đọc file có tên CPS1988.csv trong thư mục D:/PhanmemR và đặt tên CPS1988

CPS1988:câu lệnh cho biết chi tiết các biến của đối tượng CPS1988.

library(AER)
## Warning: package 'AER' was built under R version 4.3.1
## Loading required package: car
## Warning: package 'car' was built under R version 4.3.1
## Loading required package: carData
## Warning: package 'carData' was built under R version 4.3.1
## Loading required package: lmtest
## Warning: package 'lmtest' was built under R version 4.3.1
## Loading required package: zoo
## Warning: package 'zoo' was built under R version 4.3.1
## 
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
## Loading required package: sandwich
## Warning: package 'sandwich' was built under R version 4.3.1
## Loading required package: survival
library(DT)
## Warning: package 'DT' was built under R version 4.3.1
data(CPS1988)
CPS1988

1.1 Trích xuất dữ liệu theo dòng (hàng)

Có thể trích xuất ra một dataframe con bằng cách chỉ định cụ thể quan sát nào muốn lấy theo vị trí của hàng. Câu lệnh như sau:

CPS1988<-read.csv(“crab.csv”, header =TRUE): đọc file có tên CPS1988.csv trong thư mục D:/PhanmemR và đặt tên CPS1988.

CPS1<-CPS1988[c(1, 3, 100),]:trích xuất các quan sát dòng 1, 3, 100 của đối tượng CPS1988 và đặt tên CPS1.

CPS2<-CPS1988[c(1: 3, 10, 100),]:trích xuất các quan sát dòng từ 1 đến dòng 3, dòng 10, dòng 100 của đối tượng CPS1988 và đặt tên CPS2.

Kết quả của hai câu lệnh trên:

CPS1 <- CPS1988[c(1,3,10),]
CPS1
CPS2 <- CPS1988[c(1,3,10,100),]
CPS2

1.2 Trích xuất dữ liệu theo cột

Trong một số trường hợp chúng ta chỉ quan tâm đến một số biến chứ không phải toàn bộ các biến. Để trích xuất dữ liệu theo cột ta thực hiện lệnh sau:

CPS1988<-read.csv(“crab.csv”, header =TRUE): đọc file có tên CPS1988.csv trong thư mục D:/PhanmemR và đặt tên CPS1988.

CPS3<-CPS1988[c(2:4)]:lấy cột từ2 đến cột 4 của đối tượng CPS1988 và đặt tên CPS3

head(CPS3):xem 6 quan sát đầu tiên của đối tượng CPS3.

CPS3 <- CPS1988[c(2:4)]
head(CPS3)

1.3 Trích xuất dữ liệu theo hàng và cột

Đểtrích xuất dữliệu theo hàng và cột ta thực hiện câu lệnh:

CPS1988<-read.csv(“crab.csv”, header =TRUE): câu lệnh đọc file có tên CPS1988.csv trong thư mụcD:/PhanmemR và đặt tên CPS1988.

CPS4 <-CPS1988[c(1, 3, 5, 7), c(2:4)]:câu lệnh trích xuất dữ liệu từ cột 2 đến cột 4, dòng 2 đến dòng 4 của đối tượng CPS1988 và đặt tên CPS4.

head(CPS4):câu lệnh xem 6 quan sát đầu tiên của CPS4.

CPS4 <- CPS1988[c(1,3,5,7),c(2:4)]
head(CPS4)

1.4 Trích xuất dữ liệu từmột dataframe có sẵn bằng lệnh subset

Trong nhiều tình huống, chúng ta cần trích xuất dữ liệu cho các quan sát theo một tiêu chí nào đó. Chẳng hạn, từ tập dữ liệu CPS1988.csv chúng ta muốn trích xuất tất cả các quan sát ứng với parttime = yes mà thôi với tên gọi CPS5 chẳng hạn, ta thực hiện câu lệnh sau:

CPS1988<-read.csv(“crab.csv”, header =TRUE): đọc file có tênCPS1988.csv trong thư mục D:/PhanmemR và đặt tên CPS1988.

CPS5 <-subset(CPS1988, parttime == “yes”):trích xuất các quan sát của biến parttime = yes trong đối tượng CPS1988 và đặt tên CPS5.

CPS5 <- subset(CPS1988, parttime =="yes")
dim(CPS5)
## [1] 2524    7
head(CPS5)

Kết quả câu lệnh cho thấy, có 2524 quan sát có làm bán thời gian được trích xuất.

Tương tự, chúng ta cũng có thể trích xuất dữ liệu theo một số tiêu chí nào đó.

Ví dụ, cũng từ dữ liệu CPS1988 ta trích xuất dữliệu cho các quan sát các tiêu chí mà: (1) ứng với parttime =yes, và (2) có education ≥ 3 với đặt tên CPS6, ta thực hiện câu lệnh sau:

CPS6 <-subset(CPS1988, parttime == “yes” & education == 5):trích xuất các quan sát của biến parttime = yes và các quan sát của biến education = 5 trong đối tượng CPS1988 với tên CPS6.

head(CPS6):câu lệnh xem 6 quan sát đầu tiên của CPS6.

CPS6 <-subset(CPS1988, parttime == "yes" & education == 5)
head(CPS6)

Hoặc chúng ta cũng có thể trích xuất dữ liệu cho các quan sát trong CPS1988 theo các tiêu chí (1) ứng với education <2 hoặc (2) experience >50 và đặt tên CPS7, ta thực hiện câu lệnh:

CPS7 <- subset(CPS1988, parttime == “yes” | experience > 50):câu lệnh trích xuất các quan sát của biến parttime = yes hoặc các quan sát của biến experience > 50 trong đối tượng CPS1988 và đặt tên CPS7.

head(CPS7):câu lệnh xem 6 quan sát đầu tiên của CPS7.

CPS7 <- subset(CPS1988, parttime == "yes" | experience > 50)
head(CPS7)

2 Mã hóa dữ liệu

Trong mục này chúng ta sử dụng dữliệu của file afterlife.xlsx trong thư mục D:/PhanmemR đểlàm ví dụminh họa.

Trước tiên chúng ta mô tả sơ bộ về file dữliệu afterlife.xlsx bằng câu lệnh sau:

af<-read.xlsx(“afterlife.xlsx”, sheetIndex =1, header =TRUE):đọc file afterlife.xlsx và đặt tên af.

af: câu lệnh cho biết chi tiết đối tượng af.

library(readxl)
af <- read_excel("C:/Users/ASUS/Downloads/afterlife.xlsx")
af

Dữ liệu file afterlife.xlsx có hai biến định tính.

Biến thứ nhất: Sex (giới tính) được mã hóa như sau: 1 là nam và 2 là nữ.

Biến thứ 2: Believe (niềm tin) của người được khảo sát “Sau khi chết có tồn tại một thế giới khác” được mã hóa như sau:

1: Tin là có, khẳng định chắc chắn.

2: Tin là có, nhưng, nhưng không chắc chắn.

3: Tin là không có, nhưng không chắc chắn.

4: Tin là không có, khẳng định chắc chắn.

  1. Dữ liệu bị khuyết.

  2. Không thể chọn.

  3. Không trảlời.

Trong dữ liệu này chúng ta chỉ giữ lại những quan sát mà biến Believe < 5, sau đó thay những quan sát có giá trị 1 và 2 của biến Believe thành giá trị 1 (những quan sát Tin là có), đồng thời những quan sát có giá trị 3 và 4 của biến Believe thành giá trị 0 (những quan sát Tin là không có).

Để thực hiện công việc trên ta thực hiện các lệnh sau:

afmahoa<-subset(af, Believe <5)
dim(afmahoa) 
## [1] 1260    2
afmahoa$Believe[afmahoa$Believe <=2] <-1
afmahoa$Believe[afmahoa$Believe >2] <-0
head(afmahoa)

Sau khi thực hiện các câu lệnh trên, kết quả cho thấy đối tượng afmahoa chỉ còn 1260 quan sát, biến Believe chỉ nhận một trong hai giá trị: 0, 1.

3 Bảng ngẫu nhiên

3.1 Bảng tần số và tần suất

Lập bảng tần sốvà tần suất cho biến Sex

Đểlập bảng tần sốvà tần suất cho biến Sex, ta thực hiện câu lệnh sau:

head(afmahoa)
table(afmahoa$Sex)
## 
##   1   2 
## 519 741
#lập bảng tần suất
table(afmahoa$Sex)/sum(table(afmahoa$Sex))
## 
##         1         2 
## 0.4119048 0.5880952

Bằng các câu lệnh tương tự chúng ta có thể lập bảng tần số và tần suất cho biến Believe và ta được kết quả.

table(afmahoa$Believe)
## 
##   0   1 
## 428 832
#lập bảng tần suất
table(afmahoa$Believe)/sum(table(afmahoa$Believe))
## 
##         0         1 
## 0.3396825 0.6603175

3.2 Bảng hai chiều

Để tạo bảng hai chiều chúng ta sử dụng câu lệnh sau:

table(afmahoa$Sex,afmahoa$Believe)
##    
##       0   1
##   1 188 331
##   2 240 501

4 Tính OddRatio

Để tính OddsRatio của hàng 1 và hàng 2 trong bảng hai chiều, ta thực hiện câu lệnh sau:

library(DescTools)
## Warning: package 'DescTools' was built under R version 4.3.1
## 
## Attaching package: 'DescTools'
## The following object is masked from 'package:car':
## 
##     Recode
v<-c(189, 104, 10845, 10933)
x <- matrix(v,2,2)
y <- c(189, 104)
OddsRatio(x, conf.level = 0.95, y =NULL, method = "wald")
## odds ratio     lwr.ci     upr.ci 
##   1.832054   1.440042   2.330780

Kết quả tỷ lệ chênh (OddsRatio) là 1,832054. Giá trị này cho chúng ta biết tỷ lệ người bị bệnh nhồi máu cơ tim đối với nhóm người dùng Placebo (giả dược) cao hơn 83,2% so với nhóm người sử dụng thuốc Aspirin.

5 Một số bài toán ước lượng

5.1 Ước lượng tỷ lệ một tổng thể

Chúng ta lấy dữliệu từ file có tên afterlife.xlsx để minh họa cho các câu lệnh trên.

Để ước lượng tỷ lệ những người tin rằng “Tồn tại một thế giới khác sau khi chết” ta làm như sau:

af1 <- af$Believe
af2 <- af1[af1<5]
k <- length(af2[af2<3])
n <- length(af2)
BinomCI(k,n,conf.level=0.95,method="wald")
##            est    lwr.ci    upr.ci
## [1,] 0.6603175 0.6341672 0.6864677

Ta được khoảng ước lượng tỷ lệ những người tin “Tồn tại thế gới khác sau khi chết” với độ tin cậy 95% là: 0.6341672≤𝑝≤0.6864677

5.2 Ước lượng sự khác biệt tỷ lệ hai tổng thể

Để thực hiện ước lượng sự khác biệt tỷ lệ hai tổng thể bằng R, ta thực hiện các câu lệnh sau:

af1 <- subset(af, Believe <5)
table(af1)
##    Believe
## Sex   1   2   3   4
##   1  79 252 118  70
##   2  79 422 160  80
n1<-table(af1$Sex)[1]
n2<-table(af1$Sex)[2]
k1<-table(af1$Sex,af1$Believe)[1,1]+table(af1$Sex,af1$Believe)[1,2]
k2<-table(af1$Sex,af1$Believe)[2,1]+table(af1$Sex,af1$Believe)[2,2]
BinomDiffCI(k2, n2, k1, n1, conf.level =0.95, method = "wald")
##           est.2      lwr.ci     upr.ci
## [1,] 0.03834843 -0.01499184 0.09168869

Kết quả khoảng ước lượng sự khác biệt tỷ lệ Nam và Nữ tin “Tồn tại thế gới khác sau khi chết” với độ tin cậy 95% là: −0,01499184 ≤ p1−p2 ≤ 0,09168869

6 Kiểm định tính độc lập

6.1 Kiểm định tính độc lập cho hai biến định danh

Đểthực hiện kiểm định tính độc lập cho hai biến định danh bằng R ta làm như sau.B1. Nhập dữliệu (bảng ngẫu nhiên) cho đềbài.B2. Thực hiện kiểm định tính độc lập 2biến định danh bởicâu lệnh: chisq.test( ).Chúng ta minh họa kiểm định trên thông qua ví dụsau:

ungho <- c(182,213,203) 
phandoi <- c(154,138,110) 
data1 <- as.data.frame(rbind(ungho, phandoi)) 
names(data1) <- c( "Thap", "Trung bình", "Cao")
data1 
chisq.test(data1)
## 
##  Pearson's Chi-squared test
## 
## data:  data1
## X-squared = 7.8782, df = 2, p-value = 0.01947

Từ bảng kết quảtrên, ta có p-value=0,01947<0,05: Bác bỏ H0

Kết luận, sự ủng hộ của người dân trong nước về một sắc thuế mới có phụ thuộc vào mức thu nhập của họ,với mức ý nghĩa 5%.

6.2 Kiểm định tính độc lập cho hai biến định tính có thang đo thứ bậc (CMH test)

Để thực hiện kiểm định tính độc lập cho biến định tính có thang đo thứ bậc ta thực hiện các bước sau:

cadem <- c(81,15,9) 
cangay <- c(118,28,10) 
data2 <- as.matrix(rbind(cadem, cangay))
data2 
##        [,1] [,2] [,3]
## cadem    81   15    9
## cangay  118   28   10

Ta cần kiểm định về tính độc lập của X (ca sản xuất) và Y (chất lượng sản phẩm), giảthuyết H0: X và Y độc lập nhau.

Đối với X, ta gán 0 cho ca đêm, 1 cho ca ngày.

Đối với Y ta sửdụng điểm midrank: Loại 3 được gán số 5,5; loại 2 được gán số 24,5;loại 1 được gán số 97,5.

Các bước kiểm định tính độc lập cho 𝑋và 𝑌được thực hiện như sau:

library(vcdExtra)
## Warning: package 'vcdExtra' was built under R version 4.3.1
## Loading required package: vcd
## Warning: package 'vcd' was built under R version 4.3.1
## Loading required package: grid
## Loading required package: gnm
## Warning: package 'gnm' was built under R version 4.3.1
## 
## Attaching package: 'vcdExtra'
## The following object is masked from 'package:carData':
## 
##     Burt
data <- as.matrix(rbind(cadem,cangay))
data
##        [,1] [,2] [,3]
## cadem    81   15    9
## cangay  118   28   10
CMHtest(data, rscores=c(0,1), cscore = c(97.5,24.5,5.5))
## Cochran-Mantel-Haenszel Statistics 
## 
##                  AltHypothesis    Chisq Df    Prob
## cor        Nonzero correlation 0.025707  1 0.87262
## rmeans  Row mean scores differ 0.025707  1 0.87262
## cmeans  Col mean scores differ 0.928770  2 0.62852
## general    General association 0.928770  2 0.62852

Từ bảng kết quả trên ta có p-value=0,87260>0,05: Chấp nhận H0

Kết luận, chất lượng sản phẩm không phụ thuộc vào ca sản xuất, với mức ý nghĩa 5%.