Advertisement
edo99_

Untitled

Apr 24th, 2023
118
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
R 5.18 KB | None | 0 0
  1.  
  2.  
  3.  
  4.  
  5. #--- Motecarlo ---#
  6. library(glmnet)
  7. library(mvtnorm)
  8. library(Matrix)
  9. # Functions
  10.  
  11. correlation_matrix <- function(p) {
  12.   a = runif(1,0.1,0.9)
  13.   b = runif(1,0.1,0.9)
  14.   corr_min = min(a,b)
  15.   corr_max = max(a,b)
  16.  
  17.   Sigma <- diag(1, p)
  18.   Sigma[lower.tri(Sigma)] <- runif((p^2-p)/2, corr_min, corr_max)
  19.   Sigma[upper.tri(Sigma)] <- t(Sigma)[upper.tri(Sigma)]
  20.   Sigma
  21.   Sigma <- nearPD(Sigma, corr = TRUE, keepDiag = TRUE) # trova la matrice definita positiva più vicina alla matrice di input utilizzando l’algoritmo di Higham
  22.   Sigma$mat
  23.   return(list(matrix = Sigma$mat, mean_correlation = mean(Sigma$mat[upper.tri(Sigma$mat)]))) # restituisce matrice e correlazione media delle variabili
  24. }
  25.  
  26.  
  27. # Data generating process
  28. nsim <- 500 # numero simulazioni
  29. n <- 200 # numero osservazioni
  30. p <- 100 # numero varaibili indipendenti
  31. significative <- 20 # numero variabili indipendenti significative
  32. beta_vector <- runif(p,-5,5)
  33. # beta_value <- 8 # valore del coeff beta
  34. # beta_vector <- c(rep(beta_value, significative), rep(0,p-significative)) # vettore dei beta
  35. sigma_X <- (1/n)^.5 # deviazione standard della distribuzione normale utilizzata per generare le variabili indipendenti
  36. sigma_epsilon <- 1 # deviazione standard della distribuzione normale utilizzata per generare l'errore
  37.  
  38. df <- data.frame(mean_sigma_inv = numeric(0), mean_correlation = numeric(0), determinant = numeric(0), mse_ols = numeric(0), mse_ridge = numeric(0), optimal_lambda = numeric(0))
  39.  
  40. for (i in 1:nsim){
  41.   set.seed(i+1)
  42.  
  43.   # Sigma <- clusterGeneration::rcorrmatrix(p, alphad=1) # matrice di varianza e covarianza che rappresenta appunto la correlazione tra le p variabili indipendenti
  44.   res <- correlation_matrix(p)
  45.   Sigma <- as.matrix(res[1]$matrix)
  46.   mean_corr <- res[2]
  47.   Sigma
  48.   mean_corr
  49.  
  50.   # Multicollinearità
  51.   determinant <- det(Sigma) # http://www.stat.unipg.it/~bart/metodi/lezione14.pdf Quando c’è una forte correlazione tra due o più variabili esplicative in un modello di regressione, il determinante della matrice di varianza e covarianza può diventare molto piccolo
  52.   Sigma_inv <- solve(Sigma) # Matrice inversa
  53.   mean_sigma_inv <- mean(Sigma_inv[upper.tri(Sigma_inv)])
  54.   mean_sigma_inv
  55.  
  56.   epsilon <- rnorm(n,0,sigma_epsilon) # genero l'errore da una normale N(0,1)
  57.   X <- mvtnorm::rmvnorm(n,sigma = Sigma) # genero la matrice di dati nxp, ogni riga rappresenta un'osservazione, ogni colonna una variabile indipendente
  58.   Y <- X%*%beta_vector + epsilon # genero la variabile dipendente come combinazione lineare delle X e del vettore dei beta con l'aggiunta di un errore
  59.  
  60.   # OLS Estimator
  61.   fit.ols <- lm(Y ~ X)
  62.   summary(fit.ols)
  63.   stime_ols <- fit.ols$coefficients
  64.   stime_ols
  65.  
  66.   # Scelgo il lambda ottimale mediante CV
  67.   cv.ridge <- cv.glmnet(x=X,y=Y,family="gaussian", alpha=0)
  68.   # cv.ridge <- cv.glmnet(x[train,],y[train], nfolds = 10, type.measure = "mse",alpha=0)
  69.   # plot(cv.ridge)
  70.   optimal_lambda <- cv.ridge$lambda.min
  71.   optimal_lambda
  72.  
  73.   # Ridge Estimator
  74.   fit.ridge <- glmnet(x=X,y=Y,family="gaussian", alpha=0, lambda = optimal_lambda)
  75.   stime_ridge <- fit.ridge$beta
  76.  
  77.   # MSE
  78.   mse_ols <- mean((stime_ols[-1] - beta_vector)^2) # il primo valore in stime_ols è l'intercetta (?)
  79.  
  80.   mse_ridge <- mean((stime_ridge - beta_vector)^2)
  81.  
  82.   new_row <- data.frame(mean_sigma_inv=mean_sigma_inv,mean_correlation=mean_corr, determinant = determinant, mse_ols = mse_ols, mse_ridge = mse_ridge, optimal_lambda=optimal_lambda)
  83.   df <- rbind(df, new_row)
  84. }
  85.  
  86.  
  87. library(ggplot2)
  88. plot(df$mean_correlation, df$mse_ols)
  89. plot(df$mean_correlation, df$mse_ridge)
  90.  
  91. ggplot(df, aes(x = df$determinant)) +
  92.   geom_point(aes(y = df$determinant), color = "red", alpha=0.7) +
  93.   scale_y_log10()
  94.  
  95. ggplot(df, aes(x = df$mean_correlation)) +
  96.   geom_point(aes(y = df$mse_ols), color = "red", alpha=0.7) +
  97.   geom_point(aes(y = df$mse_ridge), color = "blue",alpha=0.3) +
  98.   geom_smooth(aes(y = df$mse_ols), color = "red", alpha=0.7) +
  99.   geom_smooth(aes(y = df$mse_ridge), color = "blue",alpha=0.3) +
  100.   scale_y_log10()
  101.  
  102.  
  103. ggplot(df, aes(x = df$mean_sigma_inv)) +
  104.   geom_point(aes(y = df$mse_ols), color = "red", alpha=0.7) +
  105.   geom_point(aes(y = df$mse_ridge), color = "blue",alpha=0.3) +
  106.   geom_smooth(aes(y = df$mse_ols), color = "red", alpha=0.7) +
  107.   geom_smooth(aes(y = df$mse_ridge), color = "blue",alpha=0.3) +
  108.   scale_y_log10()
  109.  
  110. ggplot(df, aes(x = df$determinant)) +
  111.   geom_point(aes(y = df$mse_ols), color = "red", alpha=0.7) +
  112.   geom_point(aes(y = df$mse_ridge), color = "blue",alpha=0.3) +
  113.   geom_smooth(aes(y = df$mse_ols), color = "red", alpha=0.7) +
  114.   geom_smooth(aes(y = df$mse_ridge), color = "blue",alpha=0.3)
  115.  
  116. ggplot(df, aes(x = df$mean_correlation)) +
  117.   geom_point(aes(y = df$optimal_lambda), color = "red", alpha=0.7) +
  118.   geom_smooth(aes(y = df$optimal_lambda), color = "red",alpha=0.3) +
  119.   scale_y_log10()
  120.  
  121. ggplot(df, aes(x = df$mean_sigma_inv)) +
  122.   geom_point(aes(y = df$optimal_lambda), color = "red", alpha=0.7) +
  123.   geom_smooth(aes(y = df$optimal_lambda), color = "red",alpha=0.3) +
  124.   scale_y_log10()
  125.  
  126.  
  127. # La multicollinearità va guardata sull'inversa
  128. # Posso calcolare il determinante della matrie inversa per capire il livello di correlazione
  129.  
  130.  
  131.  
  132.  
  133.  
  134.  
  135.  
  136.  
  137.  
  138.  
  139.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement