【问题标题】:R code Gaussian mixture -- numerical expression has 2 elements: only the first usedR代码高斯混合——数值表达式有2个元素:只使用第一个
【发布时间】:2020-06-15 08:02:20
【问题描述】:

我正在尝试根据这些参数创建一个高斯混合函数:

  • 对于每个样本,滚动一个具有 k 个面的模具
  • 如果第 j 面出现在卷中,则从 Normal(muj, sdj) 中抽取样本,其中 muj 和 sdj 分别是第 j 个正态分布的平均值和标准差。这意味着您应该有 k 个不同的正态分布可供选择。请注意,muj 是在称为 mus 的向量中引用第 j 个元素的数学形式。
  • 从此法线生成的样本随后来自高斯混合。

地点:

  • n,一个整数,表示您希望从此随机变量中获得的独立样本数
  • mus,长度为 k 的数值向量
  • sds,长度为 k 的数值向量
  • prob,一个长度为 k 的数值向量,表示选择不同高斯的概率。这应该默认为 NULL。

这是我目前想出的:

n <- c(1)
mus <- c()
sds <- c()
prob <- c()

rgaussmix <- function(n, mus, sds, prob = NULL){
  if(length(mus) != length(sds)){
    stop("mus and sds have different lengths")
  }
  for(i in 1:seq_len(n)){
    if(is.null(prob)){
      rolls <- c(NA, n)
      rolls <- sample(c(1:length(mus)), n, replace=TRUE)
      avg <- rnorm(length(rolls), mean=mus[rolls], sd=sds[rolls])
    }else{
      rolls <- c(NA, n)
      rolls <- sample(c(1:length(mus), n, replace=TRUE, p=prob))
      avg <- rnorm(length(rolls), mean=mus[rolls], sd=sds[rolls])
    }
  }
  return(avg)
}

rgaussmix(2, 1:3, 1:3)

它似乎符合大多数要求,但它一直给我以下错误:

数值表达式有2个元素:只有第一个使用的要替换的项目数不是替换长度的倍数

我试过查看多个变量的长度,但我似乎无法弄清楚错误来自哪里!

有人可以帮我吗?

【问题讨论】:

  • 这是1:seq_len(n)的问题:使用seq_len(n)即可。

标签: r function warnings gaussian variable-length


【解决方案1】:

如果你这样做 seq_len(2) 它会给你:

[1] 1 2

你不能做 1:(1:2) .. 这没有意义

您还可以通过对您需要的尝试次数进行抽样来避免代码中的循环,例如,如果您这样做:

rnorm(3,c(0,10,20),1)
[1] -0.507961  8.568335 20.279245

它为您提供第一个平均值的第一个样本,第二个平均值的第二个样本,依此类推。因此,您可以将函数简化为:

rgaussmix <- function(n, mus, sds, prob = NULL){
  if(length(mus) != length(sds)){
    stop("mus and sds have different lengths")
  }
  if(is.null(prob)){
    prob = rep(1/length(mus),length(mus)) 
  }
  rolls <- sample(length(mus), n, replace=TRUE, p=prob)
  avg <- rnorm(n, mean=mus[rolls], sd=sds[rolls])
  avg
}

您可以绘制结果:

plot(density(rgaussmix(10000,c(0,5,10),c(1,1,1))),main="mixture of 0,5,10")

【讨论】:

    猜你喜欢
    • 2018-02-07
    • 2014-06-04
    • 1970-01-01
    • 2021-08-17
    • 1970-01-01
    • 2018-08-21
    • 1970-01-01
    • 2016-01-08
    • 2011-11-01
    相关资源
    最近更新 更多