On Thu, Nov 8, 2012 at 4:57 PM, Fares Said <frespider at hotmail.com> wrote:
Hi Micheal, Please Can you tell me how I do that?
How to do what? I wrote you a very long reply with many nouns.... I'll assume you mean keeping your reply on list: it's what I've done differently than you in each step of our communication up to now -- making sure that r-help at r-project.org is in the cc: field of your email. Depending on your mail client, this is as easy as hitting "reply all" instead of "reply." Michael Weylandt
THanks
From: michael.weylandt at gmail.com Date: Thu, 8 Nov 2012 16:46:14 +0000 Subject: Re: [R] Calling R object from R function To: frespider at hotmail.com; r-help at r-project.org On Thu, Nov 8, 2012 at 2:44 PM, Fares Said <frespider at hotmail.com> wrote:
Hi Michael, you mentioned I can get help, can you give more details please.
Hi Fares, I also asked that you keep our correspondance on the mailing list. Please do so. If you want private help, you can seek a local statistical consultancy, but free help is available here, if you follow protocol.
I also edited the example to make productive.
But I'm not using Nabble and neither are most of your other potential respondents: if you want to use an email help list, it's much better to use email. For instance, if we check the official R help archives -- https://stat.ethz.ch/pipermail/r-help/2012-November/328391.html -- you'll see your post wasn't changed. It's rather wretched that Nabble allows that, in my opinion, as it invalidates conversations.
and you might tell me to create the M1 function on the get.m function but I prefer not because I have 9 to ten function and they have lots statement and I prefer to keep them separate
I've copied your Nabble post here:
-------------------------------------------------------
a0=rep(1,40)
a=rep(0:1,20)
b=c(rep(1,20),rep(0,20))
c0=c(rep(0,12),rep(1,28))
c1=c(rep(1,5),rep(0,35))
c2=c(rep(1,8),rep(0,32))
c3=c(rep(1,23),rep(0,17))
c4=c(rep(1,6),rep(0,34))
x=matrix(cbind(a0,a,b,c0,c1,c2,c3,c4,rnorm(40)),nrow=40,ncol=9)
Dat <- cbind(x,rnorm(40,2,30));colnames(Dat) <-
c("a0","a","b","c0","c1","c2","c3","c4","c5","Y")
M1 <- function(Trdat,Tedat,mdat,nsam,conv){
M1list <- NULL
vectx <- c(1,4,6,7,9)
vectz <- c(2,3,7,1,4,9)
X <- Trdat[,vectx]
Z <- Trdat[,vectz]
Y <- Trdat[,ncol(Trdat)]
TesX <- Tedat[,vectx]
TesZ <- Tedat[,vectz]
TesY <- Tedat[,ncol(Tedat)]
Treig <- eigen(crossprod(X))$values
if(any(abs(Treig) < conv))stop("In M1 the design matrix (X) is
singular for simulation ",paste(nsam))
Comp <- c("nCol(X)"= ncol(X),"nCol(Z)"= ncol(Z),"Is
length(Y)=nrow(X)"= length(Y)==nrow(X),
"Is length(Y)=nrow(Z)"= length(Y)==nrow(Z))
M1list$vectx <- vectx
M1list$vectz <- vectz
M1list$X <- X
M1list$Z <- Z
M1list$Y <- Y
M1list$TesX <- TesX
M1list$TesZ <- TesZ
M1list$TesY <- TesY
M1list$Comp <- Comp
return(M1list)
}
get.m <- function(dat,asim,ModelFun,M,conv){
Sim <- list()
modInd <- ModelFun(Trdat=dat,Tedat=dat,mdat=dat,nsam=-1,conv=conv) #
HERE WHERE I NEED HELP i only need to import vectx and vectz that is
why I set Trdat=Tedat=dat
if(M==1){
vecx <- modInd$vectx
vecz <- modInd$vectz
px <- length(vecx)
pz <- length(vecz)
pk <- length(modInd$Comp)
nam <-colnames(dat[,vecx])
Asse <- matrix(NA,nrow=asim,ncol=px)
Check <- matrix(NA,nrow=pk,ncol=asim)
colnames(Check) <- paste("CheckIter",1:asim,sep="")
}
else {
vecx <- modInd$vectx
vecz <- modInd$vectz
px <- length(vecx)
pz <- length(vecz)
pk <- length(modInd$Comp)
nam <-colnames(dat[,vecx])
Asse <- matrix(NA,nrow=asim,ncol=px)
Check <- matrix(NA,nrow=pk,ncol=asim)
colnames(Check) <- paste("CheckIter",1:asim,sep="")
}
for(k in 1:asim){
cat("Iter #",paste(k),"\n")
#==========================================================================================
# Start Sampling code
#==========================================================================================
# Sample the Index for Train Set
set.seed(k)
Indx<-sample(1:nrow(dat),nrow(dat),replace=T)
SamDat <- dat[Indx,]
# Split Data
set.seed(k)
TrainInd <- sample(1:nrow(SamDat), trunc(2*length(1:nrow(SamDat))/3))
# Sample 2/3 of the data
TrSet <- SamDat[TrainInd,] # Train data
######## Hold 1/3 of the data
TeSet <- SamDat[-TrainInd,] # hold 1/3 of the data
Trind <- ceiling((2*length(Indx))/3)
Model <- ModelFun(Trdat=TrSet,Tedat=TeSet,mdat=dat,nsam=k,conv=conv)
Y <- Model$Y
X <- Model$X
Z <- Model$Z
TesX <- Model$TesX
TesZ <- Model$TesZ
TesY <- Model$TesY
xnam <-colnames(X)
znam <-colnames(Z)
pc <- ncol(X)
fmla <- as.formula(paste("Y ~",paste(xnam, collapse= "+"),"-1",sep=""))
fitlm <- lm(formula=fmla,data = data.frame(cbind(X,Y)))
ResiSqr <- (residuals(fitlm))*(residuals(fitlm))
Check[,k] <- Model$Comp
Asse[k,1:pc] <- coef(fitlm)
}
Sim$Check <- Check
Sim$Asse <- Asse
return(Asse)
}
get.m(dat=Dat,asim=6,ModelFun=M1,M=1,conv=1e-4)
------------------------------------------------------
Your code is quite messy and difficult to follow: I'd write it as follows:
# Initialize some data
Dat <- cbind(
a0 = rep(1, 40),
a = rep(0:1, 20),
b = rep(c(1,0), each = 20),
c0=c(rep(0,12),rep(1,28)),
c1=c(rep(1,5),rep(0,35)),
c2=c(rep(1,8),rep(0,32)),
c3=c(rep(1,23),rep(0,17)),
c4=c(rep(1,6),rep(0,34)),
Y = rnorm(40,2,30))
M1 <- function(Trdat,Tedat,mdat,nsam,conv){
vectx <- c(1,4,6,7,9)
vectz <- c(2,3,7,1,4,9)
X <- Trdat[,vectx]
Z <- Trdat[,vectz]
Y <- Trdat[,ncol(Trdat)]
TesX <- Tedat[,vectx]
TesZ <- Tedat[,vectz]
TesY <- Tedat[,ncol(Tedat)]
Treig <- eigen(crossprod(X))$values
if(any(abs(Treig) < conv))
stop("In M1 the design matrix (X) is singular for simulation ", nsam)
Comp <- c(`nCol(X)`= ncol(X),`nCol(Z)`= ncol(Z),
`Is length(Y)=nrow(X)` = length(Y)==nrow(X),
`Is length(Y)=nrow(Z)` = length(Y)==nrow(Z))
list(vectx = vectx,
vectz = vectz,
X = X, Z = Z, Y = Y,
TesX = TesX, TesZ = TesZ,
TesY = TesY, Comp = Comp)
}
with similar modifications throughout the rest of your code. Hopefully
you find that easier to read: I certainly do.
Now, it's still not entirely clear to me what you're asking: but
perhaps global assignment and/or lexical scoping does what you want?
Consider these tricks:
#########################
add_magic_Z <- function(z){
Z <- z
function(x) x + z
}
add_2 <- function(2)
add_2(5) # 7
add_3 <- function(3)
add_3(0) # 3
##########################
f <- function(x) {
X <<- X + x
return(x^2)
}
X <- -3
f(5)
f(10)
print(X) # increased by the `<<-` inside of f()
###########################
The latter is considered bad programming practice however.
Cheers,
Michael