[R] Using sapply instead of for loop

Charles Determan Jr deter088 at umn.edu
Wed Nov 19 19:18:03 CET 2014


Ah, this is because you are overwriting your 'A' with each loop.  As a
simple way to demonstrate this I changed:

A<-array(, c(maxval,maxval,maxval,maxval,maxval,maxval, 2))

to

A <- list()

and then I changed
A <- sapply((1:Permax),function(p) far(p, i, j, k, l, m,n,
ervalue),simplify=FALSE)

to

A<-append(A, sapply((1:Permax),function(p) far(p, i, j, k, l, m,n,
ervalue),simplify=FALSE))

Once the run is complete you can find the 6.28757 in A[126].  You can
easily create another index so you can find it easily in the list but the
ervalue is indeed , , 2,2,2,1,2 as you show above.


On Wed, Nov 19, 2014 at 11:46 AM, Amit Thombre <amitmt at techmahindra.com>
wrote:

>  The following is printed for  i,j,k,l,m,n,p 2 2 2 2 2 1 2
>
> "Value of error 6.281757Value of i,j,k,l,m,n,p 2 2 2 2 2 1 2, , 1, 1, 1,
> 1, 1"
>  Thus ervalue[2,2,2,2,2,1,2] should be 6.28175, But after all the runs if
> you try to get this array value it is NA. Also I think A is a list so not
> sure how to extract the same but the following is displayed for the same
> array as ervalue for A when I type A after all the runs .
> , , 2, 2, 2, 1, 2
>      [,1] [,2]
> [1,]   NA   NA
> [2,]   NA   NA
>  The ervalue itself loses the values , I think and hence A does not have
> it.
>
>  ------------------------------
> *From:* Charles Determan Jr [deter088 at umn.edu]
> *Sent:* Wednesday, November 19, 2014 10:04 PM
>
> *To:* Amit Thombre
> *Cc:* r-help at r-project.org
> *Subject:* Re: [R] Using sapply instead of for loop
>
>   The following provides array A with 3.212016 as the last value.  The
> error values are indeed in the array here.  There is also another with
> 6.281757 that I noticed at first glance.
>
>  errf<-function(act, res, testsize, flag)
> {
>   j=1
>   if(flag==1)
>   {
>     j<-nrow(d)-testsize
>   }
>
>   print(act)
>   print(res)
>   print(flag)
>   diff<-0
>   s<-0
>   # loop for iterating to each value of the actual value and finding the
> difference with thepredicted value
>   for (mn in 1:length(act))
>   {
>     cat("Value of mn in err", mn)
>     cat("Value of j in err", j)
>     cat("Value of res[j] in err", res[j])
>     diff<-(act[mn]-res[j])
>     print(act[mn])
>     print(res[j])
>     print(diff)
>     s<-s+(diff*diff)
>
>     j<-j+1
>   }
>
>   er1<-sqrt(s/length(act)) #forecasting error
>   print(er1)
>   return(er1)
> }
>
>
>
>  far<-function(p, i, j, k, l, m, n, ervalue)
> {
>   flagarima=0
>   testsize1 = 5
>   cat("does it come here value of p", p)
>   tryCatch({
>     air.model <-Arima(tsa,order=c(i-1,j-1,k-1),
> seasonal=list(order=c(l-1,m-1,n-1),period=p-1), lambda=-0.254)  # the arima
> model  # the arima model
>
>     f<- forecast(air.model,h=testsize1) # for getting the error
>
>     ervalue[i,j,k,l,m,n,p]<-errf(act1,f$mean,testsize1,flagarima)
>
>   }, error=function(e)
>   {
>
>     return(NA)
>   }
>   )
>   cat("Value of error", ervalue[i,j,k,l,m,n,p])
>   cat("Value of i,j,k,l,m,n,p", i, j, k, l, m, n,p)
>   print(ervalue)
>   return(ervalue)
> }
> ---------------------------
>
>    library('TTR')
> library('forecast')
> library('timeSeries')
> library('xts')
> library('RODBC')
>
>
>  maxval=2  # set the array size as well as the maximum parameter value
> here.
> pmax=maxval  # set max p value of the ARIMA model
> dmax=maxval  # set max d value of the ARIMA model
> qmax=maxval  # set max q value of the ARIMA model
> Pmax=maxval  # set max P value of the ARIMA model
> Dmax=maxval  # set max D value of the ARIMA model
> Qmax=maxval  # set max Q value of the ARIMA model
> Permax=2     # maximum value of period.
> freq=12
> d<-c(3, 2, 5,29, 6, 10, 8, 4, 4, 5, 4, 6, 6, 1, 2, 3,5, 6, 9, 10)
> st=2013   # start year value for getting the time series
> month=4
> tsa<-ts(d, frequency=freq, start=c(st,month))  # store the data in tsa as
>  the time
> testsize1=5
> act1<-d[16:20] # the array of actual values, the forecasted values will be
> compared against these values
>
>  A<-array(, c(maxval,maxval,maxval,maxval,maxval,maxval, 2)) # depdending
> on the max value set the , also it stores the AIC valuearray size
> er<-array(, c(maxval,maxval,maxval,maxval,maxval,maxval,2)) # depdending
> on the max value set the , stores the error value.array size
> ervalue<-array(, c(maxval,maxval,maxval,maxval,maxval,maxval, 2)) #
> depdending on the max value set the , stores the error value.array size
> erval1<-array(, c(maxval,maxval,maxval,maxval,maxval,maxval, 2)) #
> depdending on the max value set the , stores the error value.array size
> for (i in 1:pmax)
> {
>   for (j in 1:dmax)
>   {
>     for (k in 1:qmax)
>     {
>       for (l in 1:Pmax)
>       {
>         for (m in 1:Dmax)
>         {
>           for (n in 1:Qmax)
>           {
>             A<-sapply((1:Permax),function(p) far(p, i, j, k, l, m,n,
> ervalue),simplify=FALSE)
>
>           }
>         }
>       }
>     }
>   }  #for looping through period value
> }
>
>  A
>
>
> On Wed, Nov 19, 2014 at 9:46 AM, Amit Thombre <amitmt at techmahindra.com>
> wrote:
>
>>  Charles,
>>
>> Some variables were missing in the code. I have put them in this code.
>> Now what happens is the value of cat("Value of error",
>> ervalue[i,j,k,l,m,n,p]) gives error value for various runs but they are not
>> in the final Array A. You will have to go through the runs carefully. The
>> array ervalue which is printed shows the value only for that run with
>> previous values as NA. It is like with every new value of p the previous
>> values of ervalue are lost. Just for confirmation the A and ervalue array
>> has the last value as 3.212016. This si just for information so that you
>> can confirm if you are getting this value.
>>
>> ----------------------------------------------------------------------------------------------
>>
>> errf<-function(act, res, testsize, flag)
>> {
>> j=1
>> if(flag==1)
>> {
>> j<-nrow(d)-testsize
>> }
>>
>> print(act)
>> print(res)
>> print(flag)
>> diff<-0
>> s<-0
>> # loop for iterating to each value of the actual value and finding the
>> difference with thepredicted value
>> for (mn in 1:length(act))
>> {
>> cat("Value of mn in err", mn)
>> cat("Value of j in err", j)
>> cat("Value of res[j] in err", res[j])
>> diff<-(act[mn]-res[j])
>> print(act[mn])
>> print(res[j])
>> print(diff)
>> s<-s+(diff*diff)
>>
>> j<-j+1
>> }
>>
>> er1<-sqrt(s/length(act)) #forecasting error
>> print(er1)
>> return(er1)
>> }
>>
>>
>>
>> far<-function(p)
>> {
>>  flagarima=0
>> cat("does it come here value of p", p)
>> tryCatch({
>> air.model <-Arima(tsa,order=c(i-1,j-1,k-1),
>> seasonal=list(order=c(l-1,m-1,n-1),period=p-1), lambda=-0.254)  # the arima
>> model
>>
>> f<- forecast(air.model,h=5) # for getting the error
>>
>> ervalue[i,j,k,l,m,n,p]<-errf(act1,f$mean,testsize1,flagarima)
>>
>> }, error=function(e)
>> {
>>
>> return(NA)
>> }
>> )
>> cat("Value of error", ervalue[i,j,k,l,m,n,p])
>> cat("Value of i,j,k,l,m,n,p", i, j, k, l, m, n,p)
>> print(ervalue)
>> return(ervalue)
>> }
>> ---------------------------
>> library('TTR')
>> library('forecast')
>> library('timeSeries')
>> library('xts')
>> library('RODBC')
>>
>>
>> maxval=2  # set the array size as well as the maximum parameter value
>> here.
>> pmax=maxval  # set max p value of the ARIMA model
>> dmax=maxval  # set max d value of the ARIMA model
>> qmax=maxval  # set max q value of the ARIMA model
>> Pmax=maxval  # set max P value of the ARIMA model
>> Dmax=maxval  # set max D value of the ARIMA model
>> Qmax=maxval  # set max Q value of the ARIMA model
>> Permax=2     # maximum value of period.
>>  freq=12
>> d<-c(3, 2, 5,29, 6, 10, 8, 4, 4, 5, 4, 6, 6, 1, 2, 3,5, 6, 9, 10)
>> st=2013   # start year value for getting the time series
>> month=4
>> tsa<-ts(d, frequency=freq, start=c(st,month))  # store the data in tsa
>> as  the time
>> testsize1=5
>> act1<-d[16:20] # the array of actual values, the forecasted values will
>> be compared against these values
>>
>>
>>
>> A<-array(, c(maxval,maxval,maxval,maxval,maxval,maxval, 2)) # depdending
>> on the max value set the , also it stores the AIC valuearray size
>> er<-array(, c(maxval,maxval,maxval,maxval,maxval,maxval,2)) # depdending
>> on the max value set the , stores the error value.array size
>> ervalue<-array(, c(maxval,maxval,maxval,maxval,maxval,maxval, 2)) #
>> depdending on the max value set the , stores the error value.array size
>> erval1<-array(, c(maxval,maxval,maxval,maxval,maxval,maxval, 2)) #
>> depdending on the max value set the , stores the error value.array size
>> for (i in 1:pmax)
>> {
>> for (j in 1:dmax)
>> {
>> for (k in 1:qmax)
>> {
>> for (l in 1:Pmax)
>> {
>> for (m in 1:Dmax)
>> {
>> for (n in 1:Qmax)
>> {
>> A<-sapply((1:Permax),function(p) far(p),simplify=FALSE)
>>
>> }
>> }
>> }
>> }
>> }  #for looping through period value
>> }
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>  ------------------------------
>> *From:* Charles Determan Jr [deter088 at umn.edu]
>> *Sent:* Wednesday, November 19, 2014 8:40 PM
>>
>> *To:* Amit Thombre
>> *Cc:* r-help at r-project.org
>> *Subject:* Re: [R] Using sapply instead of for loop
>>
>>    Amit,
>>
>>  Even if you aren't getting an error with your original global variables
>> it is far better practice to avoid global variables to make you code much
>> more stable.  Of course you ultimately get to decide how your code is
>> written.
>>
>>  That said, your error from the modified far function to include the
>> variables is because you added too much to the sapply statement.  Here is
>> what it should look like:
>>
>>              A<-sapply((1:Permax),function(p) far(p, i, j, k, l, m,n,
>> ervalue),simplify=FALSE)
>>
>>  You can think apply statements as nothing more than a for loop that has
>> been made 'pretty'.  You wanted to iterate from 1:Permax and use the other
>> variables, therefore you only have the anonymous function (i.e.
>> function(p)) only include the iterator and supply the other values from
>> your nested for loops to the function.  When I run this with you code,
>> making sure the function accepts the extra parameters, the A array appears
>> to fill appropriately whereby most are 'NA' as specified by your 'far'
>> function.  Is this what you expect?
>>
>>
>> On Wed, Nov 19, 2014 at 8:16 AM, Amit Thombre <amitmt at techmahindra.com>
>> wrote:
>>
>>>  Charles ,
>>>
>>> I am not getting an error . The final array A does not have the values
>>> in it. Here is the reproducible code.  I have even tried using paasing
>>> ervalue as a parameter to the function far.
>>>
>>>
>>> -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
>>>
>>> errf<-function(act, res, testsize, flag)
>>> {
>>> j=1
>>> if(flag==1)
>>> {
>>> j<-nrow(d)-testsize
>>> }
>>>
>>> print(act)
>>> print(res)
>>> print(flag)
>>> diff<-0
>>> s<-0
>>> # loop for iterating to each value of the actual value and finding the
>>> difference with thepredicted value
>>> for (mn in 1:length(act))
>>> {
>>> cat("Value of mn in err", mn)
>>> cat("Value of j in err", j)
>>> cat("Value of res[j] in err", res[j])
>>> diff<-(act[mn]-res[j])
>>> print(act[mn])
>>> print(res[j])
>>> print(diff)
>>> s<-s+(diff*diff)
>>>
>>> j<-j+1
>>> }
>>>
>>> er1<-sqrt(s/length(act)) #forecasting error
>>> print(er1)
>>> return(er1)
>>> }
>>>
>>>
>>>
>>> far<-function(p)
>>> {
>>>
>>> cat("does it come here value of p", p)
>>> tryCatch({
>>> air.model <-Arima(tsa,order=c(i-1,j-1,k-1),
>>> seasonal=list(order=c(l-1,m-1,n-1),period=p-1), lambda=lbda)  # the arima
>>> model
>>>
>>> f<- forecast(air.model,h=testsize1) # for getting the error
>>>
>>> ervalue[i,j,k,l,m,n,p]<-errf(act1,f$mean,testsize1,flagarima)
>>>
>>> }, error=function(e)
>>> {
>>>
>>> return(NA)
>>> }
>>> )
>>> cat("Value of error", ervalue[i,j,k,l,m,n,p])
>>> cat("Value of i,j,k,l,m,n,p", i, j, k, l, m, n,p)
>>> print(ervalue)
>>> return(ervalue)
>>> }
>>>  ---------------------------
>>> library('TTR')
>>> library('forecast')
>>> library('timeSeries')
>>> library('xts')
>>> library('RODBC')
>>>
>>>
>>>  maxval=2  # set the array size as well as the maximum parameter value
>>> here.
>>> pmax=maxval  # set max p value of the ARIMA model
>>> dmax=maxval  # set max d value of the ARIMA model
>>> qmax=maxval  # set max q value of the ARIMA model
>>> Pmax=maxval  # set max P value of the ARIMA model
>>> Dmax=maxval  # set max D value of the ARIMA model
>>> Qmax=maxval  # set max Q value of the ARIMA model
>>> Permax=2     # maximum value of period.
>>>  freq=12
>>> d<-c(10, 13, 14, 4, 5, 6, 7, 10, 12, 13, 14, 20, 3, 4, 5, 19, 23, 21,
>>> 18, 19, 21, 14, 15, 16, 17, 12, 20, 19, 17)
>>> st=2013   # start year value for getting the time series
>>> month=4
>>> tsa<-ts(d, frequency=freq, start=c(st,month))  # store the data in tsa
>>> as  the time
>>>
>>> A<-array(, c(maxval,maxval,maxval,maxval,maxval,maxval, 2)) # depdending
>>> on the max value set the , also it stores the AIC valuearray size
>>> er<-array(, c(maxval,maxval,maxval,maxval,maxval,maxval,2)) # depdending
>>> on the max value set the , stores the error value.array size
>>> ervalue<-array(, c(maxval,maxval,maxval,maxval,maxval,maxval, 2)) #
>>> depdending on the max value set the , stores the error value.array size
>>> erval1<-array(, c(maxval,maxval,maxval,maxval,maxval,maxval, 2)) #
>>> depdending on the max value set the , stores the error value.array size
>>> for (i in 1:pmax)
>>> {
>>> for (j in 1:dmax)
>>> {
>>> for (k in 1:qmax)
>>> {
>>> for (l in 1:Pmax)
>>> {
>>> for (m in 1:Dmax)
>>> {
>>> for (n in 1:Qmax)
>>> {
>>>  A<-sapply((1:Permax),function(p) far(p),simplify=FALSE)
>>>
>>> }
>>> }
>>> }
>>> }
>>> }  #for looping through period value
>>> }
>>>
>>>
>>>
>>>
>>>
>>>  ------------------------------
>>> *From:* Charles Determan Jr [deter088 at umn.edu]
>>> *Sent:* Wednesday, November 19, 2014 7:05 PM
>>> *To:* Amit Thombre
>>> *Cc:* r-help at r-project.org
>>> *Subject:* Re: [R] Using sapply instead of for loop
>>>
>>>    Amit,
>>>
>>>  Your question isn't necessarily complete.  You haven't provided a
>>> reproducible example of your data or an error message.  At first glance you
>>> aren't passing anything to your 'far' function except for 'p' and yet it
>>> uses i,j,k,l,m,n,testsize1, and act1.  You should generally try to avoid
>>> global variables as they can lead to broken code.  You should redefine your
>>> function with all the needed parameters and try again.
>>>
>>>  Regards,
>>>
>>> On Wed, Nov 19, 2014 at 3:47 AM, Amit Thombre <amitmt at techmahindra.com>
>>> wrote:
>>>
>>>> I am trying to replace a for loop by using sapply, The code is for
>>>> forecasting using arima. The code is as follows:-
>>>> -------------------------------------------------------
>>>> far<-function(p)
>>>> {
>>>>
>>>> cat("does it come here value of p", p)
>>>> tryCatch({
>>>> air.model <-Arima(tsa,order=c(i-1,j-1,k-1),
>>>> seasonal=list(order=c(l-1,m-1,n-1),period=p-1), lambda=lbda)  # the arima
>>>> model
>>>>
>>>> f<- forecast(air.model,h=testsize1) # for getting the error
>>>>
>>>> ervalue[i,j,k,l,m,n,p]<-errf(act1,f$mean,testsize1,flagarima)
>>>>
>>>> }, error=function(e)
>>>> {
>>>>
>>>> return(NA)
>>>> }
>>>> )
>>>> cat("Value of error", ervalue[i,j,k,l,m,n,p])
>>>> cat("Value of i,j,k,l,m,n,p", i, j, k, l, m, n,p)
>>>> print(ervalue)
>>>> return(ervalue)
>>>> }
>>>> ---------------------------
>>>> maxval=2  # set the array size as well as the maximum parameter value
>>>> here.
>>>> pmax=maxval  # set max p value of the ARIMA model
>>>> dmax=maxval  # set max d value of the ARIMA model
>>>> qmax=maxval  # set max q value of the ARIMA model
>>>> Pmax=maxval  # set max P value of the ARIMA model
>>>> Dmax=maxval  # set max D value of the ARIMA model
>>>> Qmax=maxval  # set max Q value of the ARIMA model
>>>> Permax=2     # maximum value of period.
>>>>
>>>> st=2013   # start year value for getting the time series
>>>> month=4 d<-c(10, 13, 14, 4, 5, 6, 7, 10, 12, 13, 14, 20, 3, 4, 5, 19,
>>>> 23, 21, 18, 19, 21, 14, 15, 16, 17, 12, 20, 19, 17)
>>>> tsa<-ts(d, frequency=freq, start=c(st,month))  # store the data in tsa
>>>> as  the time
>>>>
>>>> A<-array(, c(maxval,maxval,maxval,maxval,maxval,maxval, 2)) #
>>>> depdending on the max value set the , also it stores the AIC valuearray size
>>>> ervalue<-array(, c(maxval,maxval,maxval,maxval,maxval,maxval, 2)) #
>>>> depdending on the max value set the , stores the error value.array size
>>>>
>>>> for (i in 1:pmax)
>>>> {
>>>> for (j in 1:dmax)
>>>> {
>>>> for (k in 1:qmax)
>>>> {
>>>> for (l in 1:Pmax)
>>>> {
>>>> for (m in 1:Dmax)
>>>> {
>>>> for (n in 1:Qmax)
>>>> {
>>>> A<-sapply((1:Permax),function(p) far(p),simplify=FALSE)
>>>>
>>>> }
>>>> }
>>>> }
>>>> }
>>>> }  #for looping through period value
>>>> }
>>>> ------------------------------------------------------------------
>>>> The sapply replaces the for loop
>>>> for (p in 1:Permax)
>>>> {
>>>> cat("does it come here value of p", p)
>>>> tryCatch({
>>>> air.model <-Arima(tsa,order=c(i-1,j-1,k-1),
>>>> seasonal=list(order=c(l-1,m-1,n-1),period=p), lambda=lbda)  # the arima
>>>> model
>>>> A[i,j,k,l,m,n,p]<-AIC(air.model)
>>>> f<- forecast(air.model,h=testsize1) # for getting the error
>>>> er[i,j,k,l,m,n,p]<-errf(act1,f$mean,testsize1,flagarima)
>>>> }, error=function(e)
>>>> {
>>>>
>>>> return(NA)
>>>> }
>>>> )
>>>>  cat("Value of error", er[i,j,k,l,m,n,p])
>>>>  cat("Value of i,j,k,l,m,n,p", i, j, k, l, m, n,p)
>>>> }
>>>>
>>>> --------------------------------------------------------------------------
>>>> Now the er[I,j,k,l,m,n,p] I.e the error get populated but on every call
>>>> to the function far() the array loses the previous value and gets replaced
>>>> with NA and gets the newly calculated error value. Finally the array A gets
>>>> populated with only the latest value and does not hold the old values.
>>>> Please help
>>>>
>>>>
>>>>
>>>> ============================================================================================================================
>>>> Disclaimer:  This message and the information contained herein is
>>>> proprietary and confidential and subject to the Tech Mahindra policy
>>>> statement, you may review the policy at
>>>> http://www.techmahindra.com/Disclaimer.html externally
>>>> http://tim.techmahindra.com/tim/disclaimer.html internally within
>>>> TechMahindra.
>>>>
>>>> ============================================================================================================================
>>>>
>>>>
>>>>         [[alternative HTML version deleted]]
>>>>
>>>> ______________________________________________
>>>> R-help at r-project.org mailing list
>>>> https://stat.ethz.ch/mailman/listinfo/r-help
>>>> PLEASE do read the posting guide
>>>> http://www.R-project.org/posting-guide.html
>>>> and provide commented, minimal, self-contained, reproducible code.
>>>>
>>>
>>>
>>>
>>>  --
>>>  Dr. Charles Determan, PhD
>>> Integrated Biosciences
>>>
>>> ------------------------------
>>>
>>> ============================================================================================================================
>>> Disclaimer: This message and the information contained herein is
>>> proprietary and confidential and subject to the Tech Mahindra policy
>>> statement, you may review the policy at
>>> http://www.techmahindra.com/Disclaimer.html externally
>>> http://tim.techmahindra.com/tim/disclaimer.html internally within
>>> TechMahindra.
>>>
>>> ============================================================================================================================
>>>
>>>
>>
>>
>>  --
>>  Dr. Charles Determan, PhD
>> Integrated Biosciences
>>
>> ------------------------------
>>
>> ============================================================================================================================
>> Disclaimer: This message and the information contained herein is
>> proprietary and confidential and subject to the Tech Mahindra policy
>> statement, you may review the policy at
>> http://www.techmahindra.com/Disclaimer.html externally
>> http://tim.techmahindra.com/tim/disclaimer.html internally within
>> TechMahindra.
>>
>> ============================================================================================================================
>>
>>
>
>
>  --
>  Dr. Charles Determan, PhD
> Integrated Biosciences
>
> ------------------------------
>
> ============================================================================================================================
> Disclaimer: This message and the information contained herein is
> proprietary and confidential and subject to the Tech Mahindra policy
> statement, you may review the policy at
> http://www.techmahindra.com/Disclaimer.html externally
> http://tim.techmahindra.com/tim/disclaimer.html internally within
> TechMahindra.
>
> ============================================================================================================================
>
>


-- 
Dr. Charles Determan, PhD
Integrated Biosciences

	[[alternative HTML version deleted]]



More information about the R-help mailing list