2016-08-05 1 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); 
} 

을가 명확하지 않으면, 내가 COLS 열 수 500 행에 값을 취 빈 데이터 프레임을 만들려고 해요 다음과 같이 내가 사용하는 기능입니다. 값은 물론 숫자이며, R은 9 번째 행에 다음과 같이 표시합니다.

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

'숫자가 아닌 행렬 범위'오류가 있습니다.

이전에 행렬을 데이터 프레임으로 변환하기 위해 as.data.frame()을 사용한 것을 기억하며 매우 원활하게 작동했습니다. 숫자조차도. 나는 잠시 동안 연락을하지 못했고 온라인에서이 문제에 대한 해결책을 생각하거나 찾지 못하는 것 같습니다. 나는 is.numeric(), as.numeric(), NA 대신 0을 시도했지만 아무것도 작동하지 않습니다.

+0

나는'cols'가 숫자가 아니라고 생각한다. 그러나 함수를 호출하는 방법, 특히 '수단'에 전달하는 함수는 표시하지 않습니다. 추신 :'while' 루프를 사용할 수있을 때'for' 루프를 사용하는 것은 비효율적입니다. 그러나 나는 당신이 루프를 전혀 필요로하지 않는다고 생각합니다. – Roland

+0

@Roland 귀하의 도움에 감사드립니다! 그 차원을 가져 오기 위해'공분산 매트릭스 (covariancematrix) '를 사용했고, 이제는 작동합니다! 내가 배우는 것을 돕기 위해 왜 내가 루프가 필요 없다고 생각하는지 설명 할 수 있겠습니까? –

답변

1

롤랜드가 지적한 것처럼, 한 가지 문제는 그 숫자가 숫자가 아닌 것입니다. 수단이 데이터 프레임 또는 행렬인지 확인하십시오 (예 : 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) 

이 정보가 도움이되기를 바랍니다. 오후 8시 30 분 P.S. 당신은 ";" R에있는 모든 행의 끝에 R

+0

모든 도움에 감사드립니다! 특히 당신이 넣는 모든 추가 비트를 위해! 'i <='와의 오류는 나 자신이이 오류를 지나치게 멍청하게 느끼게 만들었을 것입니다. 운 좋게도, 그것은 수백만 명의 인터넷 사용자에게만 열려 있습니다. (: D)'mvrnorm()'을 사용하고 있기 때문에'normals'는 원래 코드의 행렬입니다. 데이터 프레임이므로 열의 수를 가져 오기 위해'covariancematrix'를 사용했습니다. 이제 코드가 작동합니다. –

관련 문제