L oop - LASSO Коэффициент извлечения из данных моделирования - PullRequest
0 голосов
/ 12 февраля 2020

Я пытаюсь найти, какие коэффициенты были должным образом и неоправданно сокращены до 0 из эксперимента LASSO на смоделированных данных. Я могу заставить его работать за одну итерацию, но я не знаю, как правильно l oop, чтобы я мог извлечь соответствующую информацию за 100 итераций. Вот мой текущий код

library(MASS)
library(glmnet)
N=100
n=200
p=200


set.seed(123)
f.non<-data.frame(NULL)
f.disc<-data.frame(NULL)

  X= mvrnorm(200, rep(0,p), diag(1,p,p))
  Y=rowSums(X[,1:10])+3.5*rnorm(n)
  lasso.model<-cv.glmnet(X,Y,alpha=1,intercept=FALSE)
  lasso.coef<-coef(lasso.model,s=lasso.model$lambda.1se)
  f.non<- sum(lasso.coef[2:11,] == 0)
  f.disc <- sum(lasso.coef[12:201,] != 0)

} 

Верхний блок был моей попыткой перебрать, настроив пустой фрейм данных, затем в l oop перехватывая результаты, но я не смог получить l oop на работу

1 Ответ

0 голосов
/ 12 февраля 2020

Поэтому, если я правильно понимаю (и я не уверен, что понимаю), вы пытаетесь извлечь значения (и имена?) Вашего lasso.coef объекта, в зависимости от того, равны ли они нулю или нет. .

Вы можете сделать это 100 раз в for l oop следующим образом (если вы хотите собрать имена переменных):

f.non <- c(NULL)
f.disc <- c(NULL)
N=100
for (i in 1:N) {
  n=200
  p=200
  X = mvrnorm(200, rep(0, p), diag(1, p, p))
  Y = rowSums(X[, 1:10]) + 3.5 * rnorm(n)
  lasso.model <- cv.glmnet(X, Y, alpha = 1, intercept = FALSE)
  lasso.coef <- coef(lasso.model, s = lasso.model$lambda.1se)
  # lasso_coefs <- lasso.coef[2:201]
  # setNames(lasso_coefs, paste("V", as.character(seq(2, 201, 1)), sep = ""))
  lasso_coefs_df <- data.frame(coef = lasso.coef[2:201], name = paste("V", as.character(seq(2,201,1)), sep = ""))

  # f.non[[i]] <- as.list(lasso_coefs[lasso_coefs == 0])
  # f.disc[[i]] <- as.list(lasso_coefs[lasso_coefs != 0])
  f.non[[i]] <- lasso_coefs_df[lasso_coefs_df$coef == 0, ]
  f.disc[[i]] <- lasso_coefs_df[lasso_coefs_df$coef != 0, ]
}

В противном случае и многое другое аналогично вашей попытке, если вы просто хотите получить суммы для каждого диапазона переменных (2-11, 12-201):

f.non <- c(NULL)
f.disc <- c(NULL)
N=100
for (i in 1:N) {
  n=200
  p=200
  X = mvrnorm(200, rep(0, p), diag(1, p, p))
  Y = rowSums(X[, 1:10]) + 3.5 * rnorm(n)
  lasso.model <- cv.glmnet(X, Y, alpha = 1, intercept = FALSE)
  lasso.coef <- coef(lasso.model, s = lasso.model$lambda.1se)
  f.non[[i]] <- sum(lasso.coef[2:11,] == 0)
  f.disc[[i]] <- sum(lasso.coef[12:201,] != 0)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...