If you want to generate truncated distributions, package 'tmvtnorm' can help you out.
Regards, Denes >> >> Dear all, >> >> I know there have been various questions posted over the years about > loops >> but I'm afraid that I'm still stuck. I am using Windows XP and R 2.9.2. >> I am generating some data using the multivariate normal distribution >> (within the 'mnormt' package). [The numerical values of sanad and covmat > >> are not important.] >> > datamat <- rmnorm(n=1500,mean=c(mean(sanad[,1]),mean(sanad[,2]),mean >> (sanad[,3])),varcov=covmat) >> >> The middle column of 'datamat' is simulated data for age. Obviously > some >> of the simulated values are not going to be sensible. Therefore I'd > like >> to set up a function that looks at each row of 'datamat' and if the > value >> for the middle column is <5 or >86 then the whole row is replaced by >> another imputed row. Of course, the problem is that the imputed value > for >> age may be outside my acceptable range too. >> >> If there a way to set up a loop such that it keeps checking each row > until >> the values are within the range? >> >> So far I have the following but this doesn't repeat the process. >> ctstrunk <- function(data) >> { >> for(i in 1:nrow(data)){ >> if(data[i,2]<5) >> data[i,]<-rmnorm(n=1,mean=c(mean(sanad[,1]),mean(sanad[, >> 2]),mean(sanad[,3])),varcov=covmat) >> if(data[i,2]>86) >> data[i,]<-rmnorm(n=1,mean=c(mean(sanad[,1]),mean(sanad[, >> 2]),mean(sanad[,3])),varcov=covmat) >> } >> return(data) >> } >> >> I thought of perhaps a repeat loop such as the following but this loop >> never stops... >> ctstrunk <- function(data) >> { >> repeat{ >> for(i in 1:nrow(data)){ >> if(data[i,2]<5) >> data[i,]<-rmnorm(n=1,mean=c(mean(sanad[,1]),mean(sanad[, >> 2]),mean(sanad[,3])),varcov=covmat) >> if(data[i,2]>5){break} >> } >> repeat{ >> for(i in 1:nrow(data)){ >> if(data[i,2]>86) >> data[i,]<-rmnorm(n=1,mean=c(mean(sanad[,1]),mean(sanad[, >> 2]),mean(sanad[,3])),varcov=covmat) >> if(data[i,2]<86){break} >> } >> return(data) >> } >> >> I have also tried a while loop but again, the function didn't stop >> ctstrunk <- function(data) >> { >> for(i in 1:nrow(data)){ >> while(data[i,2]<5) > data[i,]<-rmnorm(n=1,mean=c(mean(sanad >> [,1]),mean(sanad[,2]),mean(sanad[,3])),varcov=covmat) >> while(data[i,2]>86) > data[i,]<-rmnorm(n=1,mean=c(mean(sanad >> [,1]),mean(sanad[,2]),mean(sanad[,3])),varcov=covmat) >> } >> return(data) >> } >> >> Many thanks for any assistance you can offer. >> >> Kind regards, >> Laura >> >> Laura Bonnett >> Research Assistant >> Department of Biostatistics >> University of Liverpool >> >> Telephone: 0151 7944059 >> Email: l.j.bonn...@liv.ac.uk >> >> >> [[alternative HTML version deleted]] >> >> ______________________________________________ >> R-help@r-project.org mailing list >> https://stat.ethz.ch/mailman/listinfo/r-help >> PLEASE do read the posting guide > http://www.R-project.org/posting-guide.html >> and provide commented, minimal, self-contained, reproducible code. > > ______________________________________________ > R-help@r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide > http://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code. > ______________________________________________ R-help@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.