Как создать фрейм данных из возврата функции? - PullRequest
1 голос
/ 13 марта 2020
model <- function(alpha,n,m){
  ybar <- numeric()
  for(i in 1:m){
    y <- arima.sim(model=list(ar=alpha),n)
    ybar[i] <- mean(y)
  }
  CI <- mean(ybar) + c(1,-1)*qnorm(0.025)*sqrt(1/n)*(1/(1-alpha))
  width <- abs(abs(CI[1])-abs(CI[2]))
  list("Confidence Interval"=CI, Width=width)
}
model(-0.8,1000,1000)
model(-0.4,1000,1000)
model(-0.3,1000,1000)
model(0.2,1000,1000)
model(0.8,1000,1000)

Я хочу создать фрейм данных таким образом, чтобы первый столбец представлял собой список альфа (например, -0,8, -0,4, ..., 0,8), а второй столбец - это значение для confidence interval, тогда как 3-й столбец - это width из CI. Каждый столбец связан с собственным именем столбца (альфа, доверительный интервал, ширина).

Как я могу это сделать?

1 Ответ

1 голос
/ 13 марта 2020

Не уверен, что это то, что нам нужно (в base R)

do.call(rbind,  lapply(c(-0.8, -0.4, -0.3), 
       function(x) data.frame(alpha = x, model(x, 1000, 1000))))
#   alpha Confidence.Interval        Width
#1  -0.8         -0.03474170 0.0006172874
#2  -0.8          0.03412441 0.0006172874
#3  -0.4         -0.04439685 0.0002515509
#4  -0.4          0.04414530 0.0002515509
#5  -0.3         -0.04777081 0.0001885317
#6  -0.3          0.04758228 0.0001885317

Если нам нужны верхняя и нижняя границы в виде столбцов

do.call(rbind, lapply(c(-0.8, -0.4, -0.3), function(x) {
   out <- model(x, 1000, 100)
  data.frame(alpha = x, lower_bound = out$`Confidence Interval`[1],
    upper_bound = out$`Confidence Interval`[2], Width = out$Width)}))
#  alpha lower_bound upper_bound       Width
#1  -0.8 -0.03163379  0.03723232 0.005598532
#2  -0.4 -0.04186212  0.04668002 0.004817898
#3  -0.3 -0.04833423  0.04701885 0.001315380

Или с tidyverse

library(dplyr)
library(purrr)
tibble(alpha = c(-0.8, -0.4, -0.3), 
      out = map(alpha, model, n = 1000, m = 1000)) %>% 
  unnest_wider(c(out)) %>% 
  unnest_longer(c(`Confidence Interval`))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...