2017-02-04 3 views
0

Хотелось бы генерировать числа из треугольного распределения, которое имеет только три параметра: a, b, c и c в моем случае определяется как (a + b)/2. Скажем, у меня есть вектор х:Случайный образец треугольного распределения: R

x <- c(1,-1,2,-2,3,-3,4,-4,5,-5,11,-11,12,-12,13,-13) 

И я хочу, чтобы создать столько новых значений, как есть отрицательные числа в вектор х. Поэтому я могу заменить отрицательные значения на числа, порожденные треугольным распределением.

library(triangle) 
c = abs(x[x<0])/2 
sample <- rtriangle(length(a[which(a<0)]), 0, abs(x[x<0]),c) 

Очевидно не работает, как я получаю предупреждение:

Предупреждающие сообщения: 1: В случае (а> с | б < с) возвращение (респ (NaN, раз = n)): условие имеет длину> 1, и будет использоваться только первый элемент 2: In if (a! = c) {: условие имеет длину> 1 и будет использоваться только первый элемент 3: В p [i] * (b - a): длина длинного объекта не кратная короткой длине объекта 4: В p [i] < - a + sqrt (p [i] * (b - a) * (c - a)): Количество элементов для замены не кратно замещающей длины 5: В (1 - p [j]) * (b - a): длина длинного объекта не кратна короткой длине объекта 6: В p [j] < - b - sqrt ((1 - p [j]) * (Ь - а) * (Ь - с)): количество элементов для замены не кратна длине замены

+0

Параметр 'a' равен 0, но' b' и 'c' не являются одиночными числами. Мне непонятно, как вы пытаетесь пробовать. –

+0

С помощью 'rtriangle':' a, b и c могут быть соответствующими векторами длины, кроме как в случае rtriangle.' –

+0

Я хотел бы получить вектор (длина вектора соответствует числу отрицательных чисел в векторе * * x **) чисел, отобранных из треугольного распределения. Я хочу попробовать в диапазоне от _a_ (_a = 0_) до _b_ (_b - абсолютное значение отрицательного элемента в векторе _ ** x **), а параметр _c_ равен: _c = b/2_. – marianess

ответ

1

Поскольку rtriangle не принимает векторы в качестве входных данных, вы можете создать вектор, оценивая каждый элемент вектор с использованием sapply примерно:

x <- c(1,-1,2,-2,3,-3,4,-4,5,-5,11,-11,12,-12,13,-13) 

library("triangle") 

sample = sapply(abs(x[x<0]), function(x){ rtriangle(1,0,x,x/2) }) 

> sample 
[1] 0.6514940 0.6366981 1.8598445 0.9866790 1.7517438 2.9444719 4.1537113 2.2315813 

Вы получите один случайный образец для 8 различных треугольных распределений.

+0

Спасибо, теперь я понимаю, о чем вы говорили. Похоже, ответ помог. – marianess

Смежные вопросы