Advertisement
edo99_

Untitled

Apr 24th, 2023
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
R 3.24 KB | None | 0 0
  1. #--- Motecarlo ---#
  2. library(glmnet)
  3. library(mvtnorm)
  4. library(Matrix)
  5. # Functions
  6.  
  7. high_correlation_matrix <- function(p) {
  8.   a = runif(1,0.1,0.9)
  9.   b = runif(1,0.1,0.9)
  10.   corr_min = min(a,b)
  11.   corr_max = max(a,b)
  12.  
  13.   Sigma <- diag(1, p)
  14.   Sigma[lower.tri(Sigma)] <- runif((p^2-p)/2, corr_min, corr_max)
  15.   Sigma[upper.tri(Sigma)] <- t(Sigma)[upper.tri(Sigma)]
  16.   Sigma
  17.   Sigma <- nearPD(Sigma, corr = TRUE, keepDiag = TRUE) # trova la matrice definita positiva più vicina alla matrice di input utilizzando l’algoritmo di Higham
  18.   Sigma$mat
  19.   return(list(matrix = Sigma$mat, mean_correlation = mean(Sigma$mat[upper.tri(Sigma$mat)]))) # restituisce matrice e correlazione media delle variabili
  20. }
  21.  
  22.  
  23. # Data generating process
  24. nsim <- 5 # numero simulazioni
  25. n <- 50 # numero osservazioni
  26. p <- 100 # numero varaibili indipendenti
  27. significative <- 20 # numero variabili indipendenti significative
  28. beta_value <- 8 # valore del coeff beta
  29. beta_vector <- c(rep(beta_value, significative), rep(0,p-significative)) # vettore dei beta
  30. sigma_X <- (1/n)^.5 # deviazione standard della distribuzione normale utilizzata per generare le variabili indipendenti
  31. sigma_epsilon <- 1 # deviazione standard della distribuzione normale utilizzata per generare l'errore
  32.  
  33. # mse_ols_list <- list()
  34. # mse_ridge_list <- list()
  35. # lambda_list <- list()
  36. # correlation_list <- list()
  37. df <- data.frame(correlation = numeric(0), mse_ols = numeric(0), mse_ridge = numeric(0), optimal_lambda = numeric(0))
  38.  
  39. for (i in 1:nsim){
  40.   set.seed(i+1)
  41.  
  42.   # Sigma1 <- clusterGeneration::rcorrmatrix(p, alphad=1) # matrice di varianza e covarianza che rappresenta appunto la correlazione tra le p variabili indipendenti
  43.   return <- high_correlation_matrix(p)
  44.   Sigma <- as.matrix(return[1]$matrix)
  45.   mean_corr <- return[2]
  46.   Sigma
  47.   mean_corr
  48.  
  49.   epsilon <- rnorm(n,0,sigma_epsilon) # genero l'errore da una normale N(0,1)
  50.   X <- mvtnorm::rmvnorm(n,sigma = Sigma) # genero la matrice di dati nxp, ogni riga rappresenta un'osservazione, ogni colonna una variabile indipendente
  51.   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
  52.  
  53.   # OLS Estimator
  54.   fit.ols <- lm(Y ~ X%*%beta_vector + epsilon)
  55.   stime_ols <- fit.ols$coefficients
  56.   stime_ols
  57.   # Scelgo il lambda ottimale mediante CV
  58.   cv.ridge <- cv.glmnet(x=X,y=Y,family="gaussian", alpha=0)
  59.   optimal_lambda <- cv.ridge$lambda.min
  60.   optimal_lambda
  61.  
  62.   # Ridge Estimator
  63.   fit.ridge <- glmnet(x=X,y=Y,family="gaussian", alpha=0, lambda = optimal_lambda)
  64.   stime_ridge <- fit.ridge$beta
  65.  
  66.   # MSE
  67.   mse_ols <- mean((stime_ols[-1] - beta_vector)^2) # il primo valore in stime_ols è l'intercetta (?)
  68.   mse_ridge <- mean((stime_ridge - beta_vector)^2)
  69.  
  70.   # Lists update
  71.   # mse_ols_list[[i]] <- mse_ols
  72.   # mse_ridge_list[[i]] <- mse_ridge
  73.   # lambda_list[[i]] <- optimal_lambda
  74.   # correlation_list[[i]] <- mean_corr
  75.  
  76.   new_row <- data.frame(correlation=mean_corr, mse_ols = mse_ols, mse_ridge = mse_ridge, optimal_lambda=optimal_lambda)
  77.   df <- rbind(df, new_row)
  78. }
  79.  
  80. library(ggplot2)
  81.  
  82. ggplot(df, aes(x = df$mean_correlation)) +
  83.   geom_line(aes(y = mse_ols), color = "red") +
  84.   geom_line(aes(y = mse_ridge), color = "blue")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement