Как повторить функцию 1000 раз - PullRequest
0 голосов
/ 01 июля 2018

Итак, в основном я сгенерировал 2 случайные величины X и Y 1000 раз и создал фрейм данных Data = data.frame (x, y), чтобы выполнить сглаживание с помощью функции сплайна. Теперь я хочу воссоздать именно это, но для B = 1000 раз и построить функции сглаживания (B = 1, ..., 1000) для сравнения его изменчивости

simulation= function(d){


  X=runif(1000,0,10)
  Y=rpois(1000,lambda=2*X+0.2*X*sin(X))
  Data=matrix(data=c(X,Y),ncol=2)
  smoothing_sim=lm(Y~ns(x=X,df=d),data=Data)
  new_x2=seq(min(X),max(X),length.out=100) 

  adjusted_sim=predict(object=smoothing_sim,newdata=data.frame(X=new_x2))
  return(data.frame(new_x2,smoothing_sim))

} 
simulation2=replicate(n=1000,simulation)  

Я не уверен, хорош ли мой метод или нет. И я также не уверен, как построить функции после симуляции. Кто-нибудь хочет прокомментировать? Спасибо !

1 Ответ

0 голосов
/ 01 июля 2018

Если вы используете ggplot, вы можете сделать сглаживание прямо в geom_smooth. Поскольку ggplot требует длинной формы, использование столбцов списка и tidyr::unnest является полезной заменой replicate, хотя существует множество способов выполнить этап генерации данных.

library(tidyverse)
set.seed(47)
# A nice theme with a white background to help make low-opacity objects visible
theme_set(hrbrthemes::theme_ipsum_tw())

df <- tibble(replication = seq(100),    # scaled down a little
             x = map(replication, ~runif(1000, 0, 10)), 
             y = map(x, ~rpois(1000, lambda = 2*.x + 0.2*.x*sin(.x)))) %>% 
    unnest() 

# base plot with aesthetics and points
point_plot <- ggplot(df, aes(x, y, group = replication)) + 
    geom_point(alpha = 0.01, stroke = 0) 

point_plot + 
    geom_smooth(method = lm, formula = y ~ splines::ns(x), size = .1, se = FALSE) 

Управление альфа-линией линии может быть действительно полезным для такого рода графиков, но параметр alpha в geom_smooth контролирует непрозрачность стандартной ленты ошибок. Чтобы установить альфа линии, используйте geom_line с stat_smooth:

point_plot + 
    stat_smooth(geom = 'line', method = lm, formula = y ~ splines::ns(x), 
                color = 'blue', alpha = 0.03) 

В настоящее время сглаживание здесь не делает намного больше, чем OLS. Чтобы сделать его более гибким, установите степени свободы:

point_plot + 
    stat_smooth(geom = 'line', method = lm, formula = y ~ splines::ns(x, df = 5), 
                color = 'blue', alpha = 0.03) 

Учитывая, что ответом является Пуассон, возможно, стоит прибегнуть к регрессии Пуассона с помощью glm. Наибольшее влияние здесь заключается в том, что когда х мало, у не падает до 0:

point_plot + 
    stat_smooth(geom = 'line', method = glm, method.args = list(family = 'poisson'), 
                formula = y ~ splines::ns(x, df = 5), color = 'blue', alpha = 0.03) 

Отрегулируйте дальше, как вам нравится.

...