【问题标题】:R lapply on list of vectors; extracting vector elements to use in functionR lapply 在向量列表上;提取向量元素以在函数中使用
【发布时间】:2014-02-03 21:05:20
【问题描述】:

我有一个向量列表,对于列表中的每个向量,我想提取元素并将它们的值用作函数中的参数。以下是我迄今为止提出的总体思路。

#Function to convert parametric values (stored in vector) to multivariate normal random data

ParamsToDat = function(X){
  vec = X
  MultN = rmvnorm(vec[4],c(vec[2],vec[3],matrix(c(vec[5],vec[1],vec[1],vec[6]), 2, 2, byrow = FALSE)))
  return(MultN)
}



# Create list of randomly generated matrices based on parameters

GenData = function(MeanPre,MeanPost,Cov,SampSize,SampSD,IndVar1,IndVar2){

  #Use GenParams function to generate list of vectors each of length 6
  Params = GenParams(MeanPre,MeanPost,Cov,SampSize,SampSD,IndVar1,IndVar2)

  #Use lapply function to create list of matrices of multivariate normal data
  MatList = lapply(X = Params, FUN = ParamsToDat)

  MultN = list(Matlist = Matlist, Params = Params)

  return(MultN)

}

列表 Params 中的每个元素都是一个长度为 6 的向量。我希望函数 ParamsToDat 提取列表中向量的元素并将它们用作参数来生成多元法线数据矩阵。此矩阵将替换从中派生值的向量。

很明显,我的 ParamsToDat 函数或 lapply 函数或两者都搞砸了,因为它不起作用。有什么想法我可以做到这一点吗?

【问题讨论】:

  • 您应该提供reproducible example。这将使您更有可能得到答案。在这种情况下,您应该包含 library(mvtnorm) 以及 GenParams() 函数、您遇到的错误,以及对您的 GenData() 函数的示例调用。

标签: r vector lapply


【解决方案1】:

主要问题是R区分大小写,所以行

MultN = list(Matlist = Matlist, Params = Params)

应该是

MultN = list(Matlist = MatList, Params = Params)

请注意,我将 Matlist 更改为 MatList

我认为放错位置的) 仍然会给你一个不会导致行错误的问题

MultN = rmvnorm(vec[4],c(vec[2],vec[3],matrix(c(vec[5],vec[1],vec[1],vec[6]), 2, 2, byrow = FALSE)))

我猜你真的想要

MultN = rmvnorm(vec[4],c(vec[2],vec[3]),matrix(c(vec[5],vec[1],vec[1],vec[6]), 2, 2, byrow = FALSE))

在您的代码中,您花时间创建了一个看起来应该是调用rmvnorm() 中的方差-协方差矩阵的矩阵,但放错位置的) 会将其转回向量,因此虽然您可能期望有两个均值和一个有趣的方差-协方差矩阵,但您最终会得到六个均值和一个diag(6) 的方差-协方差矩阵。

希望这会有所帮助。祝你好运!

【讨论】:

  • 是的,这是有道理的。我想我在做这个的时候已经很累了。这是我修复它的方法。
【解决方案2】:

这是我的解决方案。感谢您的回复。

### This function accepts a vector of length six and converts it to bivariate normal data ###
VecToNorm = function(vec){
  BivNorm = abs(round(rmvnorm(vec[4],c(vec[2],vec[3]),matrix(c(vec[5],vec[1],vec[1],vec[6]), 2, 2, byrow = FALSE))))
  return(BivNorm)
}


### Function to convert parametric values from list of vectors to multivariate normal random data ###
ParamsToDat2 = function(Params){
  Data = lapply(Params, FUN = VecToNorm)
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-23
    • 1970-01-01
    • 2018-09-25
    • 2013-07-12
    • 2014-12-15
    • 2021-06-27
    • 1970-01-01
    相关资源
    最近更新 更多