[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