1. ホーム
  2. r

[解決済み】Rで「non-numeric matrix extent」エラーに対処する方法は?

2022-01-26 12:08:55

質問

標準的な確率式を用いて、学生のt分布からシミュレーション値のデータフレームを生成しようとしています。使用する関数は以下の通りです。

matgen<-function(means,chi,covariancematrix)
{
 cols<-ncol(means);
 normals<-mvrnorm(n=500,mu=means,Sigma = covariancematrix);
 invgammas<-rigamma(n=500,alpha=chi/2,beta=chi/2);
 gen<-as.data.frame(matrix(data=NA,ncol=cols,nrow=500));
 i<-1;
 while(i<=500)
 {
   gen[i,]<-t(means)+normals[i,]*sqrt(invgammas[i]);
   i<=i+1;
 }
return(gen);
}

わかりにくいかもしれませんが、私は空のデータフレームを作ろうとしていて、それは列の数colsと500行に値を取り込みます。もちろん値は数値で、Rは9行目でそれを教えてくれます。

gen<-as.data.frame(matrix(data=NA,ncol=cols,nrow=500));

非数値的な行列の範囲」というエラーが発生しました。

を使った記憶があります。 as.data.frame() を使用して行列をデータフレームに変換したところ、かなりスムーズに動作しました。数値でも。しかし、しばらく連絡を取っていなかったので、この問題の解決策を思い出したり、オンラインで見つけたりすることができないようです。試してみたのは is.numeric() , as.numeric() とか、NAの代わりに0を使ったりしていますが、何もうまくいきません。

解決方法は?

Rolandさんが指摘されたように、colが数値でないようなのが一つの問題点です。meansがデータフレームか行列か、str(mans)などで確認してみてください。もしそうなら、あなたのコードは 'non-numeric matrix extent' というエラーにならないはずです。

また、あなたのコードには他にもいくつか問題があります。私は簡略化した例を作成し、私が見つけたバグをコード内のコメントとして指摘しました。

library(MASS)
library(LearnBayes)

means <- cbind(c(1,2,3),c(4,5,6))
chi <- 10

matgen<-function(means,chi,covariancematrix)
{
  cols <- ncol(means) # if means is a dataframe or matrix, this should work

  normals <- rnorm(n=20,mean=100,sd=10) # changed example for simplification
  # normals<-mvrnorm(n=20,mu=means,Sigma = covariancematrix) 
  # input to mu of mvrnorm should be a vector, see ?mvrnorm; but this means that ncol(means) is always 1 !?

  invgammas<-rigamma(n=20,a=chi/2,b=chi/2) # changed alpha= to a and beta= to b

  gen<-as.data.frame(matrix(data=NA,ncol=cols,nrow=20))

  i<-1
  while(i<=20)
  {
    gen[i,]<-t(means)+normals[i]*sqrt(invgammas[i]) # changed normals[i,] to normals [i], because it is a vector
    i<-i+1 # changed <= to <- 
  }
  return(gen)
}

matgen(means,chi,covariancematrix)

お役に立てれば幸いです。 P.S. Rでは、すべての行の最後に";"は必要ありません。