require(gifi) logitFold<-function( data, # data (in data frame) ndim=2, # dimensionality (default 2) rank=ndim, # which quantification ranks (default all ndim) level="NO", # which quantification levels (default all nominal) outeps=1e-4, ineps=1e-4, reg=1e-6, rule="dist", outmax=500, inmax=1, objplot=TRUE, voronoi=FALSE) { nobj<-dim(data)[1]; nvar<-dim(data)[2]; pdev<-Inf name<-deparse(substitute(data)) if (length(rank)==1) rank<-rep(rank,nvar) if (length(level)==1) level<-rep(level,nvar) xy<-homals(data,ndim=ndim,save=TRUE,outwrite=FALSE,silent=TRUE); x<-xy$x; yh<-xy$y y<-matrix(0,0,ndim); wgt<-matrix(0,nobj,0); itel<-1 for (j in 1:nvar) { y<-rbind(y,yh[[j]]) u<-as.factor(data[,j]); h<-levels(u); k<-length(h) wgt<-cbind(wgt,ifelse(is.na(outer(u,h,"==")),0,1)) } repeat { targ<-matrix(0,nobj,0); dist<-matrix(0,nobj,0); prob<-matrix(0,nobj,0) jind<-0; dev<-0; mdd<-0 for (j in 1:nvar) { u<-as.factor(data[,j]); h<-levels(u); k<-length(h) gj<-ifelse(outer(u,h,"=="),1,0) gj<-ifelse(is.na(gj),0,gj) yj<-y[(jind+1):(jind+k),] if (rule=="dist") dj<-distRect(x,yj,reg) if (rule=="dist2") dj<-dist2Rect(x,yj) pj<-exp(-dj); pj<-pj/rowSums(pj) md<-gj-pj; mdd<-mdd+sum(md^2) targ<-cbind(targ,dj-(2*md)) dist<-cbind(dist,dj); prob<-cbind(prob,pj) jind<-jind+k; dev<-dev-sum(gj*log(pj)) } dev<-dev+mdd if (rule=="dist") uu<-smacofRect(targ,w=wgt,init=list(x,y),itmax=inmax,reg=reg,verbose=FALSE) if (rule=="dist2") uu<-alscalRect(targ,w=wgt,init=list(x,y),itmax=inmax,verbose=FALSE,ithist=FALSE) cat("Iteration: ",formatC(itel,digits=6,width=6), "Deviance: ",formatC(dev+mdd,digits=6,width=12,format="f"), "\n") if ((itel == outmax) || ((pdev-dev)=0,delta,0); delta_min<-ifelse(delta<=0,-delta,0) if (is.list(init)) { x<-init[[1]]; y<-init[[2]] } else { e<-delta_plus^2; e<--0.5*(e-outer(rowSums(e)/m,colSums(e)/n,"+")+(sum(e)/(n*m))) z<-svd(e,nu=p,nv=0); x<-z$u; y<-crossprod(e,x) } d<-distRect(x,y,reg); lold<-sum(w*(delta-d)^2) repeat { ww<-w*(1+(delta_min/d)); wr<-rowSums(ww); wc<-colSums(ww) v<-solve(diag(wc)+(1/m)-crossprod(ww,ww/wr))-(1/m) b<-w*delta_plus/d; br<-rowSums(b); bc<-colSums(b) xraw<-(br*x)-(b%*%y); yraw<-(bc*y)-crossprod(b,x) y<-v%*%(yraw+crossprod(ww,xraw/wr)); x<-(xraw+(ww%*%y))/wr; d<-distRect(x,y,reg) lnew<-sum(w*(delta-d)^2) if (verbose) { cat("Iteration: ",formatC(itel,digits=6,width=6), " Stress: ",formatC(lold,digits=6,width=12,format="f"), " ==>",formatC(lnew,digits=6,width=12,format="f"),"\n") } if (((lold-lnew)",formatC(lnew,digits=6,width=12,format="f"),"\n") } if (((lold-lnew)",formatC(sstress,digits=6,width=12,format="f"),"\n") } if (((psstress-sstress) 1e-10) } is.neg<-function(x) { return(x < -1e-10) } distRect<-function(x,y,reg) { return(sqrt(reg+outer(rowSums(x^2),rowSums(y^2),"+")-2*x%*%t(y))) } dist2Rect<-function(x,y) { return(outer(rowSums(x^2),rowSums(y^2),"+")-2*x%*%t(y)) }