metFold<-function( delta, w=matrix(1,dim(delta)[1],dim(delta)[2]), p=2, init="svd", verbose=FALSE, itmax=100, eps=1e-6) { n<-dim(delta)[1]; m<-dim(delta)[2]; itel<-1 delta_plus<-ifelse(delta>=0,delta,0); delta_min<-ifelse(delta<=0,-delta,0) if (init=="svd") { 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) } if (init=="rnd") { x<-matrix(rnorm(n*p),n,p) y<-matrix(rnorm(m*p),m,p) } d<-distRect(x,y); lold<-sum(w*(delta-d)^2) repeat { dd<-ifelse(d>0,d,1) ww<-w*(1+(delta_min/dd)); wr<-rowSums(ww); wc=colSums(ww) v<-solve(diag(wc)+(1/m)-crossprod(ww,ww/wr))-(1/m) b<-w*delta_plus/dd; 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) 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)0,d,1) ww<-w*(1+(delta_min/dd)); wr<-rowSums(ww); wc=colSums(ww) v<-solve(diag(wc)+(1/m)-crossprod(ww,ww/wr))-(1/m) b<-w*delta_plus/dd; 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) 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)0,a*log(b),0) ls<--2*length(which(!is.na(data)))*log(.5) itel<-1 z<-ifelse(is.na(data),0,-4*(data-.5)) repeat{ a<-apply(z,2,mean) z<-z-outer(rep(0,dim(z)[1]),a,"+") sv<-La.svd(z,nu=ndim,nv=ndim,method="dgesdd") x<-sv$u; y<-sv$d[1:ndim]*(sv$v) aa<-(x%*%y)+outer(rep(0,dim(z)[1]),a,"+") if (form=="logit") pr<-1/(1+exp(-aa)) else { pr<-pnorm(aa); pd<-dnorm(aa) } if (correct) tb<-table(as.vector(data),as.vector(ifelse(pr>.5,1,0))) if (extreme) { pe<-pr[which(!is.na(data))] pp<-length(which((pe>(1-cutoff))|(pe",formatC(lt,digits=6,width=12,format="f")) if (correct) cat(" Correct: ",formatC(sum(diag(tb))/sum(tb),digits=6,width=8,format="f")) if (extreme) cat(" Extreme: ",formatC(pp,digits=6,width=8 ,format="f")) cat("\n") if (((ls-lt)0) { x1<--(u+sqrt(w))/v; x2<--(u-sqrt(w))/v; y1<-intercept+(slope*x1); y2<-intercept+(slope*x2) text(x1,y1,as.character(i),col="red") text(x2,y2,as.character(i),col="red") } } dev.off() close(outfile) if (save) list(intercepts=a,rowpoints=x,columnpoints=y,probabilities=pr) }