Газовый код R кода - числовое выражение имеет 2 элемента: используется только первый - PullRequest
3 голосов
/ 03 марта 2020

Я пытаюсь создать функцию гауссовского микса в соответствии со следующими параметрами:

  • Для каждого образца бросьте объявление ie с k сторонами
  • Если j-й сторона появляется из броска, возьмите образец из Normal (muj, sdj), где muj и sdj - среднее значение и стандартное отклонение для j-го нормального распределения соответственно. Это означает, что у вас должно быть k различных нормальных распределений на выбор. Обратите внимание, что muj - это математическая форма ссылки на j-й элемент в векторе с именем mus.
  • В результате выборка из этого Normal получается из гауссовой смеси.

Где :

  • n, целое число, представляющее количество независимых выборок, которые вы хотите получить из этой случайной переменной
  • mus, вектор чисел c с длиной k
  • sds, вектор цифр c длиной k
  • проб, вектор цифр c длиной 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 Ответ

0 голосов
/ 03 марта 2020

Если вы делаете seq_len(2), это дает вам:

[1] 1 2

И вы не можете сделать 1: (1: 2) .. это не имеет смысла

Также вы можете избегайте циклов в вашем коде, выбирая количество попыток, которое вам нужно, например, если вы делаете:

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

Это дает вам 1-ю выборку из 1-го среднего, 2-ю выборку из 2-го среднего и так далее. Таким образом, вы можете упростить свою функцию до:

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")

enter image description here

...