Наткнулась на пост в линкедине, где автор (профессор Nuno Sepúlveda) интересовался, из какого распределения пришел дорожный знак лежачий полицейский. Мне показалось забавным и я воспроизвела код для этого знака, а еще попробовала собрать знак “Неровная дорога” в R, опираясь на похожую идею.
library(truncdist) # для создания truncated (усеченных) распределений
x <- seq(-1.5, 1.5, 0.01)
y <- 0.35 * dtrunc(x, spec='norm', a = -1.5, b = 1.5, sd = 0.35) + 0.65 * dunif(x, -1.5, 1.5)
# y <- 0.35 * dnorm(x, sd = 0.35) + 0.65 * dunif(x, -1.5, 1.5)
plot(x,y,type='n', ylim=c(-0.25,4.5), xlim=c(-3,3), axes=F, xlab='', ylab='') # to create empty space
polygon(c(-2.5,0,2.5,-2.5), c(-0.05,-0.05+sqrt(5^2-2.5^2), -0.05,-0.05), col='red', border=NA) # outer red triangle
leng <- 1.95
polygon(c(-leng,0,leng,-leng), c(0,sqrt((2*leng)^2-leng^2),0,0)+0.275, col='orange', border=NA) # inner triangle
polygon(c(x,x[length(x)],x[1]), c(y,0,0)+0.5,col='black') # our distribution
Я немного упростила код относительно исходного поста, проверила, что
ничего не поменялось (убрала избыточный sapply
). Основная
идея при создании знака в генерации y
как суммы нормального
и равномерного распределения, чтобы получились более “тяжелые”
хвосты.
Мне понравилась идея создавать знаки в R, поэтому я решила попробовать воспроизвести знак неровная дорога.
Как думаете, какое распределение нужно взять?
Попробуем линейную комбинацию схожих распределений, как в предыдущем примере - то есть сумму нормального и равномерного распределения.
# left part of sign
x1 <- seq(-1.6, 0, 0.01)
y1 <- 0.5 * dtrunc(x1, spec='norm', a=-1.8, b=0, mean = -1.8/2, sd = 0.45)+
0.4*dunif(x1,-1.8,0)
# right part of sign
x2 <- seq(0.01, 1.6, 0.01)
y2 <- 0.5 * dtrunc(x2, spec='norm', a=0, b=1.8, mean = 1.8/2, sd = 0.45)+
0.4*dunif(x2,0,1.8)
# combine both parts
y <- c(y1, y2)
x <- c(x1, x2)
plot(x, y, type='n', ylim=c(-0.25,5),xlim=c(-3,3),axes=F,xlab='',ylab='') #empty space
polygon(c(-2.5,0,2.5,-2.5),
c(-0.05,-0.05 + sqrt(5^2-2.5^2), -0.05,-0.05), col = 'red', border = 'gray10') # outer red triangle
leng <- 1.95
polygon(c(-leng,0,leng,-leng), c(0,sqrt((2*leng)^2-leng^2),0,0)+0.275, col='white', border=NA) # inner white triangle
polygon(c(x,x[length(x)],x[1]),c(y,0,0)+0.5,col='black') # our distribution
Вроде получилось похоже на искомый знак.
Подписывайтесь на телеграм канал, будет много интересного!