Что это за не числовая c матричная ошибка экстента в R? - PullRequest
0 голосов
/ 04 апреля 2020

Я пытаюсь применить функцию к моему списку, но она возвращает эту ошибку

"не числовое значение c ошибка экстента матрицы"

вот мой код

ошибка В последних нескольких строках код работает до конца, и из-за этого я не могу построить свои графики, которые я искал в Интернете, но не могу найти ничего полезного, и я не вижу, что не так с кодом



#Question 1
set.seed(10000)

v <- c(0.1,0.5,1,2,5,10,100)

lyst <- list()

for(i in v)
{
  for(j in v)
  {
    elementname <- paste0(as.character(i),"-",as.character(j))
    print(elementname)
    lyst[[elementname]] <- rgamma(10000,i,j)
  }
}
#Question 2
pdf("Question2.pdf",width = 20, height = 10)
par(mfcol=c(7,7))
for(x in names(lyst))
{
  hist(lyst[[x]],
       xlab = "Value",
       main = paste("Alpha-Lambda:",x))
}
dev.off()

#Question 3
theoretical_mean <- matrix(ncol=7,nrow=7,dimnames=list(as.character(v), as.character(v)))
theoretical_var <- matrix(ncol=7,nrow=7,dimnames=list(as.character(v), as.character(v)))
for (i in 1:7)
{
  for (j in 1:7)
  {
    theoretical_mean[j,i] <- as.character(v[i]/v[j])
    theoretical_var[j,i] <- as.character(v[i]/(v[j]^2))
  }
}

sample_mean <-lapply(lyst, mean)
sample_mean <- as.data.frame(matrix(unlist(sample_mean),nrow = 7, ncol = 7, byrow = T))
sample_mean <- round(sample_mean,digits = 3)
sample_mean <- data.matrix(sample_mean, rownames.force = NA)

sample_var <-lapply(lyst, var)

sample_var <- as.data.frame(matrix(unlist(sample_var),nrow = 7, ncol = 7, byrow = T))
sample_var <- round(sample_var,digits = 3)
sample_var <- data.matrix(sample_var, rownames.force = NA)

theor_sample_mean <- matrix(paste(theoretical_mean, sample_mean, sep=" - "),nrow=7,dimnames = dimnames(theoretical_var))
theor_sample_var <- matrix(paste(theoretical_var, sample_var, sep=" - "),nrow=7,dimnames= dimnames(theoretical_var))

sink("Q3.txt")
cat("Theoretical Mean vs. Sample Mean:\n")
print(as.table(theor_sample_mean))
cat("\n")
cat("Theoretical Variance vs. Sample Variance:\n")
print(as.table(theor_sample_var))
sink()

#Question 4
nmean <- function(x)
{
  m <- matrix(nrow=nrow(x))
  for (j in 1:ncol(x))
  {
    v <- c()
    for(i in 1:nrow(x))
    {
      v <- c(v,mean(x[1:i,j]))
    }
    m <- cbind(m,v)
  }
  m <- m[,-1]
  colnames(m) <- colnames(x)
  rownames(m) <- NULL
  return(m)
}
sequentialMeans <- lapply(lyst,nmean)

pdf("Question4.pdf",width=15,height=10)
for (i in 1:7)
{
  for (j in 1:7)
  {
    plot(y=sequentialMeans[[i]][,j],x=1:10000,xlab="n value",ylab="Values", main=paste("Alpha-Lambda:",colnames(lyst[[i]])[j]),type="l")
  }
}
dev.off()


1 Ответ

1 голос
/ 04 апреля 2020

Проблема с вашим кодом заключается в том, что формат данных ввода для функции nmean в соответствии со строками

nmean <- function(x)
{
  m <- matrix(nrow=nrow(x))
  for (j in 1:ncol(x))
  {
    v <- c()
    for(i in 1:nrow(x))
    {
      v <- c(v,mean(x[1:i,j]))
    }
    m <- cbind(m,v)
  }
  m <- m[,-1]
  colnames(m) <- colnames(x)
  rownames(m) <- NULL
  return(m)
}

является матрицей, и вы хотите, чтобы векторы векторов значений гамма-распределения передавались как указано в следующих строках

lyst <- list()

for(i in v)
{
  for(j in v)
  {
    elementname <- paste0(as.character(i),"-",as.character(j))
    print(elementname)
    lyst[[elementname]] <- rgamma(10000,i,j)
  }
}

Для x с типом-вектором функции ncol(x) и nrow(x) возвращают NULL. Кроме того, нет возможности применения ncol(x).

Если вы хотите сохранить свой подход, вам нужно подумать о преобразовании ваших данных в матричный формат или, альтернативно, использовать векторный формат, но использовать совместимые с вектором функции length(x) для длины вектора и names(lyst) для имен.


Обновление:

Код в комментариях работает, но вы должны изменить выражение lapply, поскольку теперь у вас есть матрица, которую вы можете использовать в качестве ввода для nmean Функция напрямую. Следующий код работает для генерации sampleMeans и позволяет избежать исходного сообщения об ошибке вашего вопроса. Для сокращения времени выполнения требуется всего 100 образцов.

#Question 1
set.seed(10000)

v <- c(0.1,0.5,1,2,5,10,100)

lyst <- list()

for(i in v)
{
  for(j in v)
  {
    elementname <- paste0(as.character(i),"-",as.character(j))
    print(elementname)
    lyst[[elementname]] <- rgamma(100,i,j)
  }
}
#Question 2
pdf("Question2.pdf",width = 20, height = 10)
par(mfcol=c(7,7))
for(x in names(lyst))
{
  hist(lyst[[x]],
       xlab = "Value",
       main = paste("Alpha-Lambda:",x))
}
dev.off()

#Question 3
theoretical_mean <- matrix(ncol=7,nrow=7,dimnames=list(as.character(v), as.character(v)))
theoretical_var <- matrix(ncol=7,nrow=7,dimnames=list(as.character(v), as.character(v)))
for (i in 1:7)
{
  for (j in 1:7)
  {
    theoretical_mean[j,i] <- as.character(v[i]/v[j])
    theoretical_var[j,i] <- as.character(v[i]/(v[j]^2))
  }
}

sample_mean <-lapply(lyst, mean)
sample_mean <- as.data.frame(matrix(unlist(sample_mean),nrow = 7, ncol = 7, byrow = T))
sample_mean <- round(sample_mean,digits = 3)
sample_mean <- data.matrix(sample_mean, rownames.force = NA)

sample_var <-lapply(lyst, var)

sample_var <- as.data.frame(matrix(unlist(sample_var),nrow = 7, ncol = 7, byrow = T))
sample_var <- round(sample_var,digits = 3)
sample_var <- data.matrix(sample_var, rownames.force = NA)

theor_sample_mean <- matrix(paste(theoretical_mean, sample_mean, sep=" - "),nrow=7,dimnames = dimnames(theoretical_var))
theor_sample_var <- matrix(paste(theoretical_var, sample_var, sep=" - "),nrow=7,dimnames= dimnames(theoretical_var))

sink("Q3.txt")
cat("Theoretical Mean vs. Sample Mean:\n")
print(as.table(theor_sample_mean))
cat("\n")
cat("Theoretical Variance vs. Sample Variance:\n")
print(as.table(theor_sample_var))
sink()

lyst = matrix(unlist(lyst), ncol = 7, byrow = TRUE) 
colnames(lyst) = c("100-0.1","100-0.5","100-1","100-2","100-5","100-10","100-100")
#Question 4
nmean <- function(x)
{
  m <- matrix(nrow=nrow(x))
  for (j in 1:ncol(x))
  {
    v <- c()
    for(i in 1:nrow(x))
    {
      v <- c(v,mean(x[1:i,j]))
    }
    m <- cbind(m,v)
  }
  m <- m[,-1]
  colnames(m) <- colnames(x)
  rownames(m) <- NULL
  return(m)
}
sequentialMeans <- nmean(lyst)

Также обратите внимание, что вам нужно настроить код для Q4, то есть генерацию графика. Следующий код работает.

pdf("Question4.pdf",width=15,height=10)
    for (i in 1:7)
    {
      for (j in 1:7)
      {
        plot(y=sequentialMeans[,j],x=1:700,xlab="n value",ylab="Values", main=paste("Alpha-Lambda:",colnames(lyst[,j]),type="l"))
      }
    }
    dev.off()

Дайте мне знать, если это поможет.

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