Динамический вектор имен: увеличение от 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,]
,