Задание 1. Моделирование одномерной случайной величины
f <- function(x) ifelse(x <= 4, 2*x+3, -x +15 )
df <- data.frame(x=1:10, y=f(1:10))
ggplot(data=df, aes(x=x, y=y)) + geom_line() + geom_point()

norm_k <- 72
f_norm <- function(x) f(x)/norm_k
ggplot(data=df, aes(x=x, y=f_norm(x))) + geom_line() + geom_point()

STEP <- 0.01
x <- seq(1, 10, STEP)
y <- f_norm(x)
ss <- Reduce(function(a,b) c(a, tail(a,1) + b*STEP), y[2:length(y)], c(0))
df <- data.frame(x=x, y=y, ss=ss)
Сгенерируем 10000 значений с помощью нашего генератора и построим гистограмму выборочной плотности рампределения полученной выбоки.
f_gen = function(x) df[df$ss >= x, 'x'][[1]]
gen_dataset <- data.frame(x=unlist(Map(f_gen, runif(10000))))
ggplot(data=gen_dataset) + geom_histogram(aes(x=x,..density..), binwidth = 0.4, fill='green', col='red', alpha = .2) + geom_line(data=df, aes(x=x, y=f_norm(x))) + geom_point(data=df, aes(x=x, y=f_norm(x)))

Задание 2. Моделирование двумерной случайной величины
Функция плотности определена на прямоугольнике [1, 5] x [0, 2]. Прямоугольник разделен диагональю, проходящей через точки (1, 0) и (5, 2), на два треугольника. Вероятность попадания в левый треугольник равна 0.25, а в правый треугольник 0.75.
inverseGen <- function (N, fun, xlim){
STEP <- 0.01
x <- seq(xlim[1], xlim[2], STEP)
y <- unlist(Map(fun, x))
ss <- Reduce(function(a,b) c(a, tail(a,1) + b*STEP), y[2:length(y)], c(0))
df <- data.frame(x=x, y=y, ss=ss)
f_gen = function(x) tail(df[df$ss < x, 'x'],1)[[1]]
data.frame(x=unlist(Map(f_gen, runif(N))))
}
f <- function(x) ifelse(x[2] >= 0.5*x[1] - 0.5, 0.25, 0.75 )
res <- adaptIntegrate(f, lowerLimit = c(1, 0), upperLimit = c(2, 5), tol = 1e-3)
k_norm = res$integral
f_norm <- function(x) f(x)/k_norm
takeIntergal = function(b1,b2) adaptIntegrate(f_norm, lowerLimit = c(1, 0), upperLimit = c(b1, b2), tol = 1e-3)$integral
s1<- seq(1,2,length.out = 20)
s2<- seq(0,5,length.out = 20)
CDF_Table <- adply(expand.grid(x=s1, y=s2), 1, function(row) data.frame(ss=takeIntergal(row$x, row$y)))
CDF_Table_sort <- CDF_Table[order(CDF_Table$ss), ]
f_gen = function(x) CDF_Table_sort[CDF_Table_sort$ss >= x, ][1, c('x', 'y')]
N_SAMPLES = 10000
#gen_dataset <- data.frame(matrix(unlist(Map(f_gen, runif(N_SAMPLES))), nrow=N_SAMPLES, byrow = TRUE))
#colnames(gen_dataset) <- c('x', 'y')
generator2 <- function(x){
x <- inverseGen(1, function(x) x/16 + 1/16, c(1,5))[[1]]
y <- inverseGen(1, function(p) ifelse(p >= 0.5*x - 0.5, 1/(x+1), 3/(x+1) ), c(0,2))[[1]]
data.frame(x=x, y=y)
}
gen_dataset <- data.frame(matrix(unlist(Map(generator2, 1:10000)), ncol=2, byrow=TRUE))
colnames(gen_dataset) <- c('x', 'y')
Попробуем графически изобразить полученный результат. Построим гистограмму на плоскости. Насыщенностью цвета будем обозначить количество попаданий в карманы.

LS0tCnRpdGxlOiAi0JvQsNCx0L7RgNCw0YLQvtGA0L3QsNGPIDQiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCmBgYHtyIGVjaG89RkFMU0V9CmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShjdWJhdHVyZSkKYGBgCgojIyDQl9Cw0LTQsNC90LjQtSAxLiDQnNC+0LTQtdC70LjRgNC+0LLQsNC90LjQtSDQvtC00L3QvtC80LXRgNC90L7QuSDRgdC70YPRh9Cw0LnQvdC+0Lkg0LLQtdC70LjRh9C40L3RiwoKCgpgYGB7cn0KZiA8LSBmdW5jdGlvbih4KSBpZmVsc2UoeCA8PSA0LCAyKngrMywgLXggKzE1ICkKZGYgPC0gZGF0YS5mcmFtZSh4PTE6MTAsIHk9ZigxOjEwKSkKCmdncGxvdChkYXRhPWRmLCBhZXMoeD14LCB5PXkpKSArIGdlb21fbGluZSgpICsgZ2VvbV9wb2ludCgpCm5vcm1fayA8LSA3MgpmX25vcm0gPC0gZnVuY3Rpb24oeCkgZih4KS9ub3JtX2sKZ2dwbG90KGRhdGE9ZGYsIGFlcyh4PXgsIHk9Zl9ub3JtKHgpKSkgKyBnZW9tX2xpbmUoKSArIGdlb21fcG9pbnQoKQpgYGAKCmBgYHtyfQpTVEVQIDwtIDAuMDEKeCA8LSBzZXEoMSwgMTAsIFNURVApCgp5IDwtIGZfbm9ybSh4KQpzcyA8LSBSZWR1Y2UoZnVuY3Rpb24oYSxiKSBjKGEsIHRhaWwoYSwxKSArIGIqU1RFUCksIHlbMjpsZW5ndGgoeSldLCBjKDApKQpkZiA8LSBkYXRhLmZyYW1lKHg9eCwgeT15LCBzcz1zcykKCmBgYAoK0KHQs9C10L3QtdGA0LjRgNGD0LXQvCAxMDAwMCDQt9C90LDRh9C10L3QuNC5INGBINC/0L7QvNC+0YnRjNGOINC90LDRiNC10LPQviDQs9C10L3QtdGA0LDRgtC+0YDQsCDQuCDQv9C+0YHRgtGA0L7QuNC8INCz0LjRgdGC0L7Qs9GA0LDQvNC80YMg0LLRi9Cx0L7RgNC+0YfQvdC+0Lkg0L/Qu9C+0YLQvdC+0YHRgtC4INGA0LDQvNC/0YDQtdC00LXQu9C10L3QuNGPINC/0L7Qu9GD0YfQtdC90L3QvtC5INCy0YvQsdC+0LrQuC4KCmBgYHtyfQpmX2dlbiA9IGZ1bmN0aW9uKHgpIGRmW2RmJHNzID49IHgsICd4J11bWzFdXQpnZW5fZGF0YXNldCA8LSBkYXRhLmZyYW1lKHg9dW5saXN0KE1hcChmX2dlbiwgcnVuaWYoMTAwMDApKSkpCgpnZ3Bsb3QoZGF0YT1nZW5fZGF0YXNldCkgKyBnZW9tX2hpc3RvZ3JhbShhZXMoeD14LC4uZGVuc2l0eS4uKSwgYmlud2lkdGggPSAwLjQsIGZpbGw9J2dyZWVuJywgY29sPSdyZWQnLCBhbHBoYSA9IC4yKSArIGdlb21fbGluZShkYXRhPWRmLCBhZXMoeD14LCB5PWZfbm9ybSh4KSkpICsgZ2VvbV9wb2ludChkYXRhPWRmLCBhZXMoeD14LCB5PWZfbm9ybSh4KSkpCgpgYGAKIyMg0JfQsNC00LDQvdC40LUgMi4g0JzQvtC00LXQu9C40YDQvtCy0LDQvdC40LUg0LTQstGD0LzQtdGA0L3QvtC5INGB0LvRg9GH0LDQudC90L7QuSDQstC10LvQuNGH0LjQvdGLCgoq0KTRg9C90LrRhtC40Y8g0L/Qu9C+0YLQvdC+0YHRgtC4INC+0L/RgNC10LTQtdC70LXQvdCwINC90LAg0L/RgNGP0LzQvtGD0LPQvtC70YzQvdC40LrQtSBbMSwgNV0geCBbMCwgMl0uINCf0YDRj9C80L7Rg9Cz0L7Qu9GM0L3QuNC6INGA0LDQt9C00LXQu9C10L0g0LTQuNCw0LPQvtC90LDQu9GM0Y4sINC/0YDQvtGF0L7QtNGP0YnQtdC5INGH0LXRgNC10Lcg0YLQvtGH0LrQuCAoMSwgMCkg0LggKDUsIDIpLCDQvdCwINC00LLQsCDRgtGA0LXRg9Cz0L7Qu9GM0L3QuNC60LAuINCS0LXRgNC+0Y/RgtC90L7RgdGC0Ywg0L/QvtC/0LDQtNCw0L3QuNGPINCyINC70LXQstGL0Lkg0YLRgNC10YPQs9C+0LvRjNC90LjQuiDRgNCw0LLQvdCwIDAuMjUsINCwINCyINC/0YDQsNCy0YvQuSDRgtGA0LXRg9Cz0L7Qu9GM0L3QuNC6IDAuNzUuKiAgCgpgYGB7ciBlY2hvPUZBTFNFfQpybShsaXN0PWxzKCkpCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShjdWJhdHVyZSkKbGlicmFyeShwbHlyKQpgYGAKCgpgYGB7cn0KaW52ZXJzZUdlbiA8LSBmdW5jdGlvbiAoTiwgZnVuLCB4bGltKXsgCiAgU1RFUCA8LSAwLjAxCiAgeCA8LSBzZXEoeGxpbVsxXSwgeGxpbVsyXSwgU1RFUCkKICB5IDwtIHVubGlzdChNYXAoZnVuLCB4KSkKICBzcyA8LSBSZWR1Y2UoZnVuY3Rpb24oYSxiKSBjKGEsIHRhaWwoYSwxKSArIGIqU1RFUCksIHlbMjpsZW5ndGgoeSldLCBjKDApKQogIGRmIDwtIGRhdGEuZnJhbWUoeD14LCB5PXksIHNzPXNzKQogIGZfZ2VuID0gZnVuY3Rpb24oeCkgdGFpbChkZltkZiRzcyA8IHgsICd4J10sMSlbWzFdXQogIGRhdGEuZnJhbWUoeD11bmxpc3QoTWFwKGZfZ2VuLCBydW5pZihOKSkpKQp9CmBgYAoKCgpgYGB7cn0KZiA8LSBmdW5jdGlvbih4KSBpZmVsc2UoeFsyXSA+PSAwLjUqeFsxXSAtIDAuNSwgMC4yNSwgMC43NSApCnJlcyA8LSBhZGFwdEludGVncmF0ZShmLCBsb3dlckxpbWl0ID0gYygxLCAwKSwgdXBwZXJMaW1pdCA9IGMoMiwgNSksIHRvbCA9IDFlLTMpCmtfbm9ybSA9IHJlcyRpbnRlZ3JhbApmX25vcm0gPC0gZnVuY3Rpb24oeCkgZih4KS9rX25vcm0KCgoKdGFrZUludGVyZ2FsID0gZnVuY3Rpb24oYjEsYjIpIGFkYXB0SW50ZWdyYXRlKGZfbm9ybSwgbG93ZXJMaW1pdCA9IGMoMSwgMCksIHVwcGVyTGltaXQgPSBjKGIxLCBiMiksIHRvbCA9IDFlLTMpJGludGVncmFsCgpzMTwtIHNlcSgxLDIsbGVuZ3RoLm91dCA9IDIwKQpzMjwtIHNlcSgwLDUsbGVuZ3RoLm91dCA9IDIwKQoKQ0RGX1RhYmxlIDwtIGFkcGx5KGV4cGFuZC5ncmlkKHg9czEsIHk9czIpLCAxLCBmdW5jdGlvbihyb3cpIGRhdGEuZnJhbWUoc3M9dGFrZUludGVyZ2FsKHJvdyR4LCByb3ckeSkpKQpDREZfVGFibGVfc29ydCA8LSBDREZfVGFibGVbb3JkZXIoQ0RGX1RhYmxlJHNzKSwgXQoKZl9nZW4gPSBmdW5jdGlvbih4KSBDREZfVGFibGVfc29ydFtDREZfVGFibGVfc29ydCRzcyA+PSB4LCBdWzEsIGMoJ3gnLCAneScpXQoKCgpgYGAKCgpgYGB7cn0KTl9TQU1QTEVTID0gMTAwMDAKI2dlbl9kYXRhc2V0IDwtIGRhdGEuZnJhbWUobWF0cml4KHVubGlzdChNYXAoZl9nZW4sIHJ1bmlmKE5fU0FNUExFUykpKSwgbnJvdz1OX1NBTVBMRVMsIGJ5cm93ID0gVFJVRSkpCiNjb2xuYW1lcyhnZW5fZGF0YXNldCkgPC0gYygneCcsICd5JykKCmdlbmVyYXRvcjIgPC0gZnVuY3Rpb24oeCl7CiAgeCA8LSBpbnZlcnNlR2VuKDEsIGZ1bmN0aW9uKHgpIHgvMTYgKyAxLzE2LCBjKDEsNSkpW1sxXV0KICB5IDwtIGludmVyc2VHZW4oMSwgZnVuY3Rpb24ocCkgaWZlbHNlKHAgPj0gMC41KnggLSAwLjUsIDEvKHgrMSksIDMvKHgrMSkgKSwgYygwLDIpKVtbMV1dCiAgZGF0YS5mcmFtZSh4PXgsIHk9eSkKfQoKZ2VuX2RhdGFzZXQgPC0gZGF0YS5mcmFtZShtYXRyaXgodW5saXN0KE1hcChnZW5lcmF0b3IyLCAxOjEwMDAwKSksIG5jb2w9MiwgYnlyb3c9VFJVRSkpCmNvbG5hbWVzKGdlbl9kYXRhc2V0KSA8LSBjKCd4JywgJ3knKQpgYGAKCgrQn9C+0L/RgNC+0LHRg9C10Lwg0LPRgNCw0YTQuNGH0LXRgdC60Lgg0LjQt9C+0LHRgNCw0LfQuNGC0Ywg0L/QvtC70YPRh9C10L3QvdGL0Lkg0YDQtdC30YPQu9GM0YLQsNGCLiDQn9C+0YHRgtGA0L7QuNC8INCz0LjRgdGC0L7Qs9GA0LDQvNC80YMg0L3QsCDQv9C70L7RgdC60L7RgdGC0LguINCd0LDRgdGL0YnQtdC90L3QvtGB0YLRjNGOINGG0LLQtdGC0LAg0LHRg9C00LXQvCDQvtCx0L7Qt9C90LDRh9C40YLRjCDQutC+0LvQuNGH0LXRgdGC0LLQviDQv9C+0L/QsNC00LDQvdC40Lkg0LIg0LrQsNGA0LzQsNC90YsuIAoKYGBge3IgZWNobz1GQUxTRX0KZ2dwbG90KGdlbl9kYXRhc2V0LCBhZXMoeCx5KSkgKyBzdGF0X2JpbjJkKGJpbnM9MTcpICsgeGxpbSgxLDUpICsgZ2d0aXRsZSgi0KLQtdC/0LvQvtCy0LDRjyDQutCw0YDRgtCwINGA0LDRgdC/0YDQtdC00LXQu9C90LjRjyDQvdCw0YjQtdC5INC00LLRg9C80LXRgNC90L7QuSDRgdC70YPRh9Cw0LnQvdC+0Lkg0LLQtdC70LjRh9C40L3RiyIpCmBgYAoK