Как вы рисуете прямую линию, касательную к сглаженной кривой в R?

#r #ggplot2 #loess

#r #ggplot2 #лесс

Вопрос:

Я пытаюсь нарисовать прямую линию от начала координат (или любой точки на оси Y), которая является касательной к кривой Лесса (линия, которая касается кривой только один раз).

Черная линия — это сглаженная кривая точек, и я хочу нарисовать эту желтую линию.

Я опубликую свой код, чтобы получить сглаженную кривую ниже.

»’

 library(quantmod)
library(plotly)
library(PerformanceAnalytics)
library(timetk)
library(tidyverse)

ticker = c('AMZN', 'AAPL', 'NFLX', 'XOM', 'T')
price_data = getSymbols(ticker, from = '2014-01-01', to = '2018-05-31')

prices = do.call(cbind,
                 lapply(ticker, function(x) Ad(get(x))))

rets = Return.calculate(prices, method = 'log') %>%
  na.omit()
    
num_port = 1000
all_wts = matrix(nrow = num_port, ncol = length(ticker))
port_returns = vector('numeric', length = num_port)
port_risk = vector('numeric', length = num_port)
port_sr = vector('numeric', length = num_port)

for (i in seq_along(port_returns)) {
  
  wts = runif(n = length(ticker))
  wts = wts/sum(wts)
  
  all_wts[i,] = wts
  
  port = Return.portfolio(R = rets, weights = wts, verbose = TRUE)
  
  a = StdDev.annualized(port$returns)[1]
  b = SharpeRatio.annualized(port$returns, Rf = 0)[1]
  c = a*b
  
  port_returns[i] = c
  port_risk[i] = a
  port_sr[i] = b

}

all_wts = tk_tbl(all_wts)
colnames(all_wts) = colnames(rets)

pf_val = tibble(ret = port_returns, risk = port_risk, sr = port_sr)
pf_val = tk_tbl(cbind(all_wts, pf_val))

min_var = pf_val[which.min(pf_val$risk),]
max_sr = pf_val[which.max(pf_val$sr),]

library(tidyverse)

pf_line2 = pf_val[which((pf_val$ret %in% d$ret)),]


p3 = ggplot(aes(x = risk, y = ret, color = sr), data = pf_line2)  
  geom_point()   theme_classic()  
  scale_y_continuous(labels = scales::percent)  
  scale_x_continuous(labels = scales::percent)  
  labs(x = 'risk', y = 'return')  
  geom_smooth(method = 'loess', col='black', level=0.5, alpha=0.1)
  

ggplotly(p3)
  

»’

Комментарии:

1. Я не знаю ни о каких функциях, связанных с ggplot, но моим инстинктом было бы получить полиномы Лесса и взять производную (в точке), чтобы получить касательную линию. Есть большая вероятность, что loess вернет кривую, которая не похожа на многочлен 2 степени в соответствии с вашим примером. В этом случае, очевидно, важно выбрать точку, вокруг которой можно получить касательную.

Ответ №1:

Я попытался запустить ваши данные, но d не был определен в коде, поэтому не смог воспроизвести ваш пример.

Используя geom_abline, вы можете добавить линию с собственным пересечением и наклоном, если вы знаете эти размеры.

 ggplot(aes(x = wt, y = mpg), data = mtcars)  
geom_point() 
labs(x = 'wt', y = 'mpg')  
geom_abline(intercept = 10, slope = 6) 
geom_smooth(method = 'loess', col='black', level=0.5, alpha=0.1)
  

Это дало что-то вроде этого. линия с помощью geom_smooth.

Я не полный эксперт, но я надеюсь, что это каким-то образом поможет сформировать или сформировать.