David G. Tully
2009-Aug-25 19:45 UTC
[R] adding factor scores back to an incomplete dataset...
I am sure there is a simple way to do the following, but i haven't been able to find it. I am hoping a merciful soul on R-help could point me in the right direction. I am doing a factor analysis on survey data with missing values. to do this, I run: FA1<-factanal(na.omit(DATA), factors = X, rotation = 'oblimin', scores = 'regression') Now that I have my factors and factor scores, I want to add those scores back to my original dataset so I can plot factor scores by demographics. However, when I try to add the scores back to the original data frame, the variables are of different lengths. Is there a way to subset from my original data set that will work with factanal() and preserve the original rows or that will allow me to append the factor scores back onto the original dataset with the proper rows and NAs where there could be no data? Again, I apologize if I am missing something basic. I am a self taught R user and couldn't find an answer to this question. Thanks in advance, David
David Winsemius
2009-Aug-25 20:15 UTC
[R] adding factor scores back to an incomplete dataset...
On Aug 25, 2009, at 3:45 PM, David G. Tully wrote:> I am sure there is a simple way to do the following, but i haven't > been able to find it. I am hoping a merciful soul on R-help could > point me in the right direction. > > I am doing a factor analysis on survey data with missing values. to > do this, I run: > > FA1<-factanal(na.omit(DATA), factors = X, rotation = 'oblimin', > scores = 'regression') > > Now that I have my factors and factor scores, I want to add those > scores back to my original dataset so I can plot factor scores by > demographics. However, when I try to add the scores back to the > original data frame, the variables are of different lengths. > > Is there a way to subset from my original data set that will work > with factanal() and preserve the original rows or that will allow me > to append the factor scores back onto the original dataset with the > proper rows and NAs where there could be no data? >Can you post an example of what you are working with? The dput function will create output in a form that can readily be turned into a working example by list readers.> Again, I apologize if I am missing something basic. I am a self > taught R user and couldn't find an answer to this question. > > Thanks in advance, > David-- David Winsemius, MD Heritage Laboratories West Hartford, CT
Mark Difford
2009-Aug-25 21:22 UTC
[R] adding factor scores back to an incomplete dataset...
Hi David,>> I am doing a factor analysis on survey data with missing values. ... Is >> there a way to subset >> from my original data set that will work with factanal() and preserve the >> original rows or that >> will allow me to append the factor scores back onto the original dataset >> with the proper >> rows and NAs where there could be no data?The "trick" is to call factanal with the formula interface, and to specify na.action=na.exclude. This is documented under ?factanal &c and will put NAs in the right place(s) to pad out scores. ## Dummy T.fac <- factanal(~ SrvP+EdcT+EcnD+BdvP+EnvP, data=TTDat, factors=2, na.action=na.exclude, scores="regression") ?na.exclude Regards, Mark. David G. Tully wrote:> > I am sure there is a simple way to do the following, but i haven't been > able to find it. I am hoping a merciful soul on R-help could point me in > the right direction. > > I am doing a factor analysis on survey data with missing values. to do > this, I run: > > FA1<-factanal(na.omit(DATA), factors = X, rotation = 'oblimin', scores = > 'regression') > > Now that I have my factors and factor scores, I want to add those scores > back to my original dataset so I can plot factor scores by demographics. > However, when I try to add the scores back to the original data frame, > the variables are of different lengths. > > Is there a way to subset from my original data set that will work with > factanal() and preserve the original rows or that will allow me to > append the factor scores back onto the original dataset with the proper > rows and NAs where there could be no data? > > Again, I apologize if I am missing something basic. I am a self taught R > user and couldn't find an answer to this question. > > Thanks in advance, > David > > ______________________________________________ > 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. > >-- View this message in context: http://www.nabble.com/adding-factor-scores-back-to-an-incomplete-dataset...-tp25140959p25142328.html Sent from the R help mailing list archive at Nabble.com.
Phil Spector
2009-Aug-25 21:40 UTC
[R] adding factor scores back to an incomplete dataset...
David - Here's the easiest way I've been able to come up with. I'll provide some sample data to make things clearer (hint, hint):> dat = data.frame(matrix(rnorm(100),20,5)) > dat[3,4] = NA > dat[12,3] = NA > scrs = factanal(na.omit(dat),factors=2,scores='regression')$scores > rownames(scrs) = rownames(na.omit(dat)) > newdat = merge(dat,scrs,by=0,all.x=TRUE,sort=FALSE)This will result in the observations with missing values being at the end of the data frame. If you want the original order (assuming default row names), you could use newdat[order(as.numeric(newdat$Row.names)),] A somewhat more complicated approach is, in some sense, more direct:> dat$Factor1 = NA > dat$Factor2 = NA > dat[rownames(na.omit(dat[,-c(6,7)])),c('Factor1','Factor2')] =+ factanal(na.omit(dat[,-c(6,7)]),factors=2,scores='regression')$scores The order of the data is preserved. - Phil Spector Statistical Computing Facility Department of Statistics UC Berkeley spector at stat.berkeley.edu On Tue, 25 Aug 2009, David G. Tully wrote:> I am sure there is a simple way to do the following, but i haven't been able > to find it. I am hoping a merciful soul on R-help could point me in the right > direction. > > I am doing a factor analysis on survey data with missing values. to do this, > I run: > > FA1<-factanal(na.omit(DATA), factors = X, rotation = 'oblimin', scores = > 'regression') > > Now that I have my factors and factor scores, I want to add those scores back > to my original dataset so I can plot factor scores by demographics. However, > when I try to add the scores back to the original data frame, the variables > are of different lengths. > > Is there a way to subset from my original data set that will work with > factanal() and preserve the original rows or that will allow me to append the > factor scores back onto the original dataset with the proper rows and NAs > where there could be no data? > > Again, I apologize if I am missing something basic. I am a self taught R user > and couldn't find an answer to this question. > > Thanks in advance, > David > > ______________________________________________ > 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. >