Muhammad Ghozy Al Haqqoni / 16.9293
Terdapat 5 asumsi regresi yang menentukan apakah regresi linear dapat dilakukan : 1. Normalitas 2. Linearitas 3. Multikolinearitas 4. Autokolinearitas 5. Heteroskedastisitas
Data dibangkitkan menggunakan fungsi pembangkit data. Data yang digunakan adalah data berdistribusi normal serta gamma untuk perwakilan data berdistribusi tidak normal.
set.seed(Sys.Date())
#diambil dari distribusi uniform (0,1)
#fungsi dengan runif
get_normStd <- function(n) {
u1<-runif(n, 0,1)
u2<-runif(n, 0,1)
#using box-muller transformation
z1<-sqrt(-2*log(u1))*cos(2*pi*u2)
return(z1)
}
#test using shaprio-wilk test
# where Null Hypothesis = Normal, def alpha = 5%
Z_runif <- get_normStd(100)
data.frame(Z_runif) %>%
ggplot2::ggplot(aes(Z_runif))+
geom_density(color="black", fill="lightgreen") +
labs(title="Distribusi Normal",x="Z-value", y = "Density") +
theme_minimal()
shapiro.test(Z_runif)
Shapiro-Wilk normality test
data: Z_runif
W = 0.98896, p-value = 0.581
Dengan tingkat signifikansi 5% peneliti mempunyai cukup bukti untuk menyatakan bahwa distribusi data tersebut berdistribusi normal.
get_chiSqr <- function(n, df) {
#penyesuaian normal standard (z) ke chisquare (z^2)
set.seed(Sys.Date())
chi<- rep(0, 100)
for(i in c(1:df)){
u1<-runif(n,0,1)
u2<-runif(n,0,1)
z1<-sqrt(-2*log(u1))*cos(2*pi*u2)
z<-z1
x<-z^2
chi<-chi+x
}
return(chi)
}
#test
df <- 2
xx1 <- get_chiSqr(100,df)
data.frame(xx1) %>%
ggplot2::ggplot(aes(xx1))+
geom_density(color="black", fill="pink") +
labs(title="Distribusi Chi-Square",x="chisqr-value", y = "Density") +
theme_minimal()
shapiro.test(xx1)
Shapiro-Wilk normality test
data: xx1
W = 0.84801, p-value = 1.002e-08
Dengan tingkat signifikansi 5% peneliti tidak mempunyai cukup bukti untuk menyatakan bahwa distribusi data tersebut berdistribusi normal.
Uji normalitas bertujuan untuk menguji apakah dalam model regresi, variabel penggangu atau residual memiliki distribusi normal. Jika asumsi ini dilanggar, maka uji statistik menjadi tidak valid atau bias terutama untuk sampel kecil. Uji normalitas dapat dilakukan melalui dua pendekatan yaitu melalui pendekatan grafik (histogram dan P-P Plot) atau uji kolmogorov-smirnov, chi-square, Liliefors maupun Shapiro-Wilk.
residual_normal <- Z_runif #residual berdistribusi N(0,1)
x <- runif(100, min = 1, max = 10)
b <- c(1,2.7)
independen <- model.matrix(~x)
y <- independen %*% b + residual_normal
model <- lm(y~x) #Membuat Model persamaan
residu <- resid(model) #Mengambil nilai residu dari persamaan
data.frame(residu) %>%
ggplot2::ggplot(aes(residu))+
geom_density(color="black", fill="lightgreen") +
labs(title="Distribusi Residu",x="x", y = "Density") +
theme_minimal() #plot bukti bahwa residu berdistribusi normal
shapiro.test(residu) #uji shapiro membuktikan bahwa pvalue >0.05 (residu berdistribusi Normal)
Shapiro-Wilk normality test
data: residu
W = 0.98856, p-value = 0.5503
data_normal <- data.frame(y,x) #menyimpan hasil
residual_chisqr <- xx1
y <- independen %*% b + residual_chisqr
model <- lm(y~x) #Membuat Model persamaan
residu <- resid(model) #Mengambil nilai residu dari persamaan
data.frame(residu) %>%
ggplot2::ggplot(aes(residu))+
geom_density(color="black", fill="pink") +
labs(title="Distribusi Residu",x="x", y = "Density") +
theme_minimal() #plot bukti bahwa residu tidak berdistribusi normal
shapiro.test(residu) #uji shapiro membuktikan bahwa pvalue <0.05 (Tidak Normal)
Shapiro-Wilk normality test
data: residu
W = 0.86144, p-value = 3.215e-08
data_tidak_normal <- data.frame(y,x) #menyimpan hasil
set.seed(Sys.Date())
efekNormalitas <- function(data_normal, data_tidak_normal){
count_normal <- 0
for (i in 1:100) {
test <- lm(y~x , data = data_normal %>% dplyr::sample_n(10, F))
test <- summary(test)
p_value <- test$coefficients[2,4] #cek apabila tidak signifikan maka count+1
if(p_value > 0.05) {
count_normal <- count_normal + 1
}
}
count_tidak_normal <- 0
for (i in 1:100) {
test <- lm(y~x , data = data_tidak_normal %>% dplyr::sample_n(10, F))
test <- summary(test)
p_value <- test$coefficients[2,4] #cek apabila tidak signifikan maka count+1
if(p_value > 0.05) {
count_tidak_normal <- count_tidak_normal + 1
}
}
hasil <- data.frame(count_normal, count_tidak_normal)
return(hasil)
}
efekNormalitas(data_normal, data_tidak_normal)
*Kesimpulan: Count_normal hasilnya 0, sehingga apabila asumsi normalitas terpenuhi, maka variabel x selalu signifikan. Sedangkan, count_tidak_normal hasilnya >0, maka tidak normalitas akan menyebabkan variabel x bisa tidak signifikan.
Uji linearitas bertujuan untuk mengetahui apakah dua variabel mempunyai hubungan yang linear atau tidak secara signifikan. Jika tidak signifikan, artinya hubungan tidak linear, residu tidak normal, secara tak langsung juga melanggar asumsi normalitas.
set.seed(Sys.Date())
residual_linear <- Z_runif #residual berdistribusi N(0,1)
x <- runif(100,0,1)
b <- c(1,1.3)
independen <- model.matrix(~x)
y <- independen %*% b + residual_linear
data_linear <- data.frame(y,x)
data_linear %>%
ggplot(aes(x,y)) +
geom_point(color='darkblue') +
ggtitle("y =", y) +
theme_minimal()
set.seed(Sys.Date())
x <- runif(100,-7,7)
y <- cos(x) - 10
data_non_linear <- data.frame(y,x)
data_non_linear %>%
ggplot(aes(x,y)) +
geom_point(color='darkblue') +
ggtitle("y =", y) +
theme_minimal()
#meangambil residual
linearModel <- lm(y~x, data_linear)
nonLinearModel <- lm(y~x, data_non_linear)
linearResidu <- resid(linearModel)
nonLinearResidu <- resid(nonLinearModel)
data.frame(linearResidu) %>%
ggplot2::ggplot(aes(linearResidu))+
geom_density(color="black", fill="lightgreen") +
labs(title="Distribusi linearResidu",x="x", y = "Density") +
theme_minimal()
data.frame(nonLinearResidu) %>%
ggplot2::ggplot(aes(nonLinearResidu))+
geom_density(color="black", fill="pink") +
labs(title="Distribusi nonLinearResidu",x="x", y = "Density") +
theme_minimal()
shapiro.test(linearResidu)
Shapiro-Wilk normality test
data: linearResidu
W = 0.98782, p-value = 0.4947
shapiro.test(nonLinearResidu)
Shapiro-Wilk normality test
data: nonLinearResidu
W = 0.90154, p-value = 1.671e-06
Multikolinearitas muncul jika terdapat hubungan yang sempurna atau pasti di antara beberapa atau semua variabel independen dalam model. Terdapat beberapa metode untuk mendeteksi keberadaan multikolinearitas (Gujarati, 1995;Ramanathan, 1995). Untuk mendeteksi multikolinearitas digunakan pengukuran terhadap nilai VIF (Variable Inflation Factor) dan nilai Tolerance.
res_multikol <- Z_runif
x1 <- runif(100, 0, 1)
b <- c(1,2.7)
independen <- model.matrix(~x1)
x2 <- independen %*% b + res_multikol
b <- c(1,1.2,1.7)
independen <- model.matrix(~x1+x2)
y <- independen%*%b + res_multikol
data_multikol <- data.frame(y,x1,x2)
data_cor <- cor(data_multikol)
korelasi <- function(data_cor){
hasil <- data_cor %>% corrplot::corrplot(method="color",
type="upper",
order="hclust",
addCoef.col = "black",
tl.col="black",
insig = "blank",
diag=FALSE)
return(hasil)
}
korelasi(data_cor)
x1 y x2
x1 1.0000000 0.4702420 0.5648252
y 0.4702420 1.0000000 0.9938838
x2 0.5648252 0.9938838 1.0000000
res_non_multikol <- Z_runif
x1 <- runif(100, 1, 10)
x2 <- runif(100, 0, 5)
b <- c(1,2.7,3.5)
independen <- model.matrix(~x1+x2)
y <- independen%*%b + res_non_multikol
data_no_multikol <- data.frame(y,x1,x2)
corr <- cor(data_no_multikol)
korelasi(corr)
x2 y x1
x2 1.0000000 0.6570779 0.1201982
y 0.6570779 1.0000000 0.8180143
x1 0.1201982 0.8180143 1.0000000
#Kita lihat konsistensi tanda + - pada koefisiennya
konsistensiMultikol <- function(data_mul_or_not){
x1_minus <- 0
x2_minus <- 0
for (i in 1:100) {
tes <- lm(y~x1+x2 , data = data_mul_or_not %>% sample_n(10, F))
tes <- summary(tes)
koefx1 <- tes$coefficients[2]
koefx2 <- tes$coefficients[3]
if(koefx1 < 0) {
x1_minus <- x1_minus + 1
}
if(koefx2 < 0) {
x2_minus <- x2_minus + 1
}
}
return(data.frame(x1_minus, x2_minus))
}
#untuk data multikol
konsistensiMultikol(data_multikol)
#untuk data tak multikol
konsistensiMultikol(data_no_multikol)
Data yang tidak mengalami multikolinearitas memiliki konsistensi pada variabel-variabelnya.
Autokorelasi adalah korelasi antara anggota serangkaian observasi yang diurutkan menurut waktu seperti data deret waktu atau ruang seperti data cross-section. Autokorelasi yang kuat dapat menyebabkan dua variabel yang tidak berhubungan menjadi berhubungan. Biasa disebut spourious regression. Untuk mengetahui autokorelasi digunakan uji Durbin-Watson (DW-test). Adanya autokorelasi dalam regresi dapat diketahui dengan menggunakan beberapa cara antara lain metode grafik (ACF) dan uji Durbin-Watson.
res_autokol <- seq(1,10.9,
by = .5)
x <- runif(100, 0,1)
b <- c(1,2.7)
independen <- model.matrix(~x)
y <- independen %*% b + res_autokol
data_autokol <- data.frame(y,x)
model_autokol <- lm(y~x, data = data_autokol)
res <- resid(lm(y~x, data = data_autokol))
acf(res)
lmtest::dwtest(model_autokol)
Durbin-Watson test
data: model_autokol
DW = 0.46457, p-value = 4.917e-15
alternative hypothesis: true autocorrelation is greater than 0
res_non_autokol <- Z_runif
x <- runif(100,0,1)
b <- c(1,2.7)
independen <- model.matrix(~x)
y <- independen %*% b + res_non_autokol
data_non_autokol <- data.frame(y,x)
model_non_autokol <- lm(y~x, data = data_non_autokol)
res <- resid(model_non_autokol)
acf(res)
lmtest::dwtest(model_non_autokol)
Durbin-Watson test
data: model_non_autokol
DW = 1.8998, p-value = 0.3049
alternative hypothesis: true autocorrelation is greater than 0
predict(model_autokol,data_autokol) %>% head(7)
1 2 3 4 5 6 7
7.705781 9.526169 6.899705 6.751222 6.687397 9.072762 9.089097
predict(model_non_autokol,data_non_autokol) %>% head(7)
1 2 3 4 5 6 7
3.253183 3.139747 2.549803 2.853409 1.950185 3.801643 3.236872
r_sqr <- function(data, model){
actual <- data$y #varians data autokol
preds <- predict(model)#prediksi model
rss <- sum((preds - actual) ^ 2) ## residual sum of squares
tss <- sum((actual - mean(actual)) ^ 2) ## total sum of squares
return(1 - rss/tss)
}
r_sqr(data_autokol, model_autokol)
[1] 0.09874248
r_sqr(data_non_autokol, model_non_autokol)
[1] 0.4683949
Tidak dijumpai nilai R-squared yang tinggi antara kedua data yang telah disimulasikan, akan tetapi, data yang berautokorelasi, mempunyai pengaruh variabel lag waktu sebelumnya terhadap variabel Y, terlihat dari grafik ACF yang berpola sekuensial. Sehingga dapat memengaruhi prediksi dari sebuah model regresi.
Dalam regresi linear salah satu yang harus dipenuhi agar taksiran parameter dalam model tersebut bersifat BLUE (Best, Linear, Unbiased, and Estimator), dimana var (ui) = \(σ^2\) mempunyai variasi yang sama. Pada kasus-kasus tertentu terjadi variasi ui tidak konstan atau variabel berubah-ubah. Untuk mendeteksi heteroskedastisitas dapat dilakukan pengujian dengan metode grafik.
Dengan pengujian ini dapat dideteksi apakah kesalahan pengganggu dari model yang diamati tidak memiliki varians yang konstan dari satu observasi ke observasi lainnya. Dengan metode grafik, hasilnya dapat menunjukkan ada tidaknya pola-pola tertentu yang terbentuk seperti bergelombang, melebar kemudian menyempit serta titik-titik menyebar di atas dan di bawah angka 0 (nol) pada sumbu Y.
res_homo <- Z_runif
x <- runif(100, 0, 1)
b <- c(1,2.7)
independen <- model.matrix(~x)
y <- independen %*% b + res_homo
model <- lm(y~x)
resid <- resid(model)
plot(resid, col = "#009999", lwd=7)
data_homo <- data.frame(y,x)
sd <- 1:250
res_hetero <- rnorm(n=100, mean = sd, sd=.2*sd)
x <- runif(100,1,2)
b <- c(1,2.7)
independen <- model.matrix(~x)
y <- independen %*% b + res_hetero
model <- lm(y~x)
residu <- resid(model)
plot(residu,col = "#009999", lwd=7)
data_hetero <- data.frame(y,x)
set.seed(Sys.Date())
compare_se <- function(data_homo, data_hetero){
stdeHOMO <- NULL
for (i in 1:100) {
tesHo <- lm(y~x , data_homo %>% dplyr::sample_n(10,replace = FALSE))
stdeHOMO <- c(stdeHOMO, sqrt(deviance(tesHo)/df.residual(tesHo)))
}
SE_homo <- var(stdeHOMO)
stdeHETERO <- NULL
for (i in 1:100) {
tesHe <- lm(y~x , data = data_hetero %>% dplyr::sample_n(10,replace = FALSE))
stdeHETERO <- c(stdeHETERO,sqrt(deviance(tesHe)/df.residual(tesHe)))
}
SE_hetero <- var(stdeHETERO)
hasil <- data.frame(SE_homo, SE_hetero)
return(hasil)
}
compare_se(data_homo, data_hetero)
Standard error residual heteroskedastis tinggi bila dibandingkan dengan yang homoskedastis. Selain itu, residual yang heteroskedastis akan menyebabkan hasil yang over/under estimate, jika ditinjau dari grafik yang ada pada poin hetero, hasil yang didapat kemungkinan besar akan overestimate, karena grafik semakin melebar ke kanan sepanjang t (waktu).