<div style="font-family: Courier New,Courier,monospace;">-----Roger Bivand &lt;Roger.Bivand@nhh.no&gt; wrote: -----<br></div><font style="font-family: Courier New,Courier,monospace;" color="#990099"><br></font><blockquote style="border-left: 2px solid rgb(0, 0, 0); padding-right: 0px; padding-left: 5px; margin-left: 5px; margin-right: 0px; font-family: Courier New,Courier,monospace;"><font size="3">On Wed, 18 Oct 2006 White.Denis@epamail.epa.gov wrote:<br><br>&gt; I have a 1000 x 1000 grid of categorical values (nine of these) and want<br>&gt; to compute and plot a correlogram. &nbsp;Function cell2nb() will take a while<br>&gt; it appears but if that succeeds then can methods of sp.correlogram() be<br>&gt; used on categorical data? &nbsp;What are "style" options in sp.correlogram()?<br>&gt; <br><br>Sorry, could you say how a correlogram might be constructed for <br>categorical values (eg. land cover)? Wouldn't join counts be a more <br>natural choice? joincoint.multi() in spdep has a Jtot value of total <br>different category joins, so using that with different lags of a cell2nb() <br>neighbour list might work. However, the 1M cell grid is pretty large for <br>cell2nb(), using dnearneigh() on cell centres may be faster and scale <br>better, (and other possibilities should exist) and nblag() will be <br>definitely sub-optimal in this setting. For join counts, the "B" weights <br>style is the obvious one to chose. Note that joincoint.multi() is not <br>coded in C.<br><br>This would need trying on a small subset and scaling up - I think that <br>alternative routes to constructing the lagged neighbour lists would be <br>preferable.<br><br>Roger<br><br></font></blockquote><br>I wrote a short function to compute proportion agreement between classes at different lags, R code below.&nbsp; Because it's a brute force O(n^2) algorithm, it takes way too long in R for datasets with more than some 10's of points.&nbsp; So I wrote a C version that took about 20 hours for 1M points on a 2GHz linux computer.&nbsp; Subsampling from the 1000x1000 image reduced time considerably, naturally.<br><br>I haven't looked at Cliff and Ord or other texts on these kinds of&nbsp; statistics for a long time and I don't know whether this simple proportion agreement measure is closely related to a multinomial joincount or not.&nbsp; And so I don't know what the test for non-randomness is or what a variance measure is, etc.&nbsp; It does seem to portray the spatial pattern in agreement though.<br><br>isotaxogram &lt;- function (pts, nlags=10, maxdist)<br><br># Calculate proportion agreement of categorical point data <br># at successive lags<br>#<br># pts&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; matrix or data frame with columns/names<br>#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "x", "y", "val"<br># nlags&nbsp;&nbsp;&nbsp; number of lags in the output function<br># maxdist&nbsp; maximum distance over which to compute the function;<br>#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; needs to be specified<br><br>{<br>&nbsp;&nbsp;&nbsp; agree &lt;- num &lt;- lag &lt;- rep (0, nlags)<br>&nbsp;&nbsp;&nbsp; for (i in 1:(nrow(pts)-1))<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x1 &lt;- pts[i, "x"]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; y1 &lt;- pts[i, "y"]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (j in (i+1):nrow(pts))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x2 &lt;- pts[j, "x"]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; y2 &lt;- pts[j, "y"]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; d &lt;- sqrt ((x2-x1)^2 + (y2-y1)^2)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; d &lt;- round (d / maxdist * nlags)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a &lt;- as.integer (pts[i, "val"] == pts[j, "val"])<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (d %in% 1:nlags)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; agree[d] &lt;- agree[d] + a<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; num[d] &lt;- num[d] + 1<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; for (k in 1:nlags) <br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lag[k] &lt;- k * (maxdist / nlags)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (num[k] != 0) agree[k] &lt;- agree[k] / num[k]<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; return (list (agree=agree, lag=lag, num=num))<br>}<br><br style="font-family: Courier New,Courier,monospace;">