1

I am doing simulations and am trying to add error to a column repeatedly, specifically to the column titled Ao. In my output, the first 30 rows are correct; we have the initial data, the first year of altered data (error added to Ao), but then afterwards, where I would like to have 30 years of added error, I get repeats of Year 2 for Ao up to year 30. My goal is that I add error after each year of sampling. Ie. Year 2 is Year 1 Ao + error. Year 3 is Year 2 Ao + error, so on and so forth. Any helpers? Cheers.

    for(t in 1:30){
      Error<-rnorm(1000,0,1)
      m<-rep(year1data$m,30)
      r<-rep(year1data$r,30)
      a<-rep(year1data$a,30)
      g<-rep(year1data$g,30)
      Year<-rep(2:31, each=TotSpecies)
      Species<-1:TotSpecies
      Ao<-year1data$Ao+sample(Error,TotSpecies,replace=FALSE)
      TotSpeciesdata<-data.frame(Species,Year,Ao,m,r,a,g)
      TotSpeciesdata<-rbind(year1data,TotSpeciesdata)
    }

     > TotSpeciesdata
    Species Year         Ao   m          r         a         g
    1         1    1  25.770783  43 119.110786 3.2305180 2.6526471
    2         2    1  53.908914 138 161.894541 0.7342070 0.1151602
    3         3    1   2.010732 226 193.820489 2.2890904 3.6248105
    4         4    1  23.742254 332  17.315335 1.4009572 2.0037931
    5         5    1   4.291080  63 187.591209 0.2563995 2.1553908
    6         6    1   4.691113 343 116.267867 0.3899113 3.3950085
    7         7    1 604.133044 224 132.240197 3.0410743 0.7985524
    8         8    1  13.332567 166   5.367118 0.7921644 1.7861011
    9         9    1   3.759268 141 212.340970 2.8733737 2.7123141
    10       10    1   3.647390 209 259.400858 0.1249936 0.6594659
    11       11    1  23.731109  10 114.171147 2.2437372 0.9867591
    12       12    1  85.116996  69 167.412993 0.8306823 2.8905148
    13       13    1  31.684280 277 177.025460 2.7618332 2.9245554
    14       14    1  30.657523 205  21.710438 2.7661347 1.5911379
    15       15    1  12.240410  85 210.121109 2.8827455 3.0418454
    16        1    2  27.038097  43 119.110786 3.2305180 2.6526471
    17        2    2  54.251600 138 161.894541 0.7342070 0.1151602
    18        3    2   2.010636 226 193.820489 2.2890904 3.6248105
    19        4    2  22.699369 332  17.315335 1.4009572 2.0037931
    20        5    2   4.542589  63 187.591209 0.2563995 2.1553908
    21        6    2   3.607833 343 116.267867 0.3899113 3.3950085
    22        7    2 604.480756 224 132.240197 3.0410743 0.7985524
    23        8    2  13.663513 166   5.367118 0.7921644 1.7861011
    24        9    2   2.138715 141 212.340970 2.8733737 2.7123141
    25       10    2   3.642769 209 259.400858 0.1249936 0.6594659
    26       11    2  22.897993  10 114.171147 2.2437372 0.9867591
    27       12    2  85.490897  69 167.412993 0.8306823 2.8905148
    28       13    2  31.689202 277 177.025460 2.7618332 2.9245554
    29       14    2  30.644419 205  21.710438 2.7661347 1.5911379
    30       15    2  12.050207  85 210.121109 2.8827455 3.0418454
    31        1    3  27.038097  43 119.110786 3.2305180 2.6526471
    32        2    3  54.251600 138 161.894541 0.7342070 0.1151602
    33        3    3   2.010636 226 193.820489 2.2890904 3.6248105
    34        4    3  22.699369 332  17.315335 1.4009572 2.0037931
    35        5    3   4.542589  63 187.591209 0.2563995 2.1553908
    36        6    3   3.607833 343 116.267867 0.3899113 3.3950085
    37        7    3 604.480756 224 132.240197 3.0410743 0.7985524
    38        8    3  13.663513 166   5.367118 0.7921644 1.7861011
    39        9    3   2.138715 141 212.340970 2.8733737 2.7123141
    40       10    3   3.642769 209 259.400858 0.1249936 0.6594659
    41       11    3  22.897993  10 114.171147 2.2437372 0.9867591
    42       12    3  85.490897  69 167.412993 0.8306823 2.8905148
    43       13    3  31.689202 277 177.025460 2.7618332 2.9245554
    44       14    3  30.644419 205  21.710438 2.7661347 1.5911379
    45       15    3  12.050207  85 210.121109 2.8827455 3.0418454
KL2014
  • 37
  • 5
  • 1
    Welcome to Stack Overflow! Please supply your data in [a reproducible format](http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example), e.g., using `dput`. It's also unclear what you want. Consider supplying an example of your intended output. – Thomas Feb 25 '14 at 16:04

2 Answers2

4

The main problem you have with your approach is the line:

TotSpeciesdata<-data.frame(Species,Year,Ao,m,r,a,g)

Because Year is a 30 * TotSpecies vector, but all the others are just TotSpecies long. So in effect, you are recycling all columns except Year 30 times when you create the data frame, which will lead to the year 2 data repeated 30 times, among other things. If you just have Year <- rep(i + 1, TotSpecies) I think your logic will work fine. That said, here is an alternate approach:

This will, for each species, create an incrementing random walk starting with Ao for that species for 5 years (just did that for display purposes):

set.seed(1)
year1data <- data.frame(species=1:10, year=1, Ao=runif(10, 1, 700))
TotSpeciesData <- do.call(
  rbind, 
  lapply(
    split(year1data, year1data$species),
    function(data) 
      with(
        data, 
        data.frame(species=species, year=year, Ao=c(Ao, Ao + cumsum(rnorm(5)))
) ) ) )
head(TotSpeciesData, 15)

Note I excluded columns m-g since they don't seem directly relevant to your particular question, but you can add them relatively easily. I also only did 5 years in addition to year 1 so you can see the results here, but that is also easy to change:

    species year       Ao
1.1       1    1 186.5906
1.2       1    1 185.7701
1.3       1    1 186.2575
1.4       1    1 186.9958
1.5       1    1 187.5716
1.6       1    1 187.2662
2.1       2    1 261.1146
2.2       2    1 262.6264
2.3       2    1 263.0162
2.4       2    1 262.3950
2.5       2    1 260.1803
2.6       2    1 261.3052
3.1       3    1 401.4245
3.2       3    1 401.3796
3.3       3    1 401.3634
BrodieG
  • 51,669
  • 9
  • 93
  • 146
  • Much appreciated with the help. The first tip: Year<-rep(i + 1, TotSpecies) did not work but I was able to adjust what you gave as an alternative for what I need. Much appreciated! – KL2014 Feb 25 '14 at 16:29
  • Unfortunately the code provided didn't seem to work properly. See my comments below. – KL2014 Mar 04 '14 at 15:59
0

It has been pointed out that the code that you provided above, or at least that I have edited, repeats itself every 15 years, rather than being unique year year in a step-wise fashion. I edited it as shown below:

TotSpeciesData <- do.call(
  rbind, #bind the table by rows
  lapply(    #applying the function in list form
    split(year1data, year1data$Species),   #splits data into groups by species
    function(data) 
      with(
        data, 
        data.frame(Species=Species, Year=1:Community, Ao=c(Ao, Ao + cumsum(rnorm((TotSpecies-1),0,2))),m=m, r=r, a=a, g=g) #data frame is Species, Year, 
        ) ) ) 
  TotSpeciesData$Ao[TotSpeciesData$Ao<0]<-0                 #any values less than 0 go to 0
TotSpeciesData<-TotSpeciesData[order(TotSpeciesData$Year),] #orders the data frame by Year

When I do this code:

TotSpeciesData[TotSpeciesData$Species==1 & TotSpeciesData$Year %in% c(1,2,16,17),]

I end up with an output showing that the data is repeating itself.

Species Year       Ao   m        r        a        g   
1.1        1    1 48.49161 239 332.9625 3.791778 2.723104
1.2        1    2 49.62851 239 332.9625 3.791778 2.723104
1.16       1   16 48.49161 239 332.9625 3.791778 2.723104
1.17       1   17 49.62851 239 332.9625 3.791778 2.723104

Any comments toward this?

KL2014
  • 37
  • 5
  • You need to make sure your `Year` and `Ao` vectors are the same length. Without the data it's hard to be sure, but I think you need `Ao=c(Ao, Ao + cumsum(rnorm((Community-1),0,2)))` (notice I replaced `TotSpecies` with `Community`) as that way your `Year` and `Ao` vectors end up being the same length. – BrodieG Mar 04 '14 at 16:50