Как вызвать переменную из матрицы ... из списка? - PullRequest
0 голосов
/ 27 мая 2019

По сути, это в заголовке. Более подробно, однако, у меня есть четыре набора параметров, которые должны быть организованы в матрицы, которые я организовал в виде списка (Alphaset), каждый из которых имеет 4 переменные. Но мне нужно вызвать конкретные переменные в цикле, где он пройдет через уравнение и должен дать мне график.

Я и мои плохие знания R пробовали разные комбинации, которые приводили к неэффективности, такие как "Alphaset [2,1,1]" или "Alphaset [2 (1,1)]" (это пример, в котором я хочу отобразить переменную, которая является первой строкой первого столбца второй матрицы).

#Parameters set on types (lambda 1, lambda 2, alphas)

Lambda1set<-c(5,5,3,3.2)
Lambda2set<-c(4,4,5,3)
Alphaset<-list(matrix(c(0.01, 0.007, 0.0045, 0.01),ncol = 2, byrow = TRUE),
            matrix(c(0.01, 0.003, 0.007, 0.01),ncol = 2, byrow = TRUE),
            matrix(c(0.01, 0.0055, 0.003, 0.01),ncol = 2, byrow = TRUE),
            matrix(c(0.005, 0.005, 0.0045, 0.004),ncol = 2, byrow = TRUE))

#Creating vectors
TimeVec<-seq(0,years,1)
N1<-matrix(0,4,years+1)
N2<-matrix(0,4,years+1)

#INITIALIZATION
N0 <- 40
N1[1] <-N0
N2[1] <-N0

for (t in 1:years){
  for(i in 1:4){
  N1[i,t+1]<-(Lambda1set[i]*N1[i,t])/(1+alphs[1,1]*N1[i,t]+alphs[1,2]*N2[i,t])
  N2[i,t+1]<-(lambda2set[i]*N2[i,t])/(1+alphs[2,1]*N1[i,t]+alphs[2,2]*N2[i,t])
  }
}

plot(TimeVec,N1,type="l",xlab='Time (years)',ylab='Population Density',col='blue', 
     lwd = 2,ylim = c(0,400))

Здесь вы можете видеть в уравнениях, что "alphs [.., ..]" должны представлять, какую переменную из каждой матрицы i я хочу использовать.

Но как мне их назвать в отношении моего списка матриц?

Ответы [ 2 ]

0 голосов
/ 27 мая 2019

Как это?

years <- 10
Lambda1set<-c(5,5,3,3.2)
Lambda2set<-c(4,4,5,3)
Alphaset<-list(matrix(c(0.01, 0.007, 0.0045, 0.01),ncol = 2, byrow = TRUE),
               matrix(c(0.01, 0.003, 0.007, 0.01),ncol = 2, byrow = TRUE),
               matrix(c(0.01, 0.0055, 0.003, 0.01),ncol = 2, byrow = TRUE),
               matrix(c(0.005, 0.005, 0.0045, 0.004),ncol = 2, byrow = TRUE))
dat <- lapply(1:length(Alphaset), function(i) {
  list(Lambda1=Lambda1set[i], Lambda2=Lambda2set[i], alphs=Alphaset[[i]])
})

#Creating vectors
TimeVec<-seq(0,years,1)
N1<-matrix(0,4,years+1)
N2<-matrix(0,4,years+1)

#INITIALIZATION
N0 <- 40

require(dplyr)
require(ggplot2)
lapply(seq_along(dat), function(i) {
  dati <- dat[[i]]
  N1 <- array(N0, dim=c(years+1))
  N2 <- array(N0, dim=c(years+1))
  for (t in 1:years) {
    N1[t+1]<-(dati$Lambda1*N1[t])/(1+dati$alphs[1,1]*N1[t]+dati$alphs[1,2]*N2[t])
    N2[t+1]<-(dati$Lambda2*N2[t])/(1+dati$alphs[2,1]*N1[t]+dati$alphs[2,2]*N2[t])
  }
  return(data.frame(i=i, Time=TimeVec, N1=N1, N2=N2))
}) %>%
  bind_rows() %>%
  mutate(i=factor(i)) %>%
  gather("Variable", "Value", -Time, -i) %>%
  ggplot(aes(x=Time, y=Value, color=Variable)) +
    geom_line() +
    ylab("Population Density") +
    theme_bw() +
    facet_grid(i~.)

![enter image description here

0 голосов
/ 27 мая 2019

Просто определите переменную alphs следующим образом:

alphs <- Alphaset[[i]]

сразу после строки 21: for(i in 1:4){

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...