[R] Need help with kde2d function in R

Anamika Chaudhuri canamika at gmail.com
Thu Aug 6 02:25:21 CEST 2015


Hi,
I am trying to create a bivariate ellipse to see if the true values fall
within the 95% confidence ellipse. I am getting subscript out of bounds
error in R with following code. Not sure what is causing it. When I use the
kde2d function with n>=30 I get the error but not for n=25 and below.

    library(MASS)
    set.seed(1234)

    #Set working directory
    setwd("C://Tina/USB_Backup_042213/Paper II/MLN
Automation/csvs_equal_20s")
    p1<- .136
    p2<- .069
    nn<-60
     Y<-NULL
    >     Y <- read.csv(file=paste0("MVN",i,".csv"), header=T)
    >
    > Y<-as.matrix(Y)
    > xx <- ifelse(Y==0,Y+.5,Y)
    > nnn <- ifelse(Y==0,nn+.5,nn)
    >
    > xx<-as.matrix(xx)
    > Y1<-xx/nnn # estimates of p
    >
    >
    > #print(Y1)
    >
    > sigma2<-
matrix(c(var(Y1[,1]),cov(Y1[,1],Y1[,2]),cov(Y1[,1],Y1[,2]),var(Y1[,2])),2,2)
    > print(sigma2)
               [,1]        [,2]
    [1,] 0.02142909 0.010810225
    [2,] 0.01081023 0.008138709
    >
    > rho<-sigma2[1,2]/sqrt(sigma2[1,1]*sigma2[2,2])
    >
    > rate<-Y1[2,] # change for each site
    > print(rate)
            Y1         Y2
    0.13333333 0.06666667
    >
    > rate1<-rate/(1-rate)
    >
    > #print(rate1)
    >
    > rate2<-log(rate1)
    >
    > Sigma11<-(1/(rate[1]*(1-rate[1]))^2)*sigma2[1,1]
    > Sigma22<-(1/(rate[2]*(1-rate[2]))^2)*sigma2[2,2]
    > Sigma12<-(1/((rate[1]*(1-rate[1]))*(rate[2]*(1-rate[2]))))*sigma2[1,2]
    >
    > Sigma2<-matrix(c(Sigma11,Sigma12,Sigma12,Sigma22),2,2)
    >
    > #print(Sigma2)
    >
    > rate3<-mvrnorm(1000, mu=c(rate2[1],rate2[2]), Sigma2)
    >
    > #print(rate3)
    >
    > x<-exp(rate3[,1])/(1+exp(rate3[,1]))
    > y<-exp(rate3[,2])/(1+exp(rate3[,2]))
    >
    > ## Points within polygons
    > library(MASS)
    > dens <- kde2d(x, y, n=25)
    > image(dens)
    >
    >
    >
#filled.contour(dens,color.palette=colorRampPalette(c('white','blue','yellow','red','darkred')))
    >
    >
    > prob <- c(0.975, 0.025)
    > dx <- diff(dens$x[1:2])
    > dy <- diff(dens$y[1:2])
    > sz <- sort(dens$z)
    >
    > c1 <- cumsum(sz) * dx * dy
    > levels <- sapply(prob, function(x) {
    +     approx(c1, sz, xout = 1 - x)$y
    + })
    > #plot(p1,p2)
    > #contour(dens, levels=levels, labels=prob, add=T)
    > ls <- contourLines(dens, level=levels)
    > print(ls)
    [[1]]
    [[1]]$level
    [1] 0.2149866

    [[1]]$x
     [1] 0.004397130 0.004568786 0.020836478 0.032862816 0.040885850
0.049303040
     [7] 0.077374571 0.095771788 0.113863291 0.139211514 0.127080458
0.139599553
    [13] 0.150352011 0.186840732 0.201445193 0.223329452 0.239170012
0.245315258
    [19] 0.259818172 0.296306893 0.332795613 0.369284333 0.405773053
0.415153288
    [25] 0.442261774 0.472911758 0.478750494 0.515239214 0.536208449
0.551727935
    [31] 0.588216655 0.624705375 0.646392119 0.624705375 0.618407028
0.607497171
    [37] 0.624705375 0.661194096 0.697682816 0.734171536 0.750443060
0.770660257
    [43] 0.780548310 0.807148977 0.823897778 0.815766169 0.807148977
0.770660257
    [49] 0.745293482 0.750888227 0.734171536 0.733822194 0.734171536
0.770660257
    [55] 0.780165097 0.807148977 0.821208006 0.807148977 0.770975720
0.770660257
    [61] 0.734171536 0.712245087 0.697682816 0.693122349 0.693977032
0.697682816
    [67] 0.704425811 0.719174523 0.700076998 0.706464923 0.711329752
0.697682816
    [73] 0.661194096 0.624705375 0.588216655 0.577866122 0.588216655
0.589258511
    [79] 0.588216655 0.551727935 0.515239214 0.478750494 0.469648285
0.442261774
    [85] 0.405773053 0.395062033

    [[1]]$y
     [1] 0.1783278616 0.1786369552 0.2142104572 0.2497839592 0.2640206283
     [6] 0.2853574612 0.3109011130 0.3209309632 0.3351406407 0.3565044651
    [11] 0.3920779671 0.4276514691 0.4342808892 0.4573891723 0.4632249711
    [16] 0.4823023723 0.4987984731 0.5343719750 0.5402153675 0.5529088973
    [21] 0.5541833087 0.5511966122 0.5658454057 0.5699454770 0.5780502406
    [26] 0.5699454770 0.5677285953 0.5582423238 0.5699454770 0.5766348870
    [31] 0.5899083535 0.6007347908 0.6055189790 0.6249103884 0.6410924810
    [36] 0.6766659830 0.6936330128 0.7051209093 0.7052210613 0.7104009871
    [41] 0.7122394849 0.7175712767 0.7122394849 0.7002511608 0.6766659830
    [46] 0.6410924810 0.6338424511 0.6130127829 0.6055189790 0.5699454770
    [51] 0.5348306032 0.5343719750 0.5340918150 0.5053232008 0.4987984731
    [56] 0.4728407406 0.4632249711 0.4535094747 0.4276514691 0.4274565392
    [61] 0.4021096213 0.3920779671 0.3724826039 0.3565044651 0.3209309632
    [66] 0.3068930025 0.2853574612 0.2497839592 0.2142104572 0.1786369552
    [71] 0.1430634533 0.1356917738 0.1315167472 0.1273426210 0.1140927079
    [76] 0.1074899513 0.0744396356 0.0719164493 0.0703319222 0.0509793010
    [81] 0.0542138537 0.0417716905 0.0363429473 0.0207462171 0.0047801760
    [86] 0.0007694453


    [[2]]
    [[2]]$level
    [1] 0.2149866

    [[2]]$x
    [1] 0.2963069 0.2847163 0.2802502 0.2963069 0.3327956 0.3517197
0.3563875
    [8] 0.3327956 0.2963069

    [[2]]$y
    [1] 0.5929265 0.6055190 0.6410925 0.6510478 0.6520754 0.6410925
0.6055190
    [8] 0.5877331 0.5929265


    [[3]]
    [[3]]$level
    [1] 0.2149866

    [[3]]$x
    [1] 0.8059980 0.8071490 0.8436377 0.8449198 0.8436377 0.8071490
0.7848487
    [8] 0.7706603 0.7584362

    [[3]]$y
    [1] 0.8545335 0.8530500 0.8207634 0.8189600 0.8169512 0.8104161
0.8189600
    [8] 0.8304354 0.8545335


    > library(sp)
    > inner <- point.in.polygon(p1, p2, ls[[2]]$x, ls[[2]]$y) # whether
points in inner ellipse
    > out <- point.in.polygon(p1, p2, ls[[1]]$x, ls[[1]]$y) # whether
points in outter ellipse
    >
    > within<-(inner+out)
    >
    > print(within)
    [1] 0

Thanks
Anamika

	[[alternative HTML version deleted]]



More information about the R-help mailing list