# Load thư viện ISLR chứa tập dữ liệu Smarket
library(ISLR)
# load bộ dữ liệu Smarket trong package ISLR
data(Smarket)
# xem dữ liệu ở dạng cửa sổ
fix(Smarket)
#Xem có bao nhiêu dòng và cột
dim(Smarket)
[1] 1250 9
# Xem tên các biến trong dữ liệu Smarket
names(Smarket)
[1] "Year" "Lag1" "Lag2" "Lag3" "Lag4" "Lag5" "Volume" "Today" "Direction"
# xem mô tả thông tin của bộ dữ liệu Smarket, mô tả ý nghĩa của các biến
?Smarket
# Tính hệ số tương quan giữa các biến
#Câu lệnh này sẽ bị báo lỗi vì biến Direction là định tính.
cor(Smarket)
Error in cor(Smarket) : 'x' must be numeric
#Loại bỏ biến định tính Direction trước khi tính hệ số tương quan
cor (Smarket[,-9])
Year Lag1 Lag2 Lag3 Lag4 Lag5 Volume Today
Year 1.00000000 0.029699649 0.030596422 0.033194581 0.035688718 0.029787995 0.53900647 0.030095229
Lag1 0.02969965 1.000000000 -0.026294328 -0.010803402 -0.002985911 -0.005674606 0.04090991 -0.026155045
Lag2 0.03059642 -0.026294328 1.000000000 -0.025896670 -0.010853533 -0.003557949 -0.04338321 -0.010250033
Lag3 0.03319458 -0.010803402 -0.025896670 1.000000000 -0.024051036 -0.018808338 -0.04182369 -0.002447647
Lag4 0.03568872 -0.002985911 -0.010853533 -0.024051036 1.000000000 -0.027083641 -0.04841425 -0.006899527
Lag5 0.02978799 -0.005674606 -0.003557949 -0.018808338 -0.027083641 1.000000000 -0.02200231 -0.034860083
Volume 0.53900647 0.040909908 -0.043383215 -0.041823686 -0.048414246 -0.022002315 1.00000000 0.014591823
Today 0.03009523 -0.026155045 -0.010250033 -0.002447647 -0.006899527 -0.034860083 0.01459182 1.000000000
Mối tương quan giữa những biến Lag và biến Today gần = 0, dường như có ít sự tương quan giữa giá trị trả về ngày nay và ngày xưa. Mối tương quan duy nhất có giá trị tương quan khá lớn là giữa biến Year và Volume.
# attach dùng để khiến cho những biến trong dữ liệu Smarket có sẵn trong R theo tên
attach ( Smarket)
Chúng ta sẽ fit mô hình logistic Regression để dự đoán biến đầu ra Direction và sử dụng các biến đầu vào là Lag1 -> Lag5 và Volume. Hàm glm() và đưa vào biến family =binomial dùng để chạy 1 mô hình Logistic Regression.
# Fit mô hình Logistic Regresion để dự đoán biến đầu ra Direction trong dữ liệu Smarket
glm.fits = glm(Direction~Lag1 + Lag2 + Lag3 + Lag4 + Lag5 + Volume ,
data=Smarket ,family=binomial)
# Hàm summary(model1) sẽ cho chúng ta biết thông tin p-values, Z-value, độ lệch chuẩn cho những hệ số của các biến đầu vào
summary(glm.fits)
Call:
glm(formula = Direction ~ Lag1 + Lag2 + Lag3 + Lag4 + Lag5 +
Volume, family = binomial, data = Smarket)
Deviance Residuals:
Min 1Q Median 3Q Max
-1.446 -1.203 1.065 1.145 1.326
Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept) -0.126000 0.240736 -0.523 0.601
Lag1 -0.073074 0.050167 -1.457 0.145
Lag2 -0.042301 0.050086 -0.845 0.398
Lag3 0.011085 0.049939 0.222 0.824
Lag4 0.009359 0.049974 0.187 0.851
Lag5 0.010313 0.049511 0.208 0.835
Volume 0.135441 0.158360 0.855 0.392
(Dispersion parameter for binomial family taken to be 1)
Null deviance: 1731.2 on 1249 degrees of freedom
Residual deviance: 1727.6 on 1243 degrees of freedom
AIC: 1741.6
Number of Fisher Scoring iterations: 3
Hàm summray cho biết thông tin về giá trị các hệ số của mô hình (B0->B6), thấy rằng Lag1 có hệ số nhỏ nhất = 0.145, tuy nhiên ở giá trị 0.145 vẫn là tương đối lớn, vì thế không có bằng chứng thống kê cho thấy rằng có mối quan hệ giữa Lag1 và biến đầu ra Direction.
# Sử dụng hàm coef() để chỉ hiển thị hệ số của mô hình (B0->B6)
coef(glm.fits)
(Intercept) Lag1 Lag2 Lag3 Lag4 Lag5 Volume
-0.126000257 -0.073073746 -0.042301344 0.011085108 0.009358938 0.010313068 0.135440659
#Sử dụng hàm summary để chỉ truy cập và hiển thị thông tin các hệ số của mô hình (B0-B6)
summary(glm.fits)$coef
Estimate Std. Error z value Pr(>|z|)
(Intercept) -0.126000257 0.24073574 -0.5233966 0.6006983
Lag1 -0.073073746 0.05016739 -1.4565986 0.1452272
Lag2 -0.042301344 0.05008605 -0.8445733 0.3983491
Lag3 0.011085108 0.04993854 0.2219750 0.8243333
Lag4 0.009358938 0.04997413 0.1872757 0.8514445
Lag5 0.010313068 0.04951146 0.2082966 0.8349974
Volume 0.135440659 0.15835970 0.8552723 0.3924004
# CHỉ hiển thị cột thứ 4 là cột cho biết giá trị p-value của các hệ số
summary(glm.fits)$coef[,4]
(Intercept) Lag1 Lag2 Lag3 Lag4 Lag5 Volume
0.6006983 0.1452272 0.3983491 0.8243333 0.8514445 0.8349974 0.3924004
# Hàm predict dùng để dự đoán xác suất xu hướng thị trường sẽ đi lên (Directtion = Up), type = "response" để xuất ra xác xuất theo dạng P(Y = 1|X)
glm.probs=predict(glm.fits,type="response")
# Hàm contrast trả về những mã hoá mà R sử dụng cho những biến giả, biến giả ở đây là Up =1 khi direction = Up và Up = 0 khi direction = down
contrasts(Direction)
Up
Down 0
Up 1
# Xác xuất xu hướng thị trường sẽ đi lên (Direction = Up) cho 10 dòng đầu tiên của dữ liệu
glm.probs[1:10]
1 2 3 4 5 6 7 8 9 10
0.5070841 0.4814679 0.4811388 0.5152224 0.5107812 0.5069565 0.4926509 0.5092292 0.5176135 0.4888378
#Tạo một vecto gom 1250 thành phần down
glm.pred=rep("Down",1250)
#Chuyển các thành phần sang Up khi xác suất lớn hơn 0.5
glm.pred[glm.probs>.5]="Up"
# Dùng hàm table() để tạo ra một ma trận để quyết định xem có bao nhiêu quan sát được phân loại đúng, bao nhiêu bị phân loại sai
table(glm.pred,Direction)
Direction
glm.pred Down Up
Down 145 141
Up 457 507
Tỉ lệ số ngày dự đoán đúng = (507+145)/1250 = 0.5216
# Dự đoán %số ngày dự đoán đúng
mean(glm.pred==Direction)
[1] 0.5216
Hàm logistic dự đoán đúng 52,16% số ngày
#Vecto train gồm 1250 phần từ tương ướng với tập dữ liệu quan sát, dòng nào trong data có year <2005 sẽ trả về true, còn lại trả về false
train=(Year<2005)
# Tạo ra ma trận con của tập dữ liệu tương đương những giá trị sau năm 2005 trở về sau
Smarket.2005=Smarket [!train,]
# Bao gồm 252 số quan sát từ năm 2005 trở đi
dim(Smarket.2005)
[1] 252 9
# Tạo ra một vector gồm 252 giá trị Direction = Up hoặc Down từ năm 2005 trở đi
Direction.2005=Direction [!train]
# Thực hiện lại hồi qui logistic dựa trên tập huấn luyện (dữ liệu trước 2005) với subset =train (Year < 2005)
glm.fits = glm(Direction~Lag1 + Lag2 + Lag3 + Lag4 + Lag5
+ Volume , data=Smarket ,family = binomial,subset =train)
# Hàm predict dùng để dự đoán xác suất xu hướng thị trường sẽ đi lên (Directtion = Up) với tập data từ năm 2005 trở đi
glm.probs=predict(glm.fits,Smarket.2005,type="response")
#Tạo một vecto gom 252 thành phần down tương ứng với số quan sát từ năm 2005 trở đi
glm.pred=rep("Down",252)
#Chuyển các thành phần sang Up khi xác suất lớn hơn 0.5
glm.pred[glm.probs>.5]="Up"
# Dùng hàm table() để tạo ra một ma trận để quyết định xem có bao nhiêu quan sát được phân loại đúng, bao nhiêu bị phân loại sai
table(glm.pred,Direction.2005)
Direction.2005
glm.pred Down Up
Down 77 97
Up 34 44
Có 77 + 44 = 121 quan sát được phân loại đúng
Tỉ lệ số ngày dự đoán đúng = (77+44)/252 = 0.4801587
# Dự đoán %số ngày dự đoán đúng
mean(glm.pred==Direction.2005)
[1] 0.4801587
# Dự đoán %số ngày dự đoán sai: test eror
mean(glm.pred!=Direction.2005)
[1] 0.5198413
# Hàm summary(model1) sẽ cho chúng ta biết thông tin p-values, Z-value, độ lệch chuẩn cho những hệ số của các biến đầu vào
summary(glm.fits)
Call:
glm(formula = Direction ~ Lag1 + Lag2 + Lag3 + Lag4 + Lag5 +
Volume, family = binomial, data = Smarket, subset = train)
Deviance Residuals:
Min 1Q Median 3Q Max
-1.302 -1.190 1.079 1.160 1.350
Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept) 0.191213 0.333690 0.573 0.567
Lag1 -0.054178 0.051785 -1.046 0.295
Lag2 -0.045805 0.051797 -0.884 0.377
Lag3 0.007200 0.051644 0.139 0.889
Lag4 0.006441 0.051706 0.125 0.901
Lag5 -0.004223 0.051138 -0.083 0.934
Volume -0.116257 0.239618 -0.485 0.628
(Dispersion parameter for binomial family taken to be 1)
Null deviance: 1383.3 on 997 degrees of freedom
Residual deviance: 1381.1 on 991 degrees of freedom
AIC: 1395.1
Number of Fisher Scoring iterations: 3
Hàm summray cho biết thông tin về giá trị các hệ số của mô hình (B0->B6), thấy rằng Lag1 có hệ số nhỏ nhất = 0.295, tuy nhiên ở giá trị 0.295 vẫn là tương đối lớn, vì thế không có bằng chứng thống kê cho thấy rằng có mối quan hệ giữa Lag1 và biến đầu ra Direction.
#Thực hiện lại các bước với bộ dữ liệu chỉ có Lag1 và Lag 2 vì 2 biến này có p-value nhỏ nhất
glm.fits = glm (Direction~Lag1+Lag2,data=Smarket ,family =
binomial , subset =train)
# Hàm predict dùng để dự đoán xác suất xu hướng thị trường sẽ đi lên (Directtion = Up) với tập data từ năm 2005 trở đi
glm.probs=predict(glm.fits,Smarket.2005,type="response")
#Tạo một vecto gom 252 thành phần down tương ứng với số quan sát từ năm 2005 trở đi
glm.pred=rep("Down",252)
#Chuyển các thành phần sang Up khi xác suất lớn hơn 0.5
glm.pred[glm.probs>.5]="Up"
# Dùng hàm table() để tạo ra một ma trận để quyết định xem có bao nhiêu quan sát được phân loại đúng, bao nhiêu bị phân loại sai
table(glm.pred,Direction.2005)
Direction.2005
glm.pred Down Up
Down 35 35
Up 76 106
Có 35 + 106 = 141 quan sát được phân loại đúng
Tỉ lệ số ngày dự đoán đúng = (35+106)/252 = 0.5595238
# Dự đoán %số ngày dự đoán đúng
mean(glm.pred==Direction.2005)
[1] 0.5595238