如何将我的函数的参数传递给 mvrnorm?

Posted

技术标签:

【中文标题】如何将我的函数的参数传递给 mvrnorm?【英文标题】:How to pass arguments of my functions to mvrnorm? 【发布时间】:2022-01-19 02:21:40 【问题描述】:

我正在用 2 个高斯模型做高斯混合模型。为此,我使用“mvrnorm”,但出现以下错误:

Error in mvrnorm(r.mixture.gaussian1) : argument "mu" is missing, with no default

如何将函数的参数传递给 mvrnorm?

特别是我在此行调用函数时遇到的错误:X1_distribution=mvrnorm(r.mixture.gaussian1) 以及X2_distribution 函数。

#Define constants
rho = 0.5
n=100
mu11=c(-1,4) 
mu12=c(1,6)
mu21=c(6,1) 
mu22=c(8,3)

#2 functions used in X1_distribution and X2_distribution are defined
r.mixture.gaussian1= function(n, mu, Sigma)
  X = cbind(rep(0, n), rep(0, n))
  for(i in 1:n)
    u = runif(1, min = 0, max = 1)
    if(u < rho)
      X[i,] = mvrnorm(1, mu = mu11, Sigma = Sigma)
    else
      X[i,] = mvrnorm(1, mu = mu12, Sigma = Sigma)
    
  

r.mixture.gaussian2= function(n, mu, Sigma)
  X = cbind(rep(0, n), rep(0, n))
  for(i in 1:n)
    u = runif(1, min = 0, max = 1)
    if(u < rho)
      X[i,] = mvrnorm(1, mu = mu21, Sigma = Sigma)
    else
      X[i,] = mvrnorm(1, mu = mu22, Sigma = Sigma)
    
  


Sigma= matrix(c(1,0.5,0.5,1),ncol=2) 
Sigma <- make.positive.definite(Sigma, tol=1e-3)
set.seed(1234)
X1_distribution=mvrnorm(r.mixture.gaussian1)
mu1=rho*mu11+(1-rho)*mu12

Sigma= matrix(c(1,0.5,0.5,1),ncol=2) 
Sigma <- make.positive.definite(Sigma, tol=1e-3)
set.seed(120)
X2_distribution=mvrnorm(r.mixture.gaussian2)
mu2=rho*mu21+(1-rho)*mu22

X=rbind(X1_distribution,X2_distribution)         
plot(density(X))

【问题讨论】:

1) 您使用参数mu 定义混合函数,但该参数未在函数主体中使用,您有mu11 等。2) 这没有意义完全没有:mvrnorm(r.mixture.gaussian1)。电话应该是r.mixture.gaussian1(n, mu, Sigma) 【参考方案1】:

我没有使用我创建的函数,而是直接使用了函数内部的内容,并且效果很好。例如X1_distribution,如下:

mu11=c(-6,4) 
mu12=c(-2,6)
Sigma= matrix(c(1,0.5,0.5,1),ncol=2) 
Sigma <- make.positive.definite(Sigma, tol=1e-3)
set.seed(1234+j)
for(k in 1:n)
  u = runif(1, min = 0, max = 1)
  if(u < rho)
    X1_distribution[k,] = mvrnorm(1, mu = mu11, Sigma = Sigma)
  else
    X1_distribution[k,] = mvrnorm(1, mu = mu12, Sigma = Sigma)
  

X2_distribution 也是如此。更改 mu11mu12 并在上面写着 X1_distribution 的地方输入 X2_distribution

【讨论】:

以上是关于如何将我的函数的参数传递给 mvrnorm?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 UDF 的输入参数传递给 sapply

将可变参数函数模板参数传递给另一个函数

如何将参数传递给我的处理程序

C++ 将列表作为参数传递给函数

如何将构造函数参数传递给 AppDomain.CreateInstanceXXX?

如何将两个参数传递给下一个 ViewController?