2016-08-05 2 views
2

私は標準的な確率方程式を使って生徒のt分布からシミュレートされた値のデータフレームを生成しようとしています。次のように私が使用する機能は次のとおりです。Rの '非数値行列のエクステント'エラーに対処するには?

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); 
} 

それは明らかではない場合、私は列と500行のcolsの数に値をとる空のデータフレームを、作成しようとしています。値はもちろん、数値であり、Rは、9行であることを私に伝えます:「非数値行列の範囲」:

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

エラーがあります。

これまではas.data.frame()を使用して行列をデータフレームに変換していましたが、それは非常にスムーズに機能しました。数字でさえ。私はしばらくの間は触れられておらず、この問題の解決策をオンラインで見つけ出すことはできません。 NAの代わりにis.numeric()as.numeric()、0を試しましたが、何も機能しません。

+0

私は問題が 'cols'が数値ではないと信じています。しかし、あなたは関数をどのように呼び出すか、特に '手段 'に渡すものを示していません。 PS: 'for'ループを使うことができるときに' while'ループを使うのは非効率です。しかし、私はループが必要ないとは思わない。 – Roland

+0

@Rolandあなたの助けをありがとう!私は '共分散行列(covariancematrix) 'を使ってその次元を取り出しました。私が学ぶのを助けるために、私はループが必要ないと思う理由を説明できますか? –

答えて

1

Rolandが指摘したように、1つの問題は、そのcolが数値ではないように見えることです。手段がデータフレームまたは行列であるかどうかを確認してください。 str(手段)。そうであれば、あなたのコードはエラーではありません: '数値でない行列の範囲'。

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

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.P.あなたは ";" Rのすべての行の終わりにR

+0

すべての助けをありがとう!特にあなたが入れているすべての追加のビットのために! 'i <='とのエラーは、私がこのエラーを過ぎて自分で解決してしまったので、私がとても馬鹿に感じさせるでしょう。幸いにも、それは現在何百万人ものインターネットユーザーにしか公開されていません。 (:D) 'mvrnorm()'を使っているので、 'normals'は元のコードの行列です。 データフレームであるので、列の数をフェッチするために 'covariancematrix'を使用しましたが、今ではコードが動作します。 –

関連する問題