Р: Как добавить такие кривые безразличия? - PullRequest
0 голосов
/ 01 ноября 2019

У меня есть график, как показано ниже, за исключением случаев, когда без красной и синей кривых безразличия (наборы уровней). Я знаю, что могу использовать contour(), но это создает длинные кривые, идущие от края к краю.

Можно ли как-нибудь создать такие кривые? Они не должны следовать какой-либо функции или каким-либо конкретным данным, я просто хочу показать общую картину.

enter image description here

Ответы [ 2 ]

1 голос
/ 01 ноября 2019

Вы можете попробовать с контуром

sig <- seq(0,0.25,by=.01)
exr <- seq(0,.20,length.out = length(sig))

# define function 
Uf=function(sig,ret,ra=1)ret-0.5*(1/ra)*sig^2
u = outer(sig,exr,function(sd,mr)Uf(sd,mr,ra=0.075))
#image(sig,exr,u)
#contour(sig,exr,u)
contour(sig,exr,u, levels =c(0.04666667, 0.07500000, 0.10333333),col=3,drawlabels = F)
v = outer(sig,exr,function(sd,mr)Uf(sd,mr,ra=0.195))
contour(sig,exr,v, levels =c(0.07333333, 0.09500000, 0.11666667),add = T,col=4,drawlabels = F)
abline(a=0.03,b=0.6666667)

enter image description here

Редактировать

Uf - классическая квадратичная функция предпочтения, которая зависитна риск, доходность и неприятие риска. Смотрите дополнительную информацию, например, здесь . outer fist делает все возможное сочетание предоставленных векторов sig и exr, затем принимает каждую пару значений и вычисляет полезность с помощью Uf. Попробуйте head(u) или View(u). contour принимает все значения для построения с желаемыми уровнями (кривые безразличия). abline добавляет контрольную линию, которая у вас есть на вашем графике.

1 голос
/ 01 ноября 2019

Решение ручной работы, требующее некоторого изменения позиции и кривизны:

line <- data.frame(x = 0, xend = 0.2, y = 0.03, yend = 0.18)

ggplot(line, aes(x, y, xend=xend, yend=yend)) +
  geom_segment() +
  annotate(
    "curve", 
    x = 0.02 - c(0, 0.005, 0.01),
    y = 0.08 + c(0, 0.01, 0.02), 
    xend = 0.08 - c(0, 0.005, 0.01), 
    yend = 0.14 + c(0, 0.01, 0.02), 
    color = "red", curvature=0.76) +
  expand_limits(y = 0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...