L1-IntroR

Introduction to R for Quant Methods

Giới thiệu sử dụng R căn bản cho lớp Phân tích định lượng

ChuongHN

https://rpubs.com/chuong/1219896

Tại sao sử dụng R

  • Trong môn phân tích định lượng, mục tiêu của môn học là xây dựng và nâng cấp các kỹ năng phân tích dựa trên dữ liệu cho người học. Theo đó, kỳ vọng của môn học là người học có thể giải quyết tốt các vấn đề trong phân tích kinh tế/kinh doanh dựa trên các công cụ định lượng. Do đó việc xây dựng kỹ năng phân tích dựa trên các mô hình định lượng cũng như trực quan hóa các kết quả là bắt buộc. Việc sử dụng các phần mềm là một phần tất yếu để phân tích, ước lượng và trình bày kết quả. Một số phần mềm phổ biến được sử dụng như: SPSS, Eviews, Stata, SmartPLS,R,Python,…Trong đó, phần lớn các phần mềm hiện tại được sử dụng là các phần mềm thương mại, và người dùng thường lách bằng các cách khác nhau để sử dụng khi không đủ kinh phí mua bản quyền. Xu hướng hiện nay là sử dụng các phần mềm nguồn mở không chỉ để giải quyết vấn đề này mà còn dựa trên khả năng mở rộng và sức mạnh của phần mềm mã nguồn mở. R và Python là 2 phần mềm mã nguồn mở phổ biến nhất trong phân tích định lượng hiện nay. Có nhiều lợi điểm khi sử dụng 2 phần mềm này, trong đó một số điểm nổi bật: - Mã nguồn mở: tất cả đều được sử dụng free, tiếp cận dễ dàng không bị rào cản về chi phí và các rủi ro khi dùng các phần mềm lậu. - Cộng đồng sử dụng lớn: Cộng đồng sử dụng lớn không chỉ hỗ trợ tốt cho các nhu cầu đa dạng trong phân tích mà còn tiềm năng phát triển lâu dài cũng như xu hướng yêu cầu kỹ năng nghề nghiệp. - Sức mạnh: R và Python đều có sức mạnh vượt trội trong phân tích định lượng. Sức mạnh này tiếp tục được phát triển và mở rộng theo thời gian. - Trực quan hóa dữ liệu: Đây là điểm mạnh của các phần mềm này so với các phần mềm thương mại được sử dụng phổ biến hiện nay. - Đa dụng: Có thể sử dụng với nhiều mục đích khác nhau không chỉ phân tích định lượng.

  • Trong đó, R và Python tuy ban đầu có tiếp cận tương đối rắc rối và khó hơn các phần mềm thương mại nhưng khi quen thuộc logic lệnh và cấu trúc thì việc phát triển là nhanh. Cả 2 phần mềm đều có cấu trúc lệnh và logic tương tự nhau, có thể chuyển đổi giữa 2 phần mềm không tốn nhiều thời gian. Trong đó, R tập trung nhiều hơn trong phân tích định lượng, Python có tính đa dụng cao hơn. Trong khóa học về phân tích định lượng trong Kinh tế, người học được kỳ vọng phát triển cả tư duy xử lý vấn đề trong kinh tế kinh doanh bằng các mô hình định lượng và phát kỹ kỹ năng về sử dụng các phần mềm hỗ trợ. Các dữ liệu thông tin của lớp được chia sẻ tại link của lớp học: https://drive.google.com/drive/u/1/folders/1-GLHSy2a0ihmoAN0AaFsnQPV_4ivb2A0

Cách thiết lập R ban đầu

  • Để bắt đầu sử dụng R, cần cài đặt phần mềm R. Hiện tại phiên bản R mới nhất là R4.4. Việc sử dụng R sẽ thuận tiện hơn rất nhiều khi sử dụng các môi trường làm việc với R, tiêu biểu nhất là Rstudio. Cần cài đặt cả 2 phần mềm này để làm việc với R một cách tối ưu nhất. Link cài đặt tại: https://posit.co/download/rstudio-desktop/ Lưu ý trong link đã có sẵn hướng dẫn cài đặt. Một số máy tính khi cài đặt có thể lỗi tải thiếu thì cần cài thêm Rtools tại (hoặc search Rtools trên google): https://cran.rstudio.com/bin/windows/Rtools/

  • Bước 1: Mở R-studio. Nếu lần đầu tiên mở lên, R-studio sẽ tự động quét phần mềm R có trong máy, nếu chưa có, nó sẽ yêu cầu cài đặt trước R. Nếu đã có R, R-studio sẽ đề xuất lựa chọn để sử dụng phiên bản R tối ưu. Đừng lo ngại, hãy cứ chọn mặc định.

  • Bước 2: Khi mở R-studio, các thiết lập mặc định ban đầu là đủ để sử dụng. Nếu cần cài đặt thay đổi giao diện và cách trình bày của R-studio thì vào: Tools/Global Options.

  • Bước 3: Hãy vào File/NewFile/ Quarto. Để bắt đầu mở 1 file Quarto như file này. File Quarto Document có thể vừa ghi chú, vừa thực hiện các lệnh và tạo report cũng như nhiều tính năng khác rất thuận tiện cho việc sử dụng với nhiều mục đích khác nhau.

  • Bước 4: Tổng quan các cửa sổ (windows) trong R có 4 nhóm cửa sổ chính: Cửa sổ sử dụng các file (Quarto, Rmarkdown, Rscript,Data), Cửa sổ Console, Cửa Sổ Plots (và các phần như Help, Files), Cửa sổ History. Các cửa sổ này đều hiển thị ở mặc định. Khi mới tiếp cận không cần chỉnh sửa gì với các cửa sổ này, các bạn có thể sử dụng ngay lập tức.

Các tính toán đơn giản với R

Trước hết mở 1 khối lệnh với R có 2 cách:
  • 1- Trực tiếp gõ lệnh vào cửa sổ Console và xem kết quả

  • 2- Để mở khối lệnh trong Quarto, hoặc click vào biểu tượng +c phía bên phải của file, hoặc gõ theo các ký hiệu khối lệnh:

  • 3- Thử kết quả với các tính toán đơn giản và nhấn nút run ở phía bên phải của khối lệnh

2+2
[1] 4
1+2*3-4/5
[1] 6.2
(19465*0.25)^23
[1] 6.389569e+84
5%%2
[1] 1

Các hàm tính toán căn bản trong R

  • print(x) - In ra màn hình

  • seq() - Tạo chuỗi

  • log(x) Natural log - Logarithm tự nhiên

  • sum(x) Sum -Tổng

  • exp(x) Exponential - Hàm mũ

  • mean(x) Mean - Trung bình

  • max(x) Largest element - Lớn nhất

  • median(x) Median - Trung vị

  • min(x) Smallest element - Nhỏ nhất

  • quantile(x) Percentage quantiles - Phân vị

  • round(x, n) Round to n decimal places - Làm tròn số

  • rank(x) Rank of elements - Thứ bậc

  • var(x) The variance - Phương sai

  • cor(x,y) Correlation - Tương quan

  • sd(x) The standard deviation - Độ lệch chuẩn

  • Nếu cần hỗ trợ cấu trúc lệnh hay lênh gì bất kỳ hãy gõ ?lệnh, hoặc ??lệnh Nếu cần tìm thông tin khác, help.search:

print("Hello world") 
[1] "Hello world"
seq(10,80, 10) # Tạo 1 chuỗi tăng mỗi 10 đơn vị
[1] 10 20 30 40 50 60 70 80
help.search("regression")
starting httpd help server ... done

Lệnh Gán

Lệnh gán là 1 phần quan trọng của R, giúp gán tất cả các thành phần dữ liệu, thông tin mà người phân tích muốn gán tên để sau đó có thể gọi ra và sử dụng. Ví dụ gán biến, dữ liệu, mô hình, biểu đồ,….

x<-2 # Gán x với giá trị 2
x
[1] 2
3 -> y # cách viết khác
y
[1] 3
x+y # Gọi tên và thực hiện phép tính 
[1] 5
x<-"a+b" # Gán x với 1 thông tin bất kỳ
x
[1] "a+b"
x<- 10>5 # Gán phép tính logic
x
[1] TRUE

Cấu trúc dữ liệu trong R

Các cấu trúc căn bản trong R bao gồm:

Vector: 1 chiều

X <- 1:5
X
[1] 1 2 3 4 5
Y <- letters
Y
 [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n" "o" "p" "q" "r" "s"
[20] "t" "u" "v" "w" "x" "y" "z"
x <-letters[1:5]
x
[1] "a" "b" "c" "d" "e"
class(x) # Lệnh biểu thị đặc tính của x
[1] "character"

Ma trận: 2 chiều

x <- matrix(1:30,nrow =  2 ) # Tạo ra 1 ma trận với 2 hàng, giá trị từ 1 đền 30
x
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14]
[1,]    1    3    5    7    9   11   13   15   17    19    21    23    25    27
[2,]    2    4    6    8   10   12   14   16   18    20    22    24    26    28
     [,15]
[1,]    29
[2,]    30
y <- matrix(1:30,ncol = 3) # tạo ra ma trận với 3 cột
y
      [,1] [,2] [,3]
 [1,]    1   11   21
 [2,]    2   12   22
 [3,]    3   13   23
 [4,]    4   14   24
 [5,]    5   15   25
 [6,]    6   16   26
 [7,]    7   17   27
 [8,]    8   18   28
 [9,]    9   19   29
[10,]   10   20   30
z <- matrix(1:30, nrow = 6, ncol = 5)
z
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    7   13   19   25
[2,]    2    8   14   20   26
[3,]    3    9   15   21   27
[4,]    4   10   16   22   28
[5,]    5   11   17   23   29
[6,]    6   12   18   24   30

Dữ liệu

data.frame(Col1=1:2, Col2=100:1) # Tạo ra dữ liệu và xem
    Col1 Col2
1      1  100
2      2   99
3      1   98
4      2   97
5      1   96
6      2   95
7      1   94
8      2   93
9      1   92
10     2   91
11     1   90
12     2   89
13     1   88
14     2   87
15     1   86
16     2   85
17     1   84
18     2   83
19     1   82
20     2   81
21     1   80
22     2   79
23     1   78
24     2   77
25     1   76
26     2   75
27     1   74
28     2   73
29     1   72
30     2   71
31     1   70
32     2   69
33     1   68
34     2   67
35     1   66
36     2   65
37     1   64
38     2   63
39     1   62
40     2   61
41     1   60
42     2   59
43     1   58
44     2   57
45     1   56
46     2   55
47     1   54
48     2   53
49     1   52
50     2   51
51     1   50
52     2   49
53     1   48
54     2   47
55     1   46
56     2   45
57     1   44
58     2   43
59     1   42
60     2   41
61     1   40
62     2   39
63     1   38
64     2   37
65     1   36
66     2   35
67     1   34
68     2   33
69     1   32
70     2   31
71     1   30
72     2   29
73     1   28
74     2   27
75     1   26
76     2   25
77     1   24
78     2   23
79     1   22
80     2   21
81     1   20
82     2   19
83     1   18
84     2   17
85     1   16
86     2   15
87     1   14
88     2   13
89     1   12
90     2   11
91     1   10
92     2    9
93     1    8
94     2    7
95     1    6
96     2    5
97     1    4
98     2    3
99     1    2
100    2    1
x <-  data.frame(Col1=1:5, Col2=1:10) # gán tên dữ liệu
x
   Col1 Col2
1     1    1
2     2    2
3     3    3
4     4    4
5     5    5
6     1    6
7     2    7
8     3    8
9     4    9
10    5   10

List: 1 dạng thông tin đa dụng, hỗn hợp

L <- list(Truong="uel", Lop="Quant", soluong=3, thanhtich=c(7,10,2))
L
$Truong
[1] "uel"

$Lop
[1] "Quant"

$soluong
[1] 3

$thanhtich
[1]  7 10  2

Các thư viện và gói mã lệnh

Các gói thư viện bao gồm nhiều mã lệnh khác nhau có sẵn trong R hoặc phải cài thêm để sử dụng cho thuận tiện.

Mỗi gói thư viện với các mục đích sử dụng khác nhau. Có thể cùng một mục tiêu có nhiều gói thư viện khác nhau đều sử dụng được.

Vì R là phần mềm mã nguồn mở nên sự đóng góp của cộng đồng rất lớn và rất đa dạng. Để sử dụng cần cài đặt gói thư viện và tải vào R trước khi sử dụng (hoặc gọi tên ngay trước khi dùng lệnh tương ứng).

Trong khóa học này chỉ hướng dẫn các gói thư viện phổ biến và thuận tiện, các bạn có thể sử dụng nhiều gói thư viện khác nhau để hoàn thành mục tiêu của mình.

Cài đặt thư viện dùng lệnh: install.packages

Sử dụng thư viện dùng lệnh: library(tên thư viện)

Khi R báo lỗi không có thư viện khi bạn sử dụng lệnh trong môn học, cần cài đặt thư viện trước.

Trong đó, gói “tidyverse” là gói thư viện phổ phiến với rất nhiều thư viện nhỏ để sử dụng đa mục đích cần cài đặt Để cài đặt hãy gõ install.packages(“tidyverse”) trong cửa sổ console

library(tidyverse)
Warning: package 'tidyverse' was built under R version 4.4.1
── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ dplyr     1.1.4     ✔ readr     2.1.5
✔ forcats   1.0.0     ✔ stringr   1.5.1
✔ ggplot2   3.5.1     ✔ tibble    3.2.1
✔ lubridate 1.9.3     ✔ tidyr     1.3.1
✔ purrr     1.0.2     
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()
ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors

Đọc và ghi dữ liệu

Lấy dữ liệu trên link thông tin lớp học: https://drive.google.com/drive/u/1/folders/1-GLHSy2a0ihmoAN0AaFsnQPV_4ivb2A0

Có nhiều cách nhập dữ liệu và ghi các dữ liệu với nhiều loại file khác nhau, ở đây giới thiệu 2 cách phổ biến sử dụng trong môn học, các kiểu file khác nhau các bạn có thể tự tìm hiểu

Cách 1: Nhập dữ liệu từ Stata

Link dẫn đến file cần đến là \ hoặc /

# Đọc thông tin 
## Link dẫn đến file cần đến là \\ hoặc /
haven::read_dta("C:\\Users\\Huynh Chuong\\Desktop\\University\\UEL\\Class_QuantMethods\\2024\\DataWDI.dta")  
# A tibble: 13,300 × 6
   CountryName CountryCode  year   GDP     K     L
   <chr>       <chr>       <dbl> <dbl> <dbl> <dbl>
 1 Afghanistan AFG          1974    NA    NA    NA
 2 Afghanistan AFG          1975    NA    NA    NA
 3 Afghanistan AFG          1976    NA    NA    NA
 4 Afghanistan AFG          1977    NA    NA    NA
 5 Afghanistan AFG          1978    NA    NA    NA
 6 Afghanistan AFG          1979    NA    NA    NA
 7 Afghanistan AFG          1980    NA    NA    NA
 8 Afghanistan AFG          1981    NA    NA    NA
 9 Afghanistan AFG          1982    NA    NA    NA
10 Afghanistan AFG          1983    NA    NA    NA
# ℹ 13,290 more rows

dấu %>% nằm trong gói thư viện tidyverse biểu thị lấy kết quả trước để làm cho lệnh sau.

Ví dụ mô tả chung summary

library(tidyverse) # tải thư viện vào R
# Đọc thông tin
## dấu %>% nằm trong gói thư viện tidyverse biểu thị lấy kết quả trước để làm cho lệnh sau. Ví dụ mô tả chung summary
haven::read_dta("C:\\Users\\Huynh Chuong\\Desktop\\University\\UEL\\Class_QuantMethods\\2024\\DataWDI.dta") %>% # Khi sử dụng không cần tải library trước, ta gõ tên gói thư viện :: tên lệnh, giống ví dụ: haven::read_dta
  summary()
 CountryName        CountryCode             year           GDP           
 Length:13300       Length:13300       Min.   :1974   Min.   :1.010e+07  
 Class :character   Class :character   1st Qu.:1986   1st Qu.:5.422e+09  
 Mode  :character   Mode  :character   Median :1998   Median :3.553e+10  
                                       Mean   :1998   Mean   :1.685e+12  
                                       3rd Qu.:2011   3rd Qu.:3.995e+11  
                                       Max.   :2023   Max.   :9.283e+13  
                                                      NA's   :1588       
       K                    L            
 Min.   :-3.873e+07   Min.   :3.347e+04  
 1st Qu.: 2.634e+09   1st Qu.:1.352e+06  
 Median : 1.703e+10   Median :4.815e+06  
 Mean   : 4.345e+11   Mean   :1.335e+08  
 3rd Qu.: 1.333e+11   3rd Qu.:3.432e+07  
 Max.   : 2.232e+13   Max.   :3.628e+09  
 NA's   :6320         NA's   :5548       
# Gán tên dữ liệu
WDI <- haven::read_dta("C:\\Users\\Huynh Chuong\\Desktop\\University\\UEL\\Class_QuantMethods\\2024\\DataWDI.dta")  
WDI # Xem dữ liệu
# A tibble: 13,300 × 6
   CountryName CountryCode  year   GDP     K     L
   <chr>       <chr>       <dbl> <dbl> <dbl> <dbl>
 1 Afghanistan AFG          1974    NA    NA    NA
 2 Afghanistan AFG          1975    NA    NA    NA
 3 Afghanistan AFG          1976    NA    NA    NA
 4 Afghanistan AFG          1977    NA    NA    NA
 5 Afghanistan AFG          1978    NA    NA    NA
 6 Afghanistan AFG          1979    NA    NA    NA
 7 Afghanistan AFG          1980    NA    NA    NA
 8 Afghanistan AFG          1981    NA    NA    NA
 9 Afghanistan AFG          1982    NA    NA    NA
10 Afghanistan AFG          1983    NA    NA    NA
# ℹ 13,290 more rows
View(WDI) # Xem bằng cách mở cửa sổ riêng

Cách 2: Nhập dữ liệu từ file excel

Đọc dữ liệu từ 1 file excel ở 1 sheet

readxl::read_xlsx("C:\\Users\\Huynh Chuong\\Desktop\\University\\UEL\\Class_QuantMethods\\2024\\WDI_data.xlsx", sheet = "Sheet2")
# A tibble: 798 × 53
   `Country Name` `Country Code` `Series Name`       `1974`      `1975`   `1976`
   <chr>          <chr>          <chr>                <dbl>       <dbl>    <dbl>
 1 Afghanistan    AFG            GDP                    NA     NA       NA      
 2 Afghanistan    AFG            L                      NA     NA       NA      
 3 Afghanistan    AFG            K                      NA     NA       NA      
 4 Albania        ALB            GDP                    NA     NA       NA      
 5 Albania        ALB            L                      NA     NA       NA      
 6 Albania        ALB            K                      NA     NA       NA      
 7 Algeria        DZA            GDP           49117415082.     5.16e10  5.59e10
 8 Algeria        DZA            L                      NA     NA       NA      
 9 Algeria        DZA            K             19508642957.     2.12e10  2.04e10
10 American Samoa ASM            GDP                    NA     NA       NA      
# ℹ 788 more rows
# ℹ 47 more variables: `1977` <dbl>, `1978` <dbl>, `1979` <dbl>, `1980` <dbl>,
#   `1981` <dbl>, `1982` <dbl>, `1983` <dbl>, `1984` <dbl>, `1985` <dbl>,
#   `1986` <dbl>, `1987` <dbl>, `1988` <dbl>, `1989` <dbl>, `1990` <dbl>,
#   `1991` <dbl>, `1992` <dbl>, `1993` <dbl>, `1994` <dbl>, `1995` <dbl>,
#   `1996` <dbl>, `1997` <dbl>, `1998` <dbl>, `1999` <dbl>, `2000` <dbl>,
#   `2001` <dbl>, `2002` <dbl>, `2003` <dbl>, `2004` <dbl>, `2005` <dbl>, …

Gán tên

WDI <- readxl::read_xlsx("C:\\Users\\Huynh Chuong\\Desktop\\University\\UEL\\Class_QuantMethods\\2024\\WDI_data.xlsx", sheet = "Sheet2")

Xem tên biến

# Xem tên biến
WDI %>% variable.names()
 [1] "Country Name" "Country Code" "Series Name"  "1974"         "1975"        
 [6] "1976"         "1977"         "1978"         "1979"         "1980"        
[11] "1981"         "1982"         "1983"         "1984"         "1985"        
[16] "1986"         "1987"         "1988"         "1989"         "1990"        
[21] "1991"         "1992"         "1993"         "1994"         "1995"        
[26] "1996"         "1997"         "1998"         "1999"         "2000"        
[31] "2001"         "2002"         "2003"         "2004"         "2005"        
[36] "2006"         "2007"         "2008"         "2009"         "2010"        
[41] "2011"         "2012"         "2013"         "2014"         "2015"        
[46] "2016"         "2017"         "2018"         "2019"         "2020"        
[51] "2021"         "2022"         "2023"        

Ghi dữ liệu

Ghi bằng kiểu stata

WDI <- haven::read_dta("C:\\Users\\Huynh Chuong\\Desktop\\University\\UEL\\Class_QuantMethods\\2024\\DataWDI.dta") 
WDI %>% haven::write_dta("C:\\Users\\Huynh Chuong\\Desktop\\University\\UEL\\Class_QuantMethods\\2024\\GhiDataWDI.dta") 

Ghi bằng kiểu excel

WDI %>% openxlsx::write.xlsx("C:\\Users\\Huynh Chuong\\Desktop\\University\\UEL\\Class_QuantMethods\\2024\\GhiDataWDI.xlsx") 

Quản lý dữ liệu căn bản

Xem thông tin

Gán tên

WDI <- haven::read_dta("C:\\Users\\Huynh Chuong\\Desktop\\University\\UEL\\Class_QuantMethods\\2024\\DataWDI.dta")  

Xem tên biến

# Xem tên biến
WDI %>% variable.names()
[1] "CountryName" "CountryCode" "year"        "GDP"         "K"          
[6] "L"          

Tạo và thay đổi biến

WDI %>%
  rename(Tenmoi=CountryName)
# A tibble: 13,300 × 6
   Tenmoi      CountryCode  year   GDP     K     L
   <chr>       <chr>       <dbl> <dbl> <dbl> <dbl>
 1 Afghanistan AFG          1974    NA    NA    NA
 2 Afghanistan AFG          1975    NA    NA    NA
 3 Afghanistan AFG          1976    NA    NA    NA
 4 Afghanistan AFG          1977    NA    NA    NA
 5 Afghanistan AFG          1978    NA    NA    NA
 6 Afghanistan AFG          1979    NA    NA    NA
 7 Afghanistan AFG          1980    NA    NA    NA
 8 Afghanistan AFG          1981    NA    NA    NA
 9 Afghanistan AFG          1982    NA    NA    NA
10 Afghanistan AFG          1983    NA    NA    NA
# ℹ 13,290 more rows

Lưu lại thành dữ liệu

WDI %>%
  rename(Country=CountryName) 
# A tibble: 13,300 × 6
   Country     CountryCode  year   GDP     K     L
   <chr>       <chr>       <dbl> <dbl> <dbl> <dbl>
 1 Afghanistan AFG          1974    NA    NA    NA
 2 Afghanistan AFG          1975    NA    NA    NA
 3 Afghanistan AFG          1976    NA    NA    NA
 4 Afghanistan AFG          1977    NA    NA    NA
 5 Afghanistan AFG          1978    NA    NA    NA
 6 Afghanistan AFG          1979    NA    NA    NA
 7 Afghanistan AFG          1980    NA    NA    NA
 8 Afghanistan AFG          1981    NA    NA    NA
 9 Afghanistan AFG          1982    NA    NA    NA
10 Afghanistan AFG          1983    NA    NA    NA
# ℹ 13,290 more rows

Tạo biến mới

WDI %>%
  mutate(lnY=log(GDP))
# A tibble: 13,300 × 7
   CountryName CountryCode  year   GDP     K     L   lnY
   <chr>       <chr>       <dbl> <dbl> <dbl> <dbl> <dbl>
 1 Afghanistan AFG          1974    NA    NA    NA    NA
 2 Afghanistan AFG          1975    NA    NA    NA    NA
 3 Afghanistan AFG          1976    NA    NA    NA    NA
 4 Afghanistan AFG          1977    NA    NA    NA    NA
 5 Afghanistan AFG          1978    NA    NA    NA    NA
 6 Afghanistan AFG          1979    NA    NA    NA    NA
 7 Afghanistan AFG          1980    NA    NA    NA    NA
 8 Afghanistan AFG          1981    NA    NA    NA    NA
 9 Afghanistan AFG          1982    NA    NA    NA    NA
10 Afghanistan AFG          1983    NA    NA    NA    NA
# ℹ 13,290 more rows

Tạo biến mới

WDI %>%
  rename(Country=CountryName) %>% # Đổi tên biến
  mutate(lnY=log(GDP),
         lnL=log(L)) %>% # Tạo biến
  select(Country,year, lnY,L,K) %>% # Chọn biến
  filter(year>=1990) -> WDI_data   # Lọc quan sát theo điều kiện và lưu thành dữ liệu mới

Quay chiều dữ liệu (pivot)

Ví dụ dữ liệu tải về

WDI <- readxl::read_xlsx("C:\\Users\\Huynh Chuong\\Desktop\\University\\UEL\\Class_QuantMethods\\2024\\WDI_data.xlsx", sheet = "Sheet2")

Xem dữ liệu

WDI
# A tibble: 798 × 53
   `Country Name` `Country Code` `Series Name`       `1974`      `1975`   `1976`
   <chr>          <chr>          <chr>                <dbl>       <dbl>    <dbl>
 1 Afghanistan    AFG            GDP                    NA     NA       NA      
 2 Afghanistan    AFG            L                      NA     NA       NA      
 3 Afghanistan    AFG            K                      NA     NA       NA      
 4 Albania        ALB            GDP                    NA     NA       NA      
 5 Albania        ALB            L                      NA     NA       NA      
 6 Albania        ALB            K                      NA     NA       NA      
 7 Algeria        DZA            GDP           49117415082.     5.16e10  5.59e10
 8 Algeria        DZA            L                      NA     NA       NA      
 9 Algeria        DZA            K             19508642957.     2.12e10  2.04e10
10 American Samoa ASM            GDP                    NA     NA       NA      
# ℹ 788 more rows
# ℹ 47 more variables: `1977` <dbl>, `1978` <dbl>, `1979` <dbl>, `1980` <dbl>,
#   `1981` <dbl>, `1982` <dbl>, `1983` <dbl>, `1984` <dbl>, `1985` <dbl>,
#   `1986` <dbl>, `1987` <dbl>, `1988` <dbl>, `1989` <dbl>, `1990` <dbl>,
#   `1991` <dbl>, `1992` <dbl>, `1993` <dbl>, `1994` <dbl>, `1995` <dbl>,
#   `1996` <dbl>, `1997` <dbl>, `1998` <dbl>, `1999` <dbl>, `2000` <dbl>,
#   `2001` <dbl>, `2002` <dbl>, `2003` <dbl>, `2004` <dbl>, `2005` <dbl>, …

Với mục tiêu là dữ liệu phải có dạng Y, X1, X2 để có thể chạy mô hình kinh tế lượng, chúng ta phải quay dữ liệu tương ứng

Quay dọc: Để giá trị năm thành 1 biến

WDI %>%
  pivot_longer(cols= c(-"Country Name",- "Country Code",-"Series Name" )) # Quay dọc trừ các biến trong cột bằng cách không chọn biến với dấu - bằng cách đặt dấu trừ trước tên biến, nếu quay dọc với các biến đó thì không đặt dấu -
# A tibble: 39,900 × 5
   `Country Name` `Country Code` `Series Name` name  value
   <chr>          <chr>          <chr>         <chr> <dbl>
 1 Afghanistan    AFG            GDP           1974     NA
 2 Afghanistan    AFG            GDP           1975     NA
 3 Afghanistan    AFG            GDP           1976     NA
 4 Afghanistan    AFG            GDP           1977     NA
 5 Afghanistan    AFG            GDP           1978     NA
 6 Afghanistan    AFG            GDP           1979     NA
 7 Afghanistan    AFG            GDP           1980     NA
 8 Afghanistan    AFG            GDP           1981     NA
 9 Afghanistan    AFG            GDP           1982     NA
10 Afghanistan    AFG            GDP           1983     NA
# ℹ 39,890 more rows

Sau đó quay ngang: để tên biến thành các cột riêng

WDI %>%
  pivot_longer(cols= c(-"Country Name",- "Country Code",-"Series Name" )) %>%
  pivot_wider(id_cols = c("Country Name", "Country Code", "name"),names_from = c("Series Name")) 
# A tibble: 13,300 × 6
   `Country Name` `Country Code` name    GDP     L     K
   <chr>          <chr>          <chr> <dbl> <dbl> <dbl>
 1 Afghanistan    AFG            1974     NA    NA    NA
 2 Afghanistan    AFG            1975     NA    NA    NA
 3 Afghanistan    AFG            1976     NA    NA    NA
 4 Afghanistan    AFG            1977     NA    NA    NA
 5 Afghanistan    AFG            1978     NA    NA    NA
 6 Afghanistan    AFG            1979     NA    NA    NA
 7 Afghanistan    AFG            1980     NA    NA    NA
 8 Afghanistan    AFG            1981     NA    NA    NA
 9 Afghanistan    AFG            1982     NA    NA    NA
10 Afghanistan    AFG            1983     NA    NA    NA
# ℹ 13,290 more rows

Đổi tên biến

WDI %>%
  pivot_longer(cols= c(-"Country Name",- "Country Code",-"Series Name" )) %>%
  pivot_wider(id_cols = c("Country Name", "Country Code", "name"),names_from = c("Series Name")) %>%
  rename("year"="name")   
# A tibble: 13,300 × 6
   `Country Name` `Country Code` year    GDP     L     K
   <chr>          <chr>          <chr> <dbl> <dbl> <dbl>
 1 Afghanistan    AFG            1974     NA    NA    NA
 2 Afghanistan    AFG            1975     NA    NA    NA
 3 Afghanistan    AFG            1976     NA    NA    NA
 4 Afghanistan    AFG            1977     NA    NA    NA
 5 Afghanistan    AFG            1978     NA    NA    NA
 6 Afghanistan    AFG            1979     NA    NA    NA
 7 Afghanistan    AFG            1980     NA    NA    NA
 8 Afghanistan    AFG            1981     NA    NA    NA
 9 Afghanistan    AFG            1982     NA    NA    NA
10 Afghanistan    AFG            1983     NA    NA    NA
# ℹ 13,290 more rows

Gán tên dữ liệu

WDI %>%
  pivot_longer(cols= c(-"Country Name",- "Country Code",-"Series Name" )) %>%
  pivot_wider(id_cols = c("Country Name", "Country Code", "name"),names_from = c("Series Name")) %>%
  rename("year"="name") ->WDI_data  

Chạy thử mô hình

lm(GDP~L+K, data = WDI_data) %>% summary()

Call:
lm(formula = GDP ~ L + K, data = WDI_data)

Residuals:
       Min         1Q     Median         3Q        Max 
-9.168e+12 -1.773e+11 -1.637e+11 -7.177e+10  4.533e+12 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept)  1.789e+11  9.804e+09   18.25   <2e-16 ***
L           -3.125e+03  5.343e+01  -58.49   <2e-16 ***
K            4.631e+00  8.577e-03  539.89   <2e-16 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 6.827e+11 on 5316 degrees of freedom
  (7981 observations deleted due to missingness)
Multiple R-squared:  0.9922,    Adjusted R-squared:  0.9922 
F-statistic: 3.378e+05 on 2 and 5316 DF,  p-value: < 2.2e-16
lm(log(GDP)~log(L)+log(K), data = WDI_data) %>% summary()
Warning in log(K): NaNs produced

Call:
lm(formula = log(GDP) ~ log(L) + log(K), data = WDI_data)

Residuals:
    Min      1Q  Median      3Q     Max 
-1.6020 -0.1687  0.0114  0.1731  4.4288 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept) 2.604035   0.041035   63.46   <2e-16 ***
log(L)      0.082066   0.003676   22.33   <2e-16 ***
log(K)      0.902241   0.003151  286.34   <2e-16 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 0.3249 on 5315 degrees of freedom
  (7982 observations deleted due to missingness)
Multiple R-squared:  0.9836,    Adjusted R-squared:  0.9836 
F-statistic: 1.599e+05 on 2 and 5315 DF,  p-value: < 2.2e-16

Ghép dữ liệu

Ghép có tên biến xác định giống nhau

Nhập dữ liệu từ file stata (dta)

D1 <- haven::read_dta("C:\\Users\\Huynh Chuong\\Desktop\\University\\UEL\\Class_QuantMethods\\2024\\Dat1.dta") 
D2 <- haven::read_dta("C:\\Users\\Huynh Chuong\\Desktop\\University\\UEL\\Class_QuantMethods\\2024\\Dat1_2.dta")

Xem 2 dữ liệu

D1
# A tibble: 8 × 3
     id     X1    X2
  <dbl>  <dbl> <dbl>
1     1 0.762  0.732
2     2 0.555  0.710
3     3 0.118  0.184
4     4 0.0350 0.209
5     5 0.476  0.753
6     6 0.178  0.653
7     7 0.779  0.839
8    10 0.353  0.172
D2
# A tibble: 5 × 3
     id     X3    X4
  <dbl>  <dbl> <dbl>
1     1 0.0368 0.333
2     2 0.216  0.244
3     8 0.125  0.824
4     9 0.503  0.253
5    10 0.187  0.427

Ghép D2 vào D1

D1 %>%
  left_join(D2, by=c("id"))
# A tibble: 8 × 5
     id     X1    X2      X3     X4
  <dbl>  <dbl> <dbl>   <dbl>  <dbl>
1     1 0.762  0.732  0.0368  0.333
2     2 0.555  0.710  0.216   0.244
3     3 0.118  0.184 NA      NA    
4     4 0.0350 0.209 NA      NA    
5     5 0.476  0.753 NA      NA    
6     6 0.178  0.653 NA      NA    
7     7 0.779  0.839 NA      NA    
8    10 0.353  0.172  0.187   0.427

Ghép D1 vào D2

D1 %>%
  right_join(D2, by=c("id"))
# A tibble: 5 × 5
     id     X1     X2     X3    X4
  <dbl>  <dbl>  <dbl>  <dbl> <dbl>
1     1  0.762  0.732 0.0368 0.333
2     2  0.555  0.710 0.216  0.244
3    10  0.353  0.172 0.187  0.427
4     8 NA     NA     0.125  0.824
5     9 NA     NA     0.503  0.253

Ghép toàn bộ dữ liệu giữ toàn bộ thông tin của D1

D1 %>%
  full_join(D2, by=c("id"))
# A tibble: 10 × 5
      id      X1     X2      X3     X4
   <dbl>   <dbl>  <dbl>   <dbl>  <dbl>
 1     1  0.762   0.732  0.0368  0.333
 2     2  0.555   0.710  0.216   0.244
 3     3  0.118   0.184 NA      NA    
 4     4  0.0350  0.209 NA      NA    
 5     5  0.476   0.753 NA      NA    
 6     6  0.178   0.653 NA      NA    
 7     7  0.779   0.839 NA      NA    
 8    10  0.353   0.172  0.187   0.427
 9     8 NA      NA      0.125   0.824
10     9 NA      NA      0.503   0.253

Ghép toàn bộ dữ liệu giữ toàn bộ thông tin của D2

D2 %>%
  full_join(D1, by=c("id"))
# A tibble: 10 × 5
      id      X3     X4      X1     X2
   <dbl>   <dbl>  <dbl>   <dbl>  <dbl>
 1     1  0.0368  0.333  0.762   0.732
 2     2  0.216   0.244  0.555   0.710
 3     8  0.125   0.824 NA      NA    
 4     9  0.503   0.253 NA      NA    
 5    10  0.187   0.427  0.353   0.172
 6     3 NA      NA      0.118   0.184
 7     4 NA      NA      0.0350  0.209
 8     5 NA      NA      0.476   0.753
 9     6 NA      NA      0.178   0.653
10     7 NA      NA      0.779   0.839

Ghép có tên biến xác định khác nhau hoặc nhiều biến xác định

Nhập dữ liệu từ file stata (dta)

D1 <- haven::read_dta("C:\\Users\\Huynh Chuong\\Desktop\\University\\UEL\\Class_QuantMethods\\2024\\Dat2.dta") 
D2 <- haven::read_dta("C:\\Users\\Huynh Chuong\\Desktop\\University\\UEL\\Class_QuantMethods\\2024\\Dat2_2.dta")

Xem dữ liệu

D1
# A tibble: 10 × 4
     id1   id2     X1    X2
   <dbl> <dbl>  <dbl> <dbl>
 1     1     1 0.756  0.802
 2     2     2 0.560  0.243
 3     3     3 0.789  0.421
 4     4     4 0.260  0.747
 5     5     5 0.532  0.589
 6     6     6 0.349  0.348
 7     7     7 0.153  0.292
 8     8     8 0.0827 0.745
 9     9     9 0.843  0.961
10    10    10 0.166  0.889
D2
# A tibble: 5 × 4
    hh1   hh2    X3    X4
  <dbl> <dbl> <dbl> <dbl>
1     1     1 0.939 0.799
2     2     2 0.520 0.869
3     8     3 0.483 0.883
4     9     4 0.832 0.125
5    10     5 0.956 0.527

Ghép Ghép D2 vào D1

D1 %>%
  left_join(D2, by=c("id1"="hh1", "id2"="hh2"))
# A tibble: 10 × 6
     id1   id2     X1    X2     X3     X4
   <dbl> <dbl>  <dbl> <dbl>  <dbl>  <dbl>
 1     1     1 0.756  0.802  0.939  0.799
 2     2     2 0.560  0.243  0.520  0.869
 3     3     3 0.789  0.421 NA     NA    
 4     4     4 0.260  0.747 NA     NA    
 5     5     5 0.532  0.589 NA     NA    
 6     6     6 0.349  0.348 NA     NA    
 7     7     7 0.153  0.292 NA     NA    
 8     8     8 0.0827 0.745 NA     NA    
 9     9     9 0.843  0.961 NA     NA    
10    10    10 0.166  0.889 NA     NA    

Ghép D1 vào D2

D1 %>%
  right_join(D2, by=c("id1"="hh1", "id2"="hh2"))
# A tibble: 5 × 6
    id1   id2     X1     X2    X3    X4
  <dbl> <dbl>  <dbl>  <dbl> <dbl> <dbl>
1     1     1  0.756  0.802 0.939 0.799
2     2     2  0.560  0.243 0.520 0.869
3     8     3 NA     NA     0.483 0.883
4     9     4 NA     NA     0.832 0.125
5    10     5 NA     NA     0.956 0.527

Ghép toàn bộ dữ liệu, giữ thông tin của D1

D1 %>%
  full_join(D2, by=c("id1"="hh1", "id2"="hh2"))
# A tibble: 13 × 6
     id1   id2      X1     X2     X3     X4
   <dbl> <dbl>   <dbl>  <dbl>  <dbl>  <dbl>
 1     1     1  0.756   0.802  0.939  0.799
 2     2     2  0.560   0.243  0.520  0.869
 3     3     3  0.789   0.421 NA     NA    
 4     4     4  0.260   0.747 NA     NA    
 5     5     5  0.532   0.589 NA     NA    
 6     6     6  0.349   0.348 NA     NA    
 7     7     7  0.153   0.292 NA     NA    
 8     8     8  0.0827  0.745 NA     NA    
 9     9     9  0.843   0.961 NA     NA    
10    10    10  0.166   0.889 NA     NA    
11     8     3 NA      NA      0.483  0.883
12     9     4 NA      NA      0.832  0.125
13    10     5 NA      NA      0.956  0.527

Ghép toàn bộ dữ liệu, giữ thông tin của D2

D2 %>%
  full_join(D1, by=c("hh1"="id1", "hh2"="id2"))
# A tibble: 13 × 6
     hh1   hh2     X3     X4      X1     X2
   <dbl> <dbl>  <dbl>  <dbl>   <dbl>  <dbl>
 1     1     1  0.939  0.799  0.756   0.802
 2     2     2  0.520  0.869  0.560   0.243
 3     8     3  0.483  0.883 NA      NA    
 4     9     4  0.832  0.125 NA      NA    
 5    10     5  0.956  0.527 NA      NA    
 6     3     3 NA     NA      0.789   0.421
 7     4     4 NA     NA      0.260   0.747
 8     5     5 NA     NA      0.532   0.589
 9     6     6 NA     NA      0.349   0.348
10     7     7 NA     NA      0.153   0.292
11     8     8 NA     NA      0.0827  0.745
12     9     9 NA     NA      0.843   0.961
13    10    10 NA     NA      0.166   0.889

Ghép toàn bộ dữ liệu, giữ thông tin của cả D1, D2

D2 %>%
  full_join(D1, by=c("hh1"="id1", "hh2"="id2"),keep=T)
# A tibble: 13 × 8
     hh1   hh2     X3     X4   id1   id2      X1     X2
   <dbl> <dbl>  <dbl>  <dbl> <dbl> <dbl>   <dbl>  <dbl>
 1     1     1  0.939  0.799     1     1  0.756   0.802
 2     2     2  0.520  0.869     2     2  0.560   0.243
 3     8     3  0.483  0.883    NA    NA NA      NA    
 4     9     4  0.832  0.125    NA    NA NA      NA    
 5    10     5  0.956  0.527    NA    NA NA      NA    
 6    NA    NA NA     NA         3     3  0.789   0.421
 7    NA    NA NA     NA         4     4  0.260   0.747
 8    NA    NA NA     NA         5     5  0.532   0.589
 9    NA    NA NA     NA         6     6  0.349   0.348
10    NA    NA NA     NA         7     7  0.153   0.292
11    NA    NA NA     NA         8     8  0.0827  0.745
12    NA    NA NA     NA         9     9  0.843   0.961
13    NA    NA NA     NA        10    10  0.166   0.889

Đồ thị căn bản

Bài tập

Reference:

https://rpubs.com/nvilortejedor/IntrotoR