Подбодрить верхнюю часть кривой - PullRequest
2 голосов
/ 20 октября 2019

Как мне ободрить только определенную часть кривой? В этом случае эффективная граница, которая является верхней половиной.

Ниже приведен мой код

#portfolio contains my data
portfolio<-read.table(........)

#this plots a scatter plot, however type="n" so nothing shows up
plot(portfolio$PortfolioRisk,portfolio$PortfolioReturn, xlab = "Risk", ylab 
= "Return", type = "n")


curv <- loess(portfolio$PortfolioReturn~portfolio$PortfolioRisk)

lines(curv)

points(0.15,0.20, pch = 21, bg = 1)
points(0.20,0.25, pch = 21, bg = 1)
text(c(0.15,0.20), c(0.20,0.25), labels=c("B", "E"), cex=0.8, pos =1)

Мой график:

enter image description here

Одно из решений, которое я выбрал, - это наполовину разделить мои данные на нижнюю и верхнюю половину и нанести линии отдельно с разными значениями lwd = "", однако я не думаю, что это будет работать, потому что данные не являются непрерывными

РЕДАКТИРОВАТЬ: Вот данные

     PortfolioReturn PortfolioRisk
1            0.275        0.4355
2            0.270        0.3772
3            0.265        0.3245
4            0.260        0.2774
5            0.255        0.2359
6            0.250        0.2000
7            0.245        0.1697
8            0.240        0.1451
9            0.235        0.1260
10           0.230        0.1126
11           0.225        0.1048
12           0.220        0.1026
13           0.215        0.1060
14           0.210        0.1151
15           0.205        0.1297
16           0.200        0.1500
17           0.195        0.1759
18           0.190        0.2074
19           0.185        0.2445
20           0.180        0.2872
21           0.175        0.3355

Ответы [ 2 ]

1 голос
/ 20 октября 2019

Вот способ, более или менее автоматический, выполнить то, о чем просит вопрос. Обратите внимание на то, что он подставляет векторы с индексами 1:m. Моя первая попытка была m:curv$n и получила нижнюю часть кривой. Адаптируйте это решение в каждом конкретном случае.

Первые инструкции почти совпадают с кодом, размещенным в вопросе. Разница заключается в вызове loess, который использует аргумент data.

plot(portfolio$PortfolioRisk,
     portfolio$PortfolioReturn, 
     xlab = "Risk", ylab = "Return", type = "n")


curv <- loess(PortfolioReturn ~ PortfolioRisk, data = portfolio)

Теперь новая часть.

m <- which.min(curv$x)
lines(curv)
lines(curv$x[1:m], curv$y[1:m], lwd = 2)

И, наконец, инструкции, чтобы сделать его красивым.

points(0.15,0.20, pch = 21, bg = 1)
points(0.20,0.25, pch = 21, bg = 1)
text(c(0.15,0.20), c(0.20,0.25), labels=c("B", "E"), cex=0.8, pos =1)

enter image description here

1 голос
/ 20 октября 2019

Вы можете построить обе части отдельно. Вот пример, так как вы не предоставили данные.

curve(sqrt(x), xlim=c(0, 4), ylim=c(-4, 4), lwd=4)
curve(-sqrt(x), add=TRUE)
points(1, sqrt(1), pch=21, bg=1)
points(.5, -sqrt(.5), pch=21, bg=1)
text(c(1,.5), c(sqrt(1),-sqrt(1)), labels=c("B", "E"), cex=0.8, pos =1)

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...