File: brkdnNest.R

package info (click to toggle)
r-cran-plotrix 2.9-3-2
  • links: PTS, VCS
  • area: main
  • in suites: squeeze
  • size: 960 kB
  • sloc: makefile: 3
file content (63 lines) | stat: -rw-r--r-- 1,898 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
brkdnNest<-function(formula,data,maxlevels=10,mct=mean,lmd=std.error,umd=lmd,
 trueval=NA) {

 if(missing(data) || missing(formula))
  stop("brkdnNest must be called with a formula for breakdown and a data frame.")
 std.error<-function (x,na.rm) {
  vn<-function(x) return(sum(!is.na(x)))
  dimx<-dim(x)
  if(is.null(dimx)) {
   stderr<-sd(x,na.rm=TRUE)
   vnx<-vn(x)
  }
  else {
   if(is.data.frame(x)) {
    vnx<-unlist(sapply(x,vn))
    stderr<-unlist(sapply(x, sd, na.rm = TRUE))
   }
   else {
    vnx<-unlist(apply(x,2,vn))
    stderr<-unlist(apply(x,2,sd,na.rm = TRUE))
   }
  }
  return(stderr/sqrt(vnx))
 }
 propbrk<-function(x,trueval=TRUE) {
  proptab<-table(x)
  prop<-proptab[which(names(proptab)==trueval)]/sum(proptab)
  return(prop)
 }
 bn<-as.character(attr(terms(formula),"variables")[-1])
 nbn<-length(bn)
 mctlist<-list()
 if(is.na(trueval)) {
  mctlist[[1]]<-do.call(mct,list(data[bn[1]],na.rm=TRUE))
  for(brklev in 2:nbn)
   mctlist[[brklev]]<-by(data[bn[1]],data[bn[2:brklev]],mct,na.rm=TRUE,
    simplify=FALSE)
 }
 else {
  mctlist[[1]]<-do.call(propbrk,list(data[bn[1]],trueval=trueval))
  for(brklev in 2:nbn)
   mctlist[[brklev]]<-by(data[bn[1]],data[bn[2:brklev]],propbrk,trueval=trueval,
    simplify=FALSE)
 }
 barlabels<-list(bn[1])
 for(brklev in 2:nbn) barlabels[[brklev]]<-dimnames(mctlist[[nbn]])[[brklev-1]]
 names(barlabels)<-c("Overall",names(dimnames(mctlist[[nbn]])))
 lmdlist<-list()
 if(!is.null(lmd)) {
  lmdlist[[1]]<-do.call(lmd,list(data[[bn[1]]],na.rm=TRUE))
  for(brklev in 2:nbn)
   lmdlist[[brklev]]<-by(data[[bn[1]]],data[bn[2:brklev]],lmd,na.rm=TRUE,
    simplify=FALSE)
 }
 umdlist<-list()
 if(!is.null(umd)) {
  umdlist[[1]]<-do.call(umd,list(data[[bn[1]]],na.rm=TRUE))
  for(brklev in 2:nbn)
   umdlist[[brklev]]<-by(data[[bn[1]]],data[bn[2:brklev]],umd,na.rm=TRUE,
    simplify=FALSE)
 }
 return(list(mctlist,lmdlist,umdlist,barlabels))
}