Upload
lephung5
View
286
Download
8
Embed Size (px)
Citation preview
GIỚI THIỆU VỀ R
Lê Tấn Phùng
1 Mở đầu
R là phần mềm thống kê đang ngày càng phổ biến trên thế giới, có mã nguồn mở và hoàn
toàn miễn phí.
R là phần mềm thống kê rất mạnh, nhiều ưu điểm, được chấp nhận như một công cụ thống kê
chính thức bởi nhiều tạp chí khoa học uy tín trên thế giới.
R có thể download miễn phí từ website chính thức:
http://www.r-project.org/
Tài liệu này nhằm cung cấp cho độc giả những kiến thức và thao tác cơ bản để sử dụng R
trong công việc phân tích thống kê thông thường. Đối tượng của tài liệu này là những người
đã có kiến thức thống kê cơ bản, hiểu và đã thực hiện các thống kê mô tả, thống kê phân tích
thông thường như kiểm định t (t student test), ANOVA, Chi bình phương, phân tích hồi quy
đơn biến và đa biến. Chính vì vậy, các kiến thức về thống kê sẽ không được nhắc lại. Phần
phân tích thống kê phi tham số sẽ được trình bày ở một tài liệu khác.
Tài liệu này hy vọng được xem như nguồn cung cấp nền tảng cơ bản, giúp độc giả bước đầu
làm quen với R, để có thể tham khảo sâu hơn các tài liệu về R mà hiện nay đang có rất nhiều
trên mạng internet.
2 Một số khái niệm và đặc tính cơ bản của R
2.1 Các đặc tính cơ bản của R
- Giao diện của R: Giao diện R tương đối đơn giản, chỉ gồm 1 cửa sổ lệnh (Hình 1). Hệ
thống menu giúp thực hiện một số công việc sẽ được trình bày ở các phần sau, nhưng
hầu như toàn bộ các phân tích thống kê đều thực hiện qua cửa sổ lệnh này.
Hình 1: Giao diện của R
- Thông thường, các phần mềm thống kê hay dùng như SPSS, EpiInfo, Stata… trực tiếp
tương tác với bộ số liệu (data) để thực hiện các yêu cầu thống kê, tính toán. Ví dụ, để
thực hiện so sánh 2 số trung bình bằng SPSS, việc trước hết là phải mở bộ số liệu. Sau
đó sẽ dùng Các lệnh qua menu hoặc syntax để tác động lên các biến số liên quan. Tuy
nhiên, R làm việc không hoàn toàn theo cách thông thường này, mà làm việc thông
qua các đối tượng, gọi là object, chứ không làm việc trực tiếp trên bộ số liệu.
- Khi R làm việc thì các biến số (variable), bộ số liệu (data), kết quả, các hàm số
(function) v.v… đều được lưu trong trong bộ nhớ dưới dạng các đối tượng (sau đây
gọi là object). Mỗi object có tên riêng biệt. Người dùng tác động lên các object này
bằng các hàm số (function) hoặc các toán tử (như phép tính số học, các toán tử luận
lỳ, các phép so sánh…).
- Một hàm số trong R bao gồm tên hàm và phải luôn luôn đi kèm với 2 dấu ngoặc đơn
mở và đóng, mặc dù có khi không cần có gì bên trong 2 dấu ngoặc đơn này. Ví dụ
ls(). Những gì chứa bên trong 2 dấu ngoặc đơn gọi là arguments của hàm đó (có thể
tạm dịch là đối số của hàm đó). Đối số của hàm có thể là một object (bộ số liệu, công
thức…) hoặc toán tử.
- Toán tử bao gồm:
Toán tử số học: Ví dụ như cộng (+), trừ ( - ), nhân (*), chia (/), bình phương
(^), căn bậc 2 (sqrt) v.v…
Toán tử luận lý như và (&), hoặc (|), không bằng (!) v.v…
Toán tử so sánh như bằng (==) , lớn hơn (>), nhỏ hơn (<), lớn hơn hoặc bằng
(≥), nhỏ hơn hoặc bằng (≤) v.v…
- R làm việc dựa trên cấu trúc lệnh được gõ trực tiếp. Các lệnh dùng menu trong R còn
hạn chế.
- Trong quá trình thao tác, để thực hiện các lệnh đã sử dụng trước đó, hoặc dùng các
lệnh trước đó để chỉnh sửa thành một lệnh mới thì có thể sử dụng phím mũi tên để gọi
lại các lệnh vừa thực hiện. Điều này làm cho người dùng tiết kiệm thời gian và công
sức vì không cần phải gõ lại toàn bộ lệnh cũ.
- Có thể dùng dấu chấm phẩy để phân biệt 2 hoặc nhiều lệnh khác nhau mà không cần
phải xuống hàng. Ví dụ, ta muốn thực hiện 3 phép tính: 2+3, 4*7, và 10/5, ta thực
hiện 3 phép tính trên cũng một dòng lệnh của R mà không cần xuống hàng như sau:
> 2+3;4*7;10/5
[1] 5
[1] 28
[1] 2
- Khi viết một lệnh quá dài, cần phải xuống hàng để dễ theo dõi thì ta sử dụng phím
Enter để xuống hàng. Lúc này, sẽ không có dấu nhắc > như thường lệ mà thay vào đó
R tự dộng thêm dấu + trước dòng mới, cho phép tiếp tục viết lệnh. Lưu ý thao tác này
chỉ thực hiện được khi câu lệnh ở dòng trên vẫn chưa chưa được hoàn thành.
- Trong quá trình làm việc, khi cần biết thông tin gì, người dùng có thể tìm trực tiếp
trên R bằng cách gõ lệnh > help(), trong đó, nội dung trong dấu ngoặc đơn là nội
dung cần tìm hiểu. Ví dụ, để tìm hiểu hàm data.frame, ta gõ >help(data.frame).
Cũng có thể gõ dấu chấm hỏi (?) ngay phía trước nội dung cần muốn biết, ví dụ:
?data.frame.
- Khác với các phần mềm thống kê khác khi mọi lệnh, hàm đều có sẵn trong chương
trình. Ngoài những lệnh và hàm cơ bản tích hợp sẵn trong R, một số hàm của R được
chứa trong những gói (package) khác nhau và cần phải download về khi cần sử dụng.
Ví dụ, hàm describe được chứa trong package “psych”, không có sẵn khi cài đặt R.
Do đó, để sử dụng hàm này, trước hết phải cài đặt package “psych” vào R, sau đó
dùng hàm library() để gọi package psych. Lúc này mới sử dụng được hàm
describe.
- Để cài đặt một package, có thể sử dụng lệnh hoặc menu.
> install.packages(psych)
Hoặc từ menu (Hình 2): Chọn packages\install package(s)
Hình 2: Cài đặt package từ menu lệnh
- Như trên đã nói, khi sử dụng hàm không có sẵn trực tiếp trong R (nhưng đã được cài
đặt package chứa hàm đó), đầu tiên phải dùng hàm library(), sau đó mới có thể
sử dụng các hàm có trong package được. Ví dụ, hàm read.spss nằm trong package
“foreign”, do đó để thực hiện hàm này, thao tác như sau:
> library(foreign)
> read.spss(“patient18.sav”, to.data.frame=TRUE)
2.2 Cách tạo, liệt kê, và xóa object
Tạo một object: Để tạo một object trong bộ nhớ của máy tính, người ta dùng ký hiệu “gán”
(<-). Ký hiệu này thường được viết từ trái sang phải (<-), nhưng viết ngược lại cũng được
chấp nhận. Hai ví dụ dưới đây là tương đương trong việc tạo ra một object tên là “exam”:
> exam<- a+15
> a+15 -> exam.
Nếu object đã được tạo ra trước đó (nhưng vẫn còn hiện diện trong bộ nhớ), thì thao tác trên
object này sẽ làm xóa đi giá trị trước đó của nó.
Liệt kê objects: Để liệt kê các objects hiện đang có trong bộ nhớ, sử dụng hàm ls(). Ví dụ ta
tạo ra 3 objects, sau đó muốn liệt kê các object này thì thao tác trên R như sau:
> patient<-12/2
> staff<-6+8
> hospital<-"khanh hoa"
> ls()
[1] "hospital" "patient" "staff"
3 dòng lệnh đầu tiên để tạo ra 3 objects có tên là patient, staff, và hospital. Dòng lệnh cuối
cùng là để liệt kê các objects hiện có trong bộ nhớ.
Có thể dùng tùy chọn pat (viết tắt của pattern) để giới hạn sự liệt kê. Ví dụ khi chỉ cần liệt kê
những object có chữ “i” trong ví dụ trên thì thực hiện như sau:
> ls(pat="i")
[1] "hospital" "patient"
Có thể dùng hàm ls.str() để hiển thị đặc tính của objects (dạng số hay dạng chuỗi
v.v…). Ví dụ:
> ls.str()
hospital : chr "khanh hoa"
patient : num 6
staff : num 14
Xóa object: Dùng hàm rm(). Ví dụ, để xóa object tên là “hospital” trong ví dụ trên, thao tác
như sau:
> rm("hospital")
> ls()
[1] "patient" "staff"
Kết quả trên cho thấy sau khi xóa object “hospital” xong, sử dụng hàm ls() thì thấy chỉ còn 2
objects là “paient” và “staff”.
2.3 Thư mục làm việc
Cần phải xác định thư mục làm việc cho R. Các phần mềm khác, sau khi thực hiện xong cần
lưu trữ thì phần mềm sẽ hỏi lưu trữ ở đâu. Tuy nhiên, với R, cần phải xác định thư mục làm
việc trước.
Để biết hiện nay R đang làm việc ở thư mục nào, gõ getwd()
Để chọn thư mục làm việc, sử dụng hàm setwd(). Ví dụ muốn chọn thư mục làm việc là là
R thuộc thư mục phung\statistics nằm trên đĩa D, ta gõ:
setwd(“D:/phung/Statsitics/R”).
Lưu ý sử dụng / chứ không phải \ như window vẫn hay dùng.
Cách nhanh hơn để chọn thư mục làm việc được thực hiện trên menu như sau: File\change
dir…, và chọn thư mục cần lầm việc tại cửa sổ hiện lên (Hình 3).
Hình 3: Chọn thư mục làm việc
Đặt mặc định thư mục làm việc: Vào biểu tượng R trên màn hình, click chuột phải, chọn
properties, chọn tab “shortcut”, và thay đổi thư mục tại mục “start in”.
2.4 Các lưu ý về cấu trúc lệnh
R làm việc dựa trên viết lệnh trực tiếp từ dấu nhắc của R (mặc định dấu nhắc của R là >).
Cấu trúc lệnh như sau:
> Lệnh <- hàm()
Dấu <- tương đương với dấu = của một phương trình. Ví dụ, ta gán y=log(x) thì trong R sẽ
được viết là:
> y<-log(x)
2.5 Một số ký hiệu được sử dụng trong R
== Bằng
>= Lớn hơn hoặc bằng
<= Nhỏ hơn hoặc bằng
!= Khác, không bằng
> Lớn hơn
< Nhỏ hơn
a&b a và b
a|b a hoặc b
! Không là, khác
is.na(x) Có phải x là biến số bị bỏ trống (missing)
# Những cấu trúc sau dấu này sẽ không có tác dụng trong R, do đó được sử dụng để ghi
chú những công việc thực hiện trong R, cũng giống như dấu * sử dụng trong Stata hoặc
SPSS. Ví dụ, để thực hiện lệnh tìm hàm logarit của x, ta gõ như sau:
# Dat y la ham logarit cua x
>y <-log(x)
2.6 Một số lưu ý khi đặt tên trong R
- R phân biệt chữ hoa và chữ thường. Do đó, “sample” sẽ khác với “Sample” trong R.
- Không dùng khoàng trắng
- Không dùng gạch dưới _
- Có thể sử dụng dấu chấm (.) để đặt tên. Ví dụ: mysample hoặc my.sample
3 Các hàm cơ bản
3.1 Tạo bộ số liệu
Hàm data.frame()
Đây là hàm dùng để tập hợp các biến với nhau thành một bộ số liệu hoàn chỉnh. Ví dụ, ta
muốn xây dựng bộ số liệu gồm có 4 biến số khác nhau nhưng chưa được ghép lại thành một
bộ số liệu hoàn chỉnh, bao gồm: mã đối tượng (id), tuổi (age), giới (gender), và huyết áp tâm
thu (sbp). Ta muốn ghép 4 biến này vào một bộ số liệu mang tên là “hypertension”. Trình tự
như sau:
Nhập số liệu cho một biến: Sử dụng hàm c(). Đây là hàm để nhập trực tiếp số liệu. Chữ c là
viết tắt của chữ concatenation, tức là “móc nối vào với nhau”. Với ví dụ trên, ta tạo số liệu
cho 4 biến trên như sau:
> id <- c(1,2,3,4,5,6,7,8,9)
> age <- c(23,45,54,36,55,43,44,37,41)
> gender <- c(1,0,1,1,1,0,1,0,0)
> sbp <- c(120,125,145,130,154,178,155,180,110)
Sau đó, sử dụng hàm data.frame() như sau để tạo bộ số liệu:
>hypertension<-data.frame(id,age,gender,sbp)
3.2 Lưu bộ số liệu dưới dạng tập tin của R
Hàm save(object, file=”tên file.rda”)
Ví dụ, ta đã tạo được đối tượng là hypertension như ở trên, ta muốn lưu thành tên tập tin
“dieutra” thì thực hiện như sau:
>save(hypertension,file=”dieutra.rda”)
3.3 Chỉnh sửa bộ số liệu
Hàm edit(data.frame())
Hàm này dùng để chỉnh sửa số liệu đã có hoặc nhập trực tiếp; tương tự như bảng tính Excel
hoặc SPSS. Ví dụ, để chỉnh sửa số liệu của tập tin điều tra, ta thực hiện như sau:
> edit(data.frame(hypertension))
Lưu ý là dùng tên đối tượng (hypertension) chứ không phải dùng tên tập tin (dieutra).
3.4 Liệt kê các biến của một đối tượng
Hàm names()
Hàm names() dùng để liệt kê tên các biến của đối tượng. Vì dụ:
> names(benhnhan)
[1] "patientid" "hospital" "v1" "v2" "v3"
[6] "v4" "v5" "v6" "v7" "v8"
[11] "v9" "v10" "v11" "v12" "v13"
[16] "v14" "v15" "v16" "v17" "v18"
[21] "v19" "v20" "v21" "v22" "v23"
[26] "v24" "v25" "v26" "satisfied" "gender"
[31] "ethnicity" "age" "religion" "marital" "occupation"
[36] "address1" "address2" "address3" "distance" "insurance"
[41] "fillout" "patient" "income" "depart" "date"
Ví dụ trên yêu cầu R liệt kê các biến số của đối tượng “benhnhan”, và các biến số được liệt
kê với tên trong ngoặc kép và bao gồm 45 biến.
Để liệt kê toàn bộ số liệu trong một object, chỉ cần gõ tên object là đủ, ví dụ:
> benhnhan
patientid hospital v1r v2 v3 v4 v5 v6 v7 v8r v9 v10 v11 v12r v13 v14 v15r
1 1 vn 4 4 4 4 1 5 5 4 5 5 5 5 5 5 4
2 3 vn 4 4 4 4 1 5 5 4 5 5 5 5 5 5 5
3 4 vn 4 4 4 4 1 5 5 4 5 5 5 5 5 5 5
4 5 vn 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
5 6 vn 2 4 5 4 4 4 4 2 2 4 4 4 4 4 3
6 7 vn 3 3 4 5 3 3 5 1 4 5 4 3 4 4 1
……
Khi cần liệt kê thông tin theo số cột, số hàng nhất định, có thể sử dụng dấu ngoặc vuông sau
tên object để chỉ định sự giới hạn này.
Ví dụ, chỉ liệt kê số liệu của hàng thứ 2 (quan sát thứ 2) và cột thứ 7 (biến thứ 7) của object
“benhnhan”, gõ benhnhan[2,7] (Hàng trước, cột sau)
benhnhan[1:10,]: Hiển thị số liệu của các quan sát từ 1 đến 10 với tất cả các biến số
benhnhan[4:8,1:5]: Hiển thị số liệu của các quan sát từ 4 đến 8 đối với cá biến số từ 1 đến
5 (các biến số khác không cần hiển thị).
3.5 Tạo bộ số liệu con
Hàm subset()
Hàm này được dùng để tạo ra một bộ số liệu con từ bộ số liệu có sẵn theo một số điều kiện
nhất định. Ví dụ, muốn tại bộ số liệu benhnhan.gia là những bệnh nhân tuổi từ 60 trở lên, ở
tại Nha Trang, sử dụng cú pháp như sau:
> benhnhan.gia<-subset(benhnhan,age>59,address== “nt”)
4 Nhập số liệu
4.1 Nhập số liệu từ file excel
Trước hết cần lưu file excel dưới một file dạng csv bằng cách dùng lệnh “Save as…” từ
Excel. Sau đó trong R dùng hàm read.csv(“tên file”,header=TRUE).
Ví dụ ta có 1 file Excel tên là patient.xls và muốn chuyển đổi file này thành file mà R có thể
đọc được. Trước hết, mở file patient.xls từ Excel. Sau đó, chọn trong menu: File\Save as…,
chọn csv (comma deliminated). Đối với Excel 2007, chọn Save as… rồi chọn Other format,
rồi chọn csv (comma deliminated). File đã được chuyển thành csv phải được lưu trữ trong thư
mục làm việc của R.
Sau khi đã biến đổi thành dạng csv, ta dùng lệnh sau đây để chuyển file patient.csv thành file
patient.rda như sau:
> benhnhan<-read.csv(“patient.csv”,header=TRUE)
> save(benhnhan, file=”patient.rda”)
Lệnh đầu tiên yêu cầu R đọc file csv với dòng đầu tiên của file csv là tên cột (biến), lưu vào
object tên là “benhnhan”.
Lệnh thứ hai lưu object benhnhan thành file R có tên patient.rda
4.2 Nhập số liệu từ file SPSS
Dùng hàm read.spss(“tên file”, to.data.frame=TRUE).
Hàm này có trong package foreign. Do đó, cần phải gọi package này trước khi dùng hàm
read.spss.
Ví dụ, muốn chuyển số liệu từ file SPSS có tên là staff.sav, ta thao tác như sau:
>library(foreign)
> nhanvien<-read.spss(“staff.sav”,to.data.frame=TRUE)
>save(nhanvien,file=”staff.rda”)
Lệnh đầu tiên là để “gọi” hàm read.spss từ thư viện foreign, vì hàm read.spss không
có trong các hàm cơ bản trực tiếp của R.
4.3 Nhập số liệu từ file Stata
Sử dụng hàm read.dta(“tên file”) từ package foreign.
4.4 Nhập số liệu từ text file
Sử dụng hàm read.table(“tên file”, header=TRUE,sep=”,”)
Trong đó, sep= “,” hàm ý rằng các cột (các biến) được cách nhau bởi dấy phẩy. Nếu các
cột cách nhau bằng khoảng trắng thì sử dụng sep=” “ (Có 1 khoảng trắng ở giữa 2 dấu
ngoặc kép).
4.5 Lưu số liệu
Có 2 hàm quan trọng:
Write.table(x, file=” “)
Save(x,y,z,file=” “)
Còn có các tùy chọn khác, nhưng chỉ cần hiểu và thực hành với các tùy chọn trên. Trong đó,
x là tên đối tượng, tên file đặt nằm giữa 2 dấu ngoặc kép.
5 Các phân tích thống kê
Như trên đã nói, R làm việc trực tiếp trên object. Do đó, khi sử dụng bộ số liệu từ Stata hoặc
SPSS hoặc từ Excel, txt, ta phải tạo object bằng hàm read, sau đó sẽ gắn object vào R để có
thể bắt đầu phân tích.
Ví dụ, ta muốn phân tích bộ số liệu từ tập tin patient.sav. Trước tiên phải tạo object, ví dụ tạo
object mang tên “benhnhan”:
> benhnhan <- read.spss(“patient.sav”,to.data.frame=TRUE)
Sau đó, gắn object benhnhan vào R để có thể bắt đầu phân tích:
> attach(benhnhan)
5.1 Thống kê mô tả
5.1.1 Thông tin bộ số liệu hoặc biến số
Có 3 hàm cơ bản: summary(x), describe(x), và str(x).
Hàm summary(x)
Trong đó x là object hoặc biến số. Hàm này sẽ giúp liệt kê từng biến với các thông tin về giá
trị nhỏ nhất, giá trị lớn nhất, trung bình, median, 1st quarter, 3
rd quarter (đối với biến dạng số)
hoặc thống kê mô tả đối với biến dạng phân loại.
Summary() cũng có thể dùng để thống kê theo biến.
Ví dụ:
Thống kê tuổi (age) của bệnh nhân, R cho kết quả giá trị tuổi tối thiểu (Min), bách phân vị
thứ nhất (1st Qu.), Median, trung bình (Mean), bách phân vị thứ 3 (3
rd Qu.), giá trị tối đa, và
số liệu trống (Na’s), như sau:
> summary(age)
Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
19.00 31.00 42.00 46.21 57.50 91.00 5.00
Thống kê số bệnh nhân theo biến địa chỉ huyện (address3), R cho kết quả là Cam Ranh (cr)
có 139 bệnh nhân, Vạn ninh (vn) có 141 bệnh nhân.
> summary(address3)
cr vn
139 141
Khi cần thống kê mô tả cho một biến số của một object trong khi nhiều object đã được gắn
với R thì khi sử dụng hàm summary cần phải cho R biết rõ object nào. Ví dụ, muốn summary
biến số “age” của object “benhnhan”, sử dụng lệnh như sau:
> summary(benhnhan["age"])
age
Min. :19.00
1st Qu.:31.00
Median :42.00
Mean :46.21
3rd Qu.:57.50
Max. :91.00
NA's : 5.00
Lưu ý, trong trường hợp này, tên biến phải đặt trong ngoặc kép.
Hàm describe(x)
Đây là hàm nằm trong package “psych”. Do đó, muốn sử dụng hàm describe() cần phải
cài đặt package “psych” vào R, và phải gọi package psych trước khi thi hành hàm describe.
Ví dụ:
> library(psych)
> describe(benhnhan)
var n mean sd median trimmed
patientid 1 280 1.465100e+02 83.48 1.460000e+02 1.467400e+02
hospital* 2 280 1.500000e+00 0.50 2.000000e+00 1.500000e+00
v1r 3 280 3.360000e+00 0.96 3.000000e+00 3.340000e+00
v2 4 278 3.510000e+00 0.83 4.000000e+00 3.560000e+00
v3 5 278 3.710000e+00 0.83 4.000000e+00 3.750000e+00
v4 6 279 3.730000e+00 0.79 4.000000e+00 3.770000e+00
v5 7 276 3.190000e+00 1.08 3.000000e+00 3.200000e+00
Hàm này sẽ cho biết các thông số: số thứ tự biến (var), tổng số quan sát (n) trừ những giá trị
bị bỏ trống, trung bình (mean), độ lệch chuẩn (sd), trung vị (median), trimed, giá trị tối thiểu
(min), giá trị tối đa (max), khoảng (range), skew, và kurtosis.
Hàm str(x)
Hàm này cũng tương tự như describe() hoặc summary(), nhưng cho thông tin chi tiết
hơn, bao gồm bao nhiêu quan sát, bao nhiêu biến, rồi liệt kê đặc tính của từng biến. Hàm này
tương đương như lệnh describe của Stata. Ví dụ:
> str(benhnhan)
'data.frame': 280 obs. of 55 variables:
$ patientid : num 1 3 4 5 6 7 8 9 10 11 ...
$ hospital : Factor w/ 2 levels "cr","vn": 2 2 2 2 2 2 2 2 2 2 ...
$ v1r : num 4 4 4 4 2 3 2 3 4 3 ...
$ v2 : num 4 4 4 4 4 3 5 3 4 2 ...
$ v3 : num 4 4 4 4 5 4 3 5 4 3 ...
$ v4 : num 4 4 4 4 4 5 4 4 4 4 ...
$ v5 : num 1 1 1 4 4 3 3 2 5 2 ...
$ v6 : num 5 5 5 4 4 3 5 4 4 1 ...
$ v7 : num 5 5 5 4 4 5 4 5 4 3 ...
$ v8r : num 4 4 4 4 2 1 2 3 3 4 ...
$ v9 : num 5 5 5 4 2 4 3 3 4 2 ...
5.1.2 Tính giá trị trung bình
Hàm mean(x,na.rm=TRUE)
Trong đó x là tên biến hoặc object, na.rm=TRUE khi loại bỏ giá trị missing trong tính giá trị
trung bình, FALSE khi không loại bỏ giá trị missing. R sẽ cho ra giá trị là missing (NA) khi
có bất kỳ trị nào bị missing.
5.1.3 Tính độ lệch chuẩn
Hàm sd(x,na.rm=TRUE)
5.1.4 Tính phương sai
Hàm var(x,na.rm=TRUE)
5.1.5 Tính median
Hàm median(x,na.rm=TRUE)
5.1.6 Thống kê theo nhóm
Dùng lệnh by để phân tích. Ví dụ, muốn tính trung bình tuổi theo giới của object benhnhan,
dùng lệnh by như sau:
> by(age,gender,mean,na.rm=TRUE)
gender: 1
[1] 48.66
------------------------------------------------------------
gender: 2
[1] 43.32065
5.1.7 Thống kê biến phân loại thành bảng
Sử dụng hàm table(x,y), trong đó x, y là 2 biến phân loại. x sẽ được cho kết quả theo
hàng, và y sẽ được cho kết quả theo cột. Hàm này sẽ cho giá trị tuyệt đối nhưng không cho
giá trị phần trăm kèm theo. Muốn có giá trị phần trăm thì sử dụng hàm
prop.table(x,1), trong đó x là object và 1 nếu tính phần trăm theo hàng hoặc 2 nếu tính
phần trăm theo cột.
Ví dụ tính số dân tộc (tên biến là ethnicity) theo bệnh viện (tên biến là hospital, bao gồm 2
bệnh viện: Cam Ranh (cr) và Vạn Ninh (vn):
> table(hospital, ethnicity)
ethnicity
hospital Kinh Raglai Other
cr 137 1 1
vn 141 0 0
> prop.table(table(hospital, ethnicity),1)
ethnicity
hospital Kinh Raglai Other
cr 0.985611511 0.007194245 0.007194245
vn 1.000000000 0.000000000 0.000000000
> prop.table(table(hospital, ethnicity),2)
ethnicity
hospital Kinh Raglai Other
cr 0.4928058 1.0000000 1.0000000
vn 0.5071942 0.0000000 0.0000000
5.2 Các thống kê phân tích thông dụng
5.2.1 So sánh trung bình sử dụng kiểm định t
R dùng hàm t.test() để thực hiện kiểm định này. Tùy theo loại biến số cần so sánh, ta
phân biệt các loại t test như sau:
So sánh trung bình 2 nhóm độc lập: t.test(y~x), trong đó y là biến liên tục và x là biến
nhị phân.
So sánh trung bình 2 nhóm độc lập: t.test(y1,y2), trong đó y1, y2 là 2 biến số liên tục.
So sánh trung bình ghép cặp: t.test(y1,y2,paired=TRUE), trong đó y1 và y2 là 2
biến số liên tục (phải có số quan sát bằng nhau).
So sánh trung bình một mẫu (so sánh với một số trung bình khác): t.test(y,mu=3),
trong đó y là biến liên tục, mu=3 là so sánh với số trung bình có sẵn, trong ví dụ này số trung
bình này bằng 3.
Các ví dụ:
So sánh trung bình 2 nhóm độc lập với nhóm là biến nhị phân: Ví dụ so sánh tuổi trung bình
(age) giữa 2 giới tính (gender):
> t.test(age~gender)
Welch Two Sample t-test
data: age by gender
t = 2.4963, df = 180.509, p-value = 0.01344
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
1.274746 10.890990
sample estimates:
mean in group Male mean in group Female
50.16667 44.08380
So sánh trung bình của 2 biến v1 và biến v2 (cả 2 biến đều là biến liên tục)
> t.test(v1,v2)
Welch Two Sample t-test
data: v1 and v2
t = -11.8247, df = 564.435, p-value < 2.2e-16
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
-1.033137 -0.738803
sample estimates:
mean of x mean of y
2.636678 3.522648
So sánh trung bình của 2 nhóm ghép cặp: 2 nhóm này gồm biến y1 và biến y2, được tạo ra
trực tiếp trên R bằng hàm c(). Sau đó so sánh trung bình.
> y1<-c(5.1,6.3,7.8,6.9,9.11)
> y2<-c(4.7,5.3,4.6,6.1,8.5)
> t.test(y1,y2,paired=TRUE)
Paired t-test
data: y1 and y2
t = 2.36, df = 4, p-value = 0.07766
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
-0.2120912 2.6160912
sample estimates:
mean of the differences
1.202
So sánh trung bình của một mẫu: So sánh tuổi trung bình (age) của một mẫu so với tuổi trung
bình là 46:
> t.test(age,mu=46)
One Sample t-test
data: age
t = 0.1813, df = 274, p-value = 0.8563
alternative hypothesis: true mean is not equal to 46
95 percent confidence interval:
43.95682 48.45773
sample estimates:
mean of x
46.20727
So sánh tuổi trung bình (age) theo giới, với giả định phương sai không bằng nhau
(var.equal=FALSE):
> t.test(age~gender,var.equal=FALSE)
Welch Two Sample t-test
data: age by gender
t = 2.4963, df = 180.509, p-value = 0.01344
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
1.274746 10.890990
sample estimates:
mean in group Male mean in group Female
50.16667 44.08380
5.2.2 So sánh trung bình của trên 2 nhóm (oneway ANOVA)
Hàm anova() sẽ cho kết quả phân tích ANOVA. Ví dụ, để tìm hiểu sự khác nhau giữa tuổi
trung bình (age) giữa các nhóm nghề nghiệp (occupation) với nhau, thực hiện trên R như sau:
> anova(lm(age~occupation))
Analysis of Variance Table
Response: age
Df Sum Sq Mean Sq F value Pr(>F)
occupation 6 25412 4235.4 15.666 2.18e-15 ***
Residuals 265 71644 270.4
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Phân tích từng nhóm sau phân tích ANOVA (post estimation) thì sử dụng hàm
pairwise.t.test(). Theo ví dụ trên, muốn phân tích sự khác nhau giữa các nhóm nghề
nghiệp thực sự nằm giữa các cặp nhóm nào, sử dụng phương pháp Boferroni, ta thao tác như
sau:
> pairwise.t.test(age,occupation,p.adj="bonferroni")
Pairwise comparisons using t tests with pooled SD
data: age and occupation
Unemployed Farmer Fisher Worker Teacher Officer
Farmer 1.0000 - - - - -
Fisher 1.0000 1.0000 - - - -
Worker 0.2861 0.0266 0.0271 - - -
Teacher 1.0000 0.6814 0.3917 1.0000 - -
Officer 1.0000 1.0000 1.0000 0.4079 1.0000 -
Other 1.9e-06 2.9e-08 0.0064 4.0e-12 3.1e-08 0.0005
P value adjustment method: bonferroni
Kết quả trên cho thấy sự khác nhau thực sự nằm ở nhóm worker với farmer (p values bằng
0.0266 và 0.0271), và nhóm Other với các nhóm khác.
5.2.3 Hồi quy tuyến tính
Hàm lm() (linear regression)được sử dụng trong phân tích hồi quy tuyến với R.
Hồi quy tuyến tính đơn
Hàm lm(y~x)
Trong đó: y là biến phụ thuộc và x là biến độc lập.
Ví dụ, để phân tích hồi quy tuyến tính cho biến số sự hài lòng (satisfied) với tuổi (age), thực
hiện trong R như sau:
> lm(satisfied~age)
Call:
lm(formula = satisfied ~ age)
Coefficients:
(Intercept) age
3.203180 0.006801
Kết quả trên cho ta biết 2 hệ số cơ bản: intercept (a) và beta (b) trong phương trình tuyến tính
y = a +bx
Tuy nhiên, để R cho biết nhiều thông số hơn thì ta làm 2 bước: đầu tiên tạo 1 object cho hàm
tuyến tính. Sau đó sử dụng hàm summary để biết chi tiết các thông số của hàm tuyến tính
này. Trong ví dụ trên, đầu tiên ta tạo 1 object, ví dụ đặt tên là reg là hàm tuyến tính của
satisfied và age, sau đó sử dụng hàm summary:
> reg<-lm(satisfied~age)
> summary(reg)
Call:
lm(formula = satisfied ~ age)
Residuals:
Min 1Q Median 3Q Max
-2.4752 -0.5024 -0.3392 0.5384 1.6404
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 3.203180 0.122283 26.195 < 2e-16 ***
age 0.006801 0.002451 2.775 0.00593 **
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.7479 on 259 degrees of freedom
(19 observations deleted due to missingness)
Multiple R-squared: 0.02887, Adjusted R-squared: 0.02512
F-statistic: 7.7 on 1 and 259 DF, p-value: 0.005925
Ta thấy theo cách này, R đã cho ta biết 3 nội dung quan trọng:
Phần dư (residuals) với các thông tin về số tối thiểu, tối đa, median, và phân vị 1 và 3;
Các hệ số trong phương trình hồi quy với các thông tin về ước lượng (estimate), sai số chuẩn
(std. error), t value và p values.
R2
và Adjusted R2, cùng với F test và p value của test này.
Hồi quy tuyến tính đa biến:
Hàm lm(y~x1+x2+x3+…+xn)
Trong đó: y là biến phụ thuộc, x1, x2,x3,…, xn là biến độc lập.
Ví dụ, phân tích hồi quy tuyến tính đa biến giữa biến số phụ thuộc là điểm số hài lòng
(satisfied) và các biến v1, v2, v3:
> reg3<-lm(satisfied~v1+v2+v3)
> summary(reg3)
Call:
lm(formula = satisfied ~ v1 + v2 + v3)
Residuals:
Min 1Q Median 3Q Max
-3.04867 -0.46194 0.00303 0.41630 1.61933
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 1.64259 0.30025 5.471 1.06e-07 ***
v1 0.08126 0.04717 1.723 0.08612 .
v2 0.28430 0.05543 5.129 5.74e-07 ***
v3 0.18067 0.05599 3.227 0.00141 **
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.7101 on 257 degrees of freedom
(19 observations deleted due to missingness)
Multiple R-squared: 0.1532, Adjusted R-squared: 0.1434
F-statistic: 15.5 on 3 and 257 DF, p-value: 2.672e-09
Phân tích hồi quy tuyến tính đa biến trong đó một số biến độc lập là biến dạng phân loại:
Sử dụng hàm factor cho các biến phân loại để tạo thành các dummy variable (còn gọi là
indicator variable). Ví dụ có 2 biến phân loại là marital và occupation thì cú pháp như sau:
> reg<-lm(satisfied~age+factor(marital)+factor(occupation))
> summary(reg)
Call:
lm(formula = satisfied ~ age + factor(marital) + factor(occupation))
Residuals:
Min 1Q Median 3Q Max
-2.39750 -0.51410 -0.07205 0.51995 1.72556
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 2.999844 0.207146 14.482 < 2e-16 ***
age 0.010035 0.003112 3.225 0.00143 **
factor(marital)Married 0.073316 0.168362 0.435 0.66361
factor(marital)Divorced -0.596047 0.408798 -1.458 0.14610
factor(marital)Windowed -0.421777 0.239611 -1.760 0.07960 .
factor(occupation)Farmer 0.021495 0.162386 0.132 0.89480
factor(occupation)Fisher 0.003336 0.206392 0.016 0.98712
factor(occupation)Worker -0.029534 0.202621 -0.146 0.88423
factor(occupation)Teacher 0.186299 0.215169 0.866 0.38743
factor(occupation)Officer 0.092148 0.212778 0.433 0.66534
factor(occupation)Other 0.073461 0.167994 0.437 0.66229
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.7408 on 247 degrees of freedom
(22 observations deleted due to missingness)
Multiple R-squared: 0.07475, Adjusted R-squared: 0.03729
F-statistic: 1.996 on 10 and 247 DF, p-value: 0.03437
5.2.4 Hồi quy logistic
Tương tự như hồi quy tuyến tính, nhưng sử dụng hàm glm() thay vì lm(). Các hàm sau
phân tích hồi quy logistic:
fit<-glm(y~x1+x2+x3)
summary(fit): Hiển thị kết quả
exp(fit): tính OR (lũy thừa hệ số e của coeficient)
confint(fit): 95% độ tin cậy của coeficient
exp(confint(fit): 95% độ tin cậy OR
predict(fit,type=”response”): Giá trị tiên đoán
residuals(fit,type=”deviance”): Phân tích phần dư
Ví dụ, phân tích nguy cơ nhồi máu cơ tim (infarction) với dùng thuốc tránh thai (pill), phân
tích hồi quy logistic như sau:
> fit<-glm(infarction~pill)
> summary(fit)
Call:
glm(formula = infarction ~ pill)
Deviance Residuals:
Min 1Q Median 3Q Max
-0.3966 -0.2048 -0.2048 0.6035 0.7952
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.20482 0.03332 6.147 3.62e-09 ***
pill 0.19173 0.06548 2.928 0.00377 **
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
(Dispersion parameter for gaussian family taken to be 0.1843039)
Null deviance: 42.496 on 223 degrees of freedom
Residual deviance: 40.915 on 222 degrees of freedom
AIC: 260.85
Number of Fisher Scoring iterations: 2
> confint(fit)
Waiting for profiling to be done...
2.5 % 97.5 %
(Intercept) 0.13951205 0.2701265
pill 0.06338972 0.3200752
> exp(coef(fit))
(Intercept) pill
1.227303 1.211346
> exp(confint(fit))
Waiting for profiling to be done...
2.5 % 97.5 %
(Intercept) 1.149713 1.310130
pill 1.065442 1.377231
5.2.5 Phân tích chi bình phương
Phâ n tích chi bình phương với số có sẵn (tương tự như lệnh tabi của Stata)
Đầu tiên sử dụng hàm matrix() để tạo object. Sau đó dùng hàm chisq.test() để tính.
Ví dụ, muốn tính chi bình phương của các số dưới đây:
27 40
89 102
Trước hết dùng hàm matrix() để tạo ra object x, sau đó dùng hàm chisq.test() để
tính như sau:
> x<-matrix(c(27,40,89,102),ncol=2)
> chisq.test(x)
Pearson's Chi-squared test with Yates' continuity correction
data: x
X-squared = 0.561, df = 1, p-value = 0.4539
ncol dùng để chỉ số cột (column).
Phân tích chi bình phương từ biến số của một bộ số liệu có sẵn:
Sử dụng trực tiếp hàm chisq.test(table()). Ví dụ, trong object benhnhan ta có 2
biến phân loại tên là hospital (gồm 2 giá trị cr và vn), và biến giới (nam=1, nữ=2). Muốn tính
chi bình phương có thể làm 2 cách trực tiếp và gián tiếp như sau:
Trực tiếp:
> chisq.test(table(gender,hospital))
Pearson's Chi-squared test with Yates' continuity correction
data: table(gender, hospital)
X-squared = 0.0078, df = 1, p-value = 0.9296
Gián tiếp: Tạo một object để trên cơ sở hàm table() trước, sau đó tính chi bình phương
trực tiếp từ object này. Ví dụ trên:
> m<-table(gender,hospital)
> m
hospital
gender cr vn
Male 50 49
Female 89 92
> prop.table(m)
hospital
gender cr vn
Male 0.1785714 0.1750000
Female 0.3178571 0.3285714
> chisq.test(m)
Pearson's Chi-squared test with Yates' continuity correction
data: m
X-squared = 0.0078, df = 1, p-value = 0.9296
6 Vẽ biểu đồ
Đây là thế mạnh của R, và là một trong những lý do khiến nhiều người quay lưng với các
phần mềm thông dụng khác để sử dụng R. Các biểu đồ của R tạo ra có thể được lưu với nhiều
định dạng khác nhau, bao gồm PDF, file hình ảnh (bmp, tiff, jpeg…).
Tài liệu này chỉ hướng dẫn vẽ 3 biểu đồ cơ bản. Rất nhiều biểu đồ khác cao cấp hơn hoặc chi
tiết hơn xin xem trực tiếp trên website của R và các tài liệu R khác có sẵn trên internet.
Chúng ta sẽ sử dụng một data file tên là hsb2.sav của SPSS để minh họa cho các biểu đồ sẽ
trình bày dưới đây.
File hsb2 thu thập số liệu của 200 học sinh, được cấu trúc như sau:
ID, Biến số (numeric), là số ID của học sinh
FEMALE, biến định danh (nominal), bằng 1 (nam) hoặc 2 (nữ)
RACE, biến định danh, gồm 4 giá trị: 1: Hispanic, 2: Asian, 3: African America và 4: Da
trắng
SES, tình trạng kinh tế, biến thứ tự (ordinal), gồm 3 giá trị: 1: thấp, 2: trung bình, 3: cao
SCHTYP, kiểu trường học, biến định danh, gồm 1: trường công, 2: trường tư
PROG, chương trình học, biến định danh, gồm 1: phổ thông, 2: chuyên biệt, 3: nghề
READ, biến dạng số, là điểm môn đọc
MATH, biến dạng số, là điểm môn toán
SCIENCE, biến dạng số, là điểm môn khoa học
SOCST, biến dạng số, là điểm môn xã hội
6.1.1 Biểu đồ dạng thanh (bar chart)
Áp dụng cho những biến số rời rạc.
Biểu đồ đơn: Áp dụng chỉ cho 1 biến số. Cấu trúc hàm chung là barplot(table(x)),
trong đó x là biến số cần tạo biểu đồ.
Có thể thực hiện từng bước: Tạo 1 object bằng hàm table() trước, sau đó sẽ vẽ biểu đồ
bằng object này.
Ví dụ, muốn tạo biểu đồ biểu thị chương trình học (PROG), ta có thể thực hiện trực tiếp như
sau:
barplot(table(PROG))
Hoặc tạo ra 1 object, ví dụ tên là program, sau đó dùng hàm barplot:
> program<-table(PROG)
> barplot(program)
Nếu muốn biểu đồ nằm ngang, ta thêm “horiz=TRUE” như sau:
> barplot(program,horiz=TRUE)
Ta có các tùy chọn sau đây được thêm vào thành phần chính của hàm barplot():
- Tên trục tung: ylab=”ten truc tung”
- Tên trục hoành: xlab=”ten truc hoanh”
- Tên biểu đồ: main=”ten bieu do”
- Tô màu cho các thanh: col=c(“mau1”, “mau2”, “mau3”…)
- Tạo ghi chú: legend=rownames(object)
Các ví dụ sau đây minh họa cho các tùy chọn này:
> barplot(program,main="phan bo chuong trinh",xlab="loai chuong
trinh",ylab="so hoc sinh",
col=c("red","green","yellow"),legend=rownames(program))
Biểu dồ có so sánh hai biến: Trong trường hợp này, cấu trúc lệnh cũng giống như trên nhưng
thêm biến thứ hai. Cụ thể như sau: barplot(table(y,x)), trong đó x sẽ nằm trục
hoành (biểu đồ dọc) hoặc trục tung (biểu đồ ngang). Ví dụ, muốn biểu hiện chương trình học
theo nam và nữ (biến FEMALE), thực hiện trên R như sau:
> barplot(table(FEMALE,PROG))
Hoặc có thể tạo 1 object trước, sau đó sử dụng hàm bar.plot()
> program2<-table(FEMALE,PROG)
> barplot(program)
Để tạo một biểu đồ nằm ngang, thêm tùy chọn: horiz=TRUE như trên
> program2<-table(FEMALE,PROG)
> barplot(program2,horiz=TRUE)
Tương tự như trong trường hợp trên, các tùy chọn (options) đều có thể sử dụng trong biểu đồ
dạng này. Mặc định, biểu đồ dạng thanh có 2 biến số sẽ được ghép vào 1 thanh cho 2 biến số
(gọi là stacked bar plot). Nếu muốn chọn 2 phân loại thành 2 thanh riêng biệt nằm cạnh nhau,
ta sử dụng tùy chọn: bedside=TRUE.
> barplot(program2,main="Phan bo chuong trinh",xlab="Loai chuong trinh",
+ ylab="So hoc sinh",col=c("red","dark blue"),legend=rownames(program2))
> barplot(program2,main="Phan bo chuong trinh",xlab="Loai chuong trinh",
+ ylab="So hoc sinh",col=c("red","dark blue"),legend=rownames(program2),
+ beside=TRUE)
6.1.2 Biểu đồ hình hộp (Box Plot)
Hàm chung là: boxplot(x~m), trong đó x là biến số dạng số, m là nhóm mà ta muốn tạo
ra các box plot theo nhóm. Các tùy chọn bao gồm:
- varwidth=TRUE nếu ta muốn chiều rộng của hộp tỉ lệ với căn bậc hai của cở mẫu
- horizontal=TRUE nếu ta muốn hình hộp nằm ngang.
- Các tùy chọn khác như tên trục, tên biểu đồ, màu, chú thích… giống như đã trình bày
trong biểu đồ hình thanh.
> boxplot(READ,main="Diem mon doc",col=c("red"))
> boxplot(READ~PROG,col=c("red","green","yellow"),horizontal=TRUE)
6.1.3 Biểu đồ scatter
Đây là dạng biểu đồ rất hay sử dụng trong phân tích thống kê. Biểu đồ cho ta cái nhìn sơ khởi
về mối quan hệ giữa 2 biến liên tục với nhau. Hàm sử dụng như sau:
Biểu đồ scatter đơn thuần: plot (x,y)
Thêm đường hồi quy màu đỏ: abline(lm(y~x),col=”red”)
Thêm đường lowess màu xanh: lines(lowess(x,y),col=”dark blue”)
Các ví dụ:
> plot(READ,WRITE,main="Tuong quan giua READ va WRITE")
> abline(lm(WRITE~READ),col="red")
> lines(lowess(READ,WRITE),col="darkblue")
TÀI LIỆU THAM KHẢO CHÍNH
Nguyễn Văn Tuấn: Phân tích dữ liệu và tạo biểu đồ bằng R. NXB Khoa học kỹ thuật –
Thành phố Hồ Chí Minh. 2006
Emmanuel Paradis: R for beginners. 2005
An Introduction to R từ website: http://www.r-project.org/
Quick-R homepage at: http://www.statmethods.net/