Hi
I may be completely off track without knowing mnormt package but what
about using while loop for counting rows in "correct" datamat.
#first set your matrix
datamat <-
rmnorm(n=1500,mean=c(mean(sanad[,1]),mean(sanad[,2]),mean(sanad[,3])),varcov=covmat)
#get rid of out of spec values
datamat <- datamat[(datamat[,2] >5) & (datamat[,2] < 86),]
# fill further rows
while(nrow(datamat)<1500) {
dat.temp <- rmnorm(n = 1500-nrow(datamat)
,mean=c(mean(sanad[,1]),mean(sanad[,2]),mean(sanad[,3])),varcov=covmat)
datamat <- rbind(datamat, dat.temp)
}
Regards
Petr
>
> 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.Bonnett at liv.ac.uk
>
>
> [[alternative HTML version deleted]]
>
> ______________________________________________
> R-help at 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.