Динамический вектор имен: увеличение от 3 до n

Я хотел бы расширить этот код с {xa, xb, xc} до {xa, ..., xn}, где n определяется как длина (имена).

names = c("a", "b" , "c")
set.seed(123)
x.nsim = 5000
x.a = runif(x.nsim, min=-1.5, max=1.5)
x.b = runif(x.nsim, min=-1.5, max=1.5)
x.c = 1 - x.a - x.b

for (i in 1:x.nsim) {
  z.vec = c(x.a[i], x.b[i], x.c[i])
  points(z.vec^3, z.vec, cex=0.1)
}

Я попытался сделать это расширение. Есть намеки?

a<-NULL
for (name in names){
  #x<-paste("x.",name,"[i]", sep="", collapse="")
  a<-cbind(a, paste("x.",name,"[i]", sep="", collapse=""))
  a
}
a
z.vec <- NULL
for (i in 1:x.nsim){
  for (j in 1:length(names)){
    z.vec <- cbind(z.vec, a[j])
    points(z.vec^3, z.vec, cex=0.1)
  }
}

1 ответ

Как прокомментировал Грегор, вы должны использовать здесь структуры данных. Поскольку у нас есть много векторов одинаковой длины и типа (и происхождения), здесь естественно использовать матрицы. Давайте установим некоторые начальные параметры:

nsim <- 5000
n <- 10

Как я понимаю из того, что вы написали, мы должны попробовать (n-1) векторы длины nsim от равномерного распределения на [-1.5, 1.5], Вместо того, чтобы моделировать один вектор за другим, мы можем сделать это быстрее, моделируя (n-1)*nsim значения, а затем положить их в матрицу с (n-1) колонки:

m <- matrix(runif((n - 1)*nsim, -1.5, 1.5), ncol = n - 1)

Номер колонки n является 1 - [sum of first (n-1) columns] (опять же как я понимаю).

m <- cbind(m, 1 - rowSums(m))

Теперь вы можете получить свой z.vec число i как только m[i,],

Другие вопросы по тегам