微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

R中的复杂复制函数

如何解决R中的复杂复制函数

我在 R 中有一个代码,它最终产生一个名为 sigma 的向量和 3 个子集,即 sub1.sigmasb2.sigmasub3.sigma。我想将此过程复制 n 次,假设为 10 次,然后观察上述向量的值。我正在使用复制功能如下

set.seed(2021)

code <- replicate(10,{
data<-matrix(rnorm(100*5,mean=0,sd=1),100,5) 
colnames(data) <- c("X1","X2","X3","X4","X5")
data <- as.data.frame(data)
a <- 5 
b <- 0.8
c <- 100

data[,2] <- a*data[,1] - b*rnorm(c)
data[,3] <- a*data[,1] + b*rnorm(c)
data[,4] <- a*data[,1] - b*rnorm(c)

library(glmnet)
library(coefplot)

A <- as.matrix(data)
set.seed(1)
results <- lapply(seq_len(ncol(A)),function(i) {
  list(
    cvfit = cv.glmnet(A[,-i],A[,i],standardize = TRUE,type.measure = "mse",nfolds = 10,alpha = 1)
  )
})

lam <- as.data.frame(`names<-`(
  lapply(results,function(x) (x$cvfit$lambda.min)),paste0("X",seq_along(results))
))

sigma<- matrix(rnorm(1*5,1,5) 
colnames(sigma) <- c("X1","X5")
as.vector(sigma)
sub1.sigma <- subset(sigma,select = sigma <= sum(lam))
sub2.sigma <- subset(sigma,select = sigma <= 2*sum(lam))
sub3.sigma <- subset(sigma,select = sigma <= 3*sum(lam))
},simplify = FALSE)

code[1:10]

以上产生以下结果,我无法弄清楚它们对应什么。是 sigma 还是 sub.sigma。我想在每次复制运行的每一行中创建 4 个包含 sigmasub1.sigmasb2.sigmasub3.sigma 值的数据帧。我怎样才能在 R 中实现这一点?我应该使用另一个循环函数吗?

> code[1:10]
[[1]]
            X1        X4        X5
[1,] 0.8032832 0.6772685 0.3799627

[[2]]
            X1        X4        X5
[1,] 0.8032832 0.6772685 0.3799627

[[3]]
            X1        X4        X5
[1,] 0.8032832 0.6772685 0.3799627

[[4]]
            X1        X4        X5
[1,] 0.8032832 0.6772685 0.3799627

[[5]]
            X1        X4        X5
[1,] 0.8032832 0.6772685 0.3799627

[[6]]
            X1        X4        X5
[1,] 0.8032832 0.6772685 0.3799627

[[7]]
            X1        X4        X5
[1,] 0.8032832 0.6772685 0.3799627

[[8]]
            X1        X4        X5
[1,] 0.8032832 0.6772685 0.3799627

[[9]]
            X1        X4        X5
[1,] 0.8032832 0.6772685 0.3799627

[[10]]
            X1        X4        X5
[1,] 0.8032832 0.6772685 0.3799627

解决方法

由于您没有从 replicate 返回任何内容,因此它返回的是代码 sub3.sigma 的最后一行。您可以返回输出列表。

library(glmnet)
library(coefplot)
set.seed(2021)

code <- replicate(10,{
  data<-matrix(rnorm(100*5,mean=0,sd=1),100,5) 
  colnames(data) <- c("X1","X2","X3","X4","X5")
  data <- as.data.frame(data)
  a <- 5 
  b <- 0.8
  c <- 100
  
  data[,2] <- a*data[,1] - b*rnorm(c)
  data[,3] <- a*data[,1] + b*rnorm(c)
  data[,4] <- a*data[,1] - b*rnorm(c)
  
  A <- as.matrix(data)
  set.seed(1)
  results <- lapply(seq_len(ncol(A)),function(i) {
    list(
      cvfit = cv.glmnet(A[,-i],A[,i],standardize = TRUE,type.measure = "mse",nfolds = 10,alpha = 1)
    )
  })
  
  lam <- as.data.frame(`names<-`(
    lapply(results,function(x) (x$cvfit$lambda.min)),paste0("X",seq_along(results))
  ))
  
  sigma<- matrix(rnorm(1*5,1,5) 
  colnames(sigma) <- c("X1","X5")
  sub1.sigma <- subset(sigma,select = sigma <= sum(lam))
  sub2.sigma <- subset(sigma,select = sigma <= 2*sum(lam))
  sub3.sigma <- subset(sigma,select = sigma <= 3*sum(lam))
  dplyr::lst(sigma,sub1.sigma,sub2.sigma,sub3.sigma)
  
},simplify = FALSE)

要将数据帧合并到它自己的列表中,您可以使用:

result <- lapply(purrr::transpose(code),function(x) do.call(rbind,x))

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。