Combining automatically factor levels with trees
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.
Last year, in a post, I discussed how to merge levels of factor variables, using combinatorial techniques (it was for my STT5100 cours, and trees are not in the syllabus), with an extension on trees at the end of the post.
consider the following (simulated dataset)
n=200 set.seed(1) x1=runif(n) x2=runif(n) y=1+2*x1-x2+rnorm(n,0,.2) LB=sample(LETTERS[1:10]) b=data.frame(y=y,x1=x1, x2=cut(x2,breaks= c(-1,.05,.1,.2,.35,.4,.55,.65,.8,.9,2), labels=LB)) str(b) 'data.frame': 200 obs. of 3 variables: $ y : num 1.345 1.863 1.946 2.481 0.765 ... $ x1: num 0.266 0.372 0.573 0.908 0.202 ... $ x2: Factor w/ 10 levels "I","A","H","F",..: 4 4 6 4 3 6 7 3 4 8 ... table(b$x2)[LETTERS[1:10]] A B C D E F G H I J 11 12 23 34 23 36 12 32 3 14
Just by looking at the data (see the previous post), we could easily get the feeling that 10 levels was too much.
Following my post, Przemyslaw sent a comment suggesting to use
library(factorMerger)
It is indeed a nice package (unless you have really really big datasets with a lot of categories in your factor variables – as I experienced recently), and you can get great graphs
MF = mergeFactors(response = b$y, factor = b$x2, family = "gaussian") plot(MF)
Here is suggests to create three categories. Recall that with student t-tests (changing the reference), we got
Another interesting package, by Piro Polo, is
library(tree.bins)
To use it, we simply call the following function, and we transform automatically our dataset : the continuous variables remain unchanged, and (possibly) categories of categorical variables are merged
b.bins = tree.bins(data=b, y=y) str(b.bins) Classes ‘data.table’ and 'data.frame': 200 obs. of 3 variables: $ y : num 1.345 1.863 1.946 2.481 0.765 ... $ x1: num 0.266 0.372 0.573 0.908 0.202 ... $ x2: chr "Group.4" "Group.4" "Group.4" "Group.4" ... - attr(*, ".internal.selfref")= table(b.bins$x2) Group.1 Group.2 Group.3 Group.4 23 35 26 116
here in four groups. To get the correspondance, use
tree.bins(data=b, y=y, return = "lkup.list") [[1]] x2 Categories 1 E Group.1 2 G Group.2 3 C Group.2 4 B Group.3 5 J Group.3 6 I Group.4 7 A Group.4 8 H Group.4 9 F Group.4 10 D Group.4
(we have a list with one element, one dataframe, since there is only one factor variable). Cool, isn’t it ? I miss Przemyslaw’s plot, but this is rather quick, and efficient..
R-bloggers.com offers daily e-mail updates about R news and tutorials about learning R and many other topics. Click here if you're looking to post or find an R/data-science job.
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.