Ошибка вложенного цикла for в r (пакет extRemes) - PullRequest
0 голосов
/ 06 ноября 2019

Я пытаюсь создать двумерный вектор в r, а затем построить его с помощью команды bloxplot().

numbers <- c(10,100,1000,10000)

for (i in 1:length(numbers)) {
e[i] <- c()

for(j in 1:100) {
a <- revd(numbers[i], loc = 0, scale = 1, shape = 0, type ="GEV")
b <- fevd(x=a, type="Gumbel")
c <- as.numeric(unname(b$results$par[2]))
d <- append(d,c)
}
e[i] <- append(e[i],d)
}
boxplot(e[i])

"revd" генерирует случайные переменные, "number [i]" имеетВ различных сценариях «fevd» возвращает значение параметра (местоположение, масштаб и форму), они оба из пакета «extRemes».

Я пытаюсь добавить вектор к вектору (2D вектор),но появляются сообщения об ошибках Error: object 'e' not found и Error in boxplot(e[i]) : object 'e' not found.

Я также пытался поставить "e <- c ()" в начале: </p>

numbers <- c(10,100,1000,10000)
e <- c()
for (i in 1:length(numbers)) {
e[i] <- c()
for(j in 1:100) {
a <- revd(numbers[i], loc = 0, scale = 1, shape = 0, type ="GEV")
b <- fevd(x=a, type="Gumbel")
c <- as.numeric(unname(b$results$par[2]))
d <- append(d,c)
}
e[i] <- append(e[i],d)
}
boxplot(e[i])

Затем ошибкаколичество сообщений увеличилось до:

Error in e[i] <- c() : replacement has length zero
In addition: Warning message:
In e[i] <- append(e[i], d) :
  number of items to replace is not a multiple of replacement length

и

Error in plot.window(xlim = xlim, ylim = ylim, log = log, yaxs = pars$yaxs) : 
  need finite 'ylim' values
In addition: Warning messages:
1: In min(x) : no non-missing arguments to min; returning Inf
2: In max(x) : no non-missing arguments to max; returning -Inf

Есть ли другой способ сделать это без ошибок?

1 Ответ

0 голосов
/ 06 ноября 2019

Если я правильно понял, это один из способов сделать это. Вместо использования append(), использование индекса матрицы или вектора кажется мне более R, по крайней мере. replicate() также удобно, если вы хотите использовать одну и ту же функцию несколько раз.

library("tidyr")
library("extRemes")
library("ggplot2")
library("reshape2")

numbers <- c(10, 100, 1000, 10000)
num_reps <- 100

out_mat <- matrix(NA, nrow=num_reps, ncol=length(numbers))

scale_out <- function(data){
  mod <- revd(data, loc=0, scale=1, shape=0, type="GEV") %>% fevd(type="Gumbel")
  return(mod$results$par[[2]])
}


for (i in 1:length(numbers)){
  out_mat[, i] <- replicate(num_reps, scale_out(numbers[i]))
}

ggplot(melt(out_mat), aes(x=Var2, y=value)) + 
  geom_boxplot(aes(group=Var2))

enter image description here

...