Project

General

Profile

« Previous | Next » 

Revision 0b07113c

Added by Adam M. Wilson almost 11 years ago

updating missing data script and adding images via imgur

View differences:

climate/research/LST_missingdata.R
1
### Short script to make a plot showing missing LST data in tiles from Alberto
2
library(rasterVis)
3

  
4
setwd("~/Downloads/nasa/")
5

  
6

  
7
f=data.frame(full=T,path=list.files(pattern="tif$"),stringsAsFactors=F)
8
f$month=as.numeric(do.call(rbind,strsplit(f$path,"_|[.]"))[,7])
9
f=f[order(f$month),]
10
f$mn=month.name[f$month]
11

  
12
d=stack(f$path)
13
names(d)=f$mn
14

  
15

  
16
colramp=colorRampPalette(c("blue","orange","red"))
17

  
18
png("Climatologies.png",width=1500,height=600,pointsize=22)
19
levelplot(d,col.regions=c("grey",colramp(99)),at=c(-0.5,0.5,seq(1,70,len=99)),main="Land Surface Temperature - Monthly Climatologies",sub="Tile H08v05 (California and Northern Mexico) \n Grey indicates missing data")
20
dev.off()
climate/research/LST_missingdata.Rmd
1 1
LST Climatology Evaluation
2 2
====
3
Adam M. Wilson
4
```{r}
3
```{r,echo=FALSE,message=FALSE}
5 4
## get repo info
6 5
githash=system("git --git-dir /Users/adamw/work/environmental-layers/.git log --pretty=format:'%h' -n 1",intern=T)
7
print(paste("Compiled on",date()," using code version (git hash):",githash))
6
ghead=paste("Compiled on",date()," using code version (git hash):",githash)
8 7
```
9 8

  
9
### Adam M. Wilson (`r ghead`)
10

  
10 11
A short script to visualize and explore the updated Land Surface Climatology algorithm that 'lowers the standards' in some areas to increase the number of available observations.  
11 12

  
12 13
```{r,echo=FALSE,results="hide",message=FALSE}
13 14
## some setup
14
opts_knit$set(progress = TRUE, verbose = TRUE, cache=TRUE,root.dir="~/Downloads/nasa/")
15
opts_knit$set(progress = TRUE, verbose = TRUE,root.dir="~/Downloads/nasa/", upload.fun = imgur_upload, base.url = NULL) # upload all images to imgur.com
16
opts_chunk$set(fig.width=5, fig.height=5, cache=TRUE)
15 17
library(rasterVis)
16 18
library(rgdal)
17 19
library(xtable)
......
102 104

  
103 105
Map of the Quality Assessment (QA) level used to fill the pixels. It goes from 0 (highest quality) to 3(low). For h08v05 all pixels are filled with either 0 or 1. So red indicates areas with the lower quality data (most of the tile).
104 106
```{r, message=FALSE, fig.width=11, fig.height=8}
105
levelplot(lst_qa[[1]],col.regions=c("grey","red"),at=c(-0.5,0.5,1.5),cuts=2,
107
levelplot(lst_qa,col.regions=c("grey","red"),at=c(-0.5,0.5,1.5),cuts=2,
106 108
          main="Quality Assessment Filter",sub="Tile H08v05 (California and Northern Mexico)")
107 109
```
108 110

  
climate/research/LST_missingdata.html
1
<!DOCTYPE html>
2
<!-- saved from url=(0014)about:internet -->
3
<html>
4
<head>
5
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
6
<meta http-equiv="x-ua-compatible" content="IE=9" >
7

  
8
<title>LST Climatology Evaluation</title>
9

  
10
<style type="text/css">
11
body, td {
12
   font-family: sans-serif;
13
   background-color: white;
14
   font-size: 12px;
15
   margin: 8px;
16
}
17

  
18
tt, code, pre {
19
   font-family: 'DejaVu Sans Mono', 'Droid Sans Mono', 'Lucida Console', Consolas, Monaco, monospace;
20
}
21

  
22
h1 { 
23
   font-size:2.2em; 
24
}
25

  
26
h2 { 
27
   font-size:1.8em; 
28
}
29

  
30
h3 { 
31
   font-size:1.4em; 
32
}
33

  
34
h4 { 
35
   font-size:1.0em; 
36
}
37

  
38
h5 { 
39
   font-size:0.9em; 
40
}
41

  
42
h6 { 
43
   font-size:0.8em; 
44
}
45

  
46
a:visited {
47
   color: rgb(50%, 0%, 50%);
48
}
49

  
50
pre {	
51
   margin-top: 0;
52
   max-width: 95%;
53
   border: 1px solid #ccc;
54
   white-space: pre-wrap;
55
}
56

  
57
pre code {
58
   display: block; padding: 0.5em;
59
}
60

  
61
code.r, code.cpp {
62
   background-color: #F8F8F8;
63
}
64

  
65
table, td, th {
66
  border: none;
67
}
68

  
69
blockquote {
70
   color:#666666;
71
   margin:0;
72
   padding-left: 1em;
73
   border-left: 0.5em #EEE solid;
74
}
75

  
76
hr {
77
   height: 0px;
78
   border-bottom: none;
79
   border-top-width: thin;
80
   border-top-style: dotted;
81
   border-top-color: #999999;
82
}
83

  
84
@media print {
85
   * { 
86
      background: transparent !important; 
87
      color: black !important; 
88
      filter:none !important; 
89
      -ms-filter: none !important; 
90
   }
91

  
92
   body { 
93
      font-size:12pt; 
94
      max-width:100%; 
95
   }
96
       
97
   a, a:visited { 
98
      text-decoration: underline; 
99
   }
100

  
101
   hr { 
102
      visibility: hidden;
103
      page-break-before: always;
104
   }
105

  
106
   pre, blockquote { 
107
      padding-right: 1em; 
108
      page-break-inside: avoid; 
109
   }
110

  
111
   tr, img { 
112
      page-break-inside: avoid; 
113
   }
114

  
115
   img { 
116
      max-width: 100% !important; 
117
   }
118

  
119
   @page :left { 
120
      margin: 15mm 20mm 15mm 10mm; 
121
   }
122
     
123
   @page :right { 
124
      margin: 15mm 10mm 15mm 20mm; 
125
   }
126

  
127
   p, h2, h3 { 
128
      orphans: 3; widows: 3; 
129
   }
130

  
131
   h2, h3 { 
132
      page-break-after: avoid; 
133
   }
134
}
135

  
136
</style>
137

  
138
<!-- Styles for R syntax highlighter -->
139
<style type="text/css">
140
   pre .operator,
141
   pre .paren {
142
     color: rgb(104, 118, 135)
143
   }
144

  
145
   pre .literal {
146
     color: rgb(88, 72, 246)
147
   }
148

  
149
   pre .number {
150
     color: rgb(0, 0, 205);
151
   }
152

  
153
   pre .comment {
154
     color: rgb(76, 136, 107);
155
   }
156

  
157
   pre .keyword {
158
     color: rgb(0, 0, 255);
159
   }
160

  
161
   pre .identifier {
162
     color: rgb(0, 0, 0);
163
   }
164

  
165
   pre .string {
166
     color: rgb(3, 106, 7);
167
   }
168
</style>
169

  
170
<!-- R syntax highlighter -->
171
<script type="text/javascript">
172
var hljs=new function(){function m(p){return p.replace(/&/gm,"&amp;").replace(/</gm,"&lt;")}function f(r,q,p){return RegExp(q,"m"+(r.cI?"i":"")+(p?"g":""))}function b(r){for(var p=0;p<r.childNodes.length;p++){var q=r.childNodes[p];if(q.nodeName=="CODE"){return q}if(!(q.nodeType==3&&q.nodeValue.match(/\s+/))){break}}}function h(t,s){var p="";for(var r=0;r<t.childNodes.length;r++){if(t.childNodes[r].nodeType==3){var q=t.childNodes[r].nodeValue;if(s){q=q.replace(/\n/g,"")}p+=q}else{if(t.childNodes[r].nodeName=="BR"){p+="\n"}else{p+=h(t.childNodes[r])}}}if(/MSIE [678]/.test(navigator.userAgent)){p=p.replace(/\r/g,"\n")}return p}function a(s){var r=s.className.split(/\s+/);r=r.concat(s.parentNode.className.split(/\s+/));for(var q=0;q<r.length;q++){var p=r[q].replace(/^language-/,"");if(e[p]){return p}}}function c(q){var p=[];(function(s,t){for(var r=0;r<s.childNodes.length;r++){if(s.childNodes[r].nodeType==3){t+=s.childNodes[r].nodeValue.length}else{if(s.childNodes[r].nodeName=="BR"){t+=1}else{if(s.childNodes[r].nodeType==1){p.push({event:"start",offset:t,node:s.childNodes[r]});t=arguments.callee(s.childNodes[r],t);p.push({event:"stop",offset:t,node:s.childNodes[r]})}}}}return t})(q,0);return p}function k(y,w,x){var q=0;var z="";var s=[];function u(){if(y.length&&w.length){if(y[0].offset!=w[0].offset){return(y[0].offset<w[0].offset)?y:w}else{return w[0].event=="start"?y:w}}else{return y.length?y:w}}function t(D){var A="<"+D.nodeName.toLowerCase();for(var B=0;B<D.attributes.length;B++){var C=D.attributes[B];A+=" "+C.nodeName.toLowerCase();if(C.value!==undefined&&C.value!==false&&C.value!==null){A+='="'+m(C.value)+'"'}}return A+">"}while(y.length||w.length){var v=u().splice(0,1)[0];z+=m(x.substr(q,v.offset-q));q=v.offset;if(v.event=="start"){z+=t(v.node);s.push(v.node)}else{if(v.event=="stop"){var p,r=s.length;do{r--;p=s[r];z+=("</"+p.nodeName.toLowerCase()+">")}while(p!=v.node);s.splice(r,1);while(r<s.length){z+=t(s[r]);r++}}}}return z+m(x.substr(q))}function j(){function q(x,y,v){if(x.compiled){return}var u;var s=[];if(x.k){x.lR=f(y,x.l||hljs.IR,true);for(var w in x.k){if(!x.k.hasOwnProperty(w)){continue}if(x.k[w] instanceof Object){u=x.k[w]}else{u=x.k;w="keyword"}for(var r in u){if(!u.hasOwnProperty(r)){continue}x.k[r]=[w,u[r]];s.push(r)}}}if(!v){if(x.bWK){x.b="\\b("+s.join("|")+")\\s"}x.bR=f(y,x.b?x.b:"\\B|\\b");if(!x.e&&!x.eW){x.e="\\B|\\b"}if(x.e){x.eR=f(y,x.e)}}if(x.i){x.iR=f(y,x.i)}if(x.r===undefined){x.r=1}if(!x.c){x.c=[]}x.compiled=true;for(var t=0;t<x.c.length;t++){if(x.c[t]=="self"){x.c[t]=x}q(x.c[t],y,false)}if(x.starts){q(x.starts,y,false)}}for(var p in e){if(!e.hasOwnProperty(p)){continue}q(e[p].dM,e[p],true)}}function d(B,C){if(!j.called){j();j.called=true}function q(r,M){for(var L=0;L<M.c.length;L++){if((M.c[L].bR.exec(r)||[null])[0]==r){return M.c[L]}}}function v(L,r){if(D[L].e&&D[L].eR.test(r)){return 1}if(D[L].eW){var M=v(L-1,r);return M?M+1:0}return 0}function w(r,L){return L.i&&L.iR.test(r)}function K(N,O){var M=[];for(var L=0;L<N.c.length;L++){M.push(N.c[L].b)}var r=D.length-1;do{if(D[r].e){M.push(D[r].e)}r--}while(D[r+1].eW);if(N.i){M.push(N.i)}return f(O,M.join("|"),true)}function p(M,L){var N=D[D.length-1];if(!N.t){N.t=K(N,E)}N.t.lastIndex=L;var r=N.t.exec(M);return r?[M.substr(L,r.index-L),r[0],false]:[M.substr(L),"",true]}function z(N,r){var L=E.cI?r[0].toLowerCase():r[0];var M=N.k[L];if(M&&M instanceof Array){return M}return false}function F(L,P){L=m(L);if(!P.k){return L}var r="";var O=0;P.lR.lastIndex=0;var M=P.lR.exec(L);while(M){r+=L.substr(O,M.index-O);var N=z(P,M);if(N){x+=N[1];r+='<span class="'+N[0]+'">'+M[0]+"</span>"}else{r+=M[0]}O=P.lR.lastIndex;M=P.lR.exec(L)}return r+L.substr(O,L.length-O)}function J(L,M){if(M.sL&&e[M.sL]){var r=d(M.sL,L);x+=r.keyword_count;return r.value}else{return F(L,M)}}function I(M,r){var L=M.cN?'<span class="'+M.cN+'">':"";if(M.rB){y+=L;M.buffer=""}else{if(M.eB){y+=m(r)+L;M.buffer=""}else{y+=L;M.buffer=r}}D.push(M);A+=M.r}function G(N,M,Q){var R=D[D.length-1];if(Q){y+=J(R.buffer+N,R);return false}var P=q(M,R);if(P){y+=J(R.buffer+N,R);I(P,M);return P.rB}var L=v(D.length-1,M);if(L){var O=R.cN?"</span>":"";if(R.rE){y+=J(R.buffer+N,R)+O}else{if(R.eE){y+=J(R.buffer+N,R)+O+m(M)}else{y+=J(R.buffer+N+M,R)+O}}while(L>1){O=D[D.length-2].cN?"</span>":"";y+=O;L--;D.length--}var r=D[D.length-1];D.length--;D[D.length-1].buffer="";if(r.starts){I(r.starts,"")}return R.rE}if(w(M,R)){throw"Illegal"}}var E=e[B];var D=[E.dM];var A=0;var x=0;var y="";try{var s,u=0;E.dM.buffer="";do{s=p(C,u);var t=G(s[0],s[1],s[2]);u+=s[0].length;if(!t){u+=s[1].length}}while(!s[2]);if(D.length>1){throw"Illegal"}return{r:A,keyword_count:x,value:y}}catch(H){if(H=="Illegal"){return{r:0,keyword_count:0,value:m(C)}}else{throw H}}}function g(t){var p={keyword_count:0,r:0,value:m(t)};var r=p;for(var q in e){if(!e.hasOwnProperty(q)){continue}var s=d(q,t);s.language=q;if(s.keyword_count+s.r>r.keyword_count+r.r){r=s}if(s.keyword_count+s.r>p.keyword_count+p.r){r=p;p=s}}if(r.language){p.second_best=r}return p}function i(r,q,p){if(q){r=r.replace(/^((<[^>]+>|\t)+)/gm,function(t,w,v,u){return w.replace(/\t/g,q)})}if(p){r=r.replace(/\n/g,"<br>")}return r}function n(t,w,r){var x=h(t,r);var v=a(t);var y,s;if(v){y=d(v,x)}else{return}var q=c(t);if(q.length){s=document.createElement("pre");s.innerHTML=y.value;y.value=k(q,c(s),x)}y.value=i(y.value,w,r);var u=t.className;if(!u.match("(\\s|^)(language-)?"+v+"(\\s|$)")){u=u?(u+" "+v):v}if(/MSIE [678]/.test(navigator.userAgent)&&t.tagName=="CODE"&&t.parentNode.tagName=="PRE"){s=t.parentNode;var p=document.createElement("div");p.innerHTML="<pre><code>"+y.value+"</code></pre>";t=p.firstChild.firstChild;p.firstChild.cN=s.cN;s.parentNode.replaceChild(p.firstChild,s)}else{t.innerHTML=y.value}t.className=u;t.result={language:v,kw:y.keyword_count,re:y.r};if(y.second_best){t.second_best={language:y.second_best.language,kw:y.second_best.keyword_count,re:y.second_best.r}}}function o(){if(o.called){return}o.called=true;var r=document.getElementsByTagName("pre");for(var p=0;p<r.length;p++){var q=b(r[p]);if(q){n(q,hljs.tabReplace)}}}function l(){if(window.addEventListener){window.addEventListener("DOMContentLoaded",o,false);window.addEventListener("load",o,false)}else{if(window.attachEvent){window.attachEvent("onload",o)}else{window.onload=o}}}var e={};this.LANGUAGES=e;this.highlight=d;this.highlightAuto=g;this.fixMarkup=i;this.highlightBlock=n;this.initHighlighting=o;this.initHighlightingOnLoad=l;this.IR="[a-zA-Z][a-zA-Z0-9_]*";this.UIR="[a-zA-Z_][a-zA-Z0-9_]*";this.NR="\\b\\d+(\\.\\d+)?";this.CNR="\\b(0[xX][a-fA-F0-9]+|(\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)";this.BNR="\\b(0b[01]+)";this.RSR="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|\\.|-|-=|/|/=|:|;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~";this.ER="(?![\\s\\S])";this.BE={b:"\\\\.",r:0};this.ASM={cN:"string",b:"'",e:"'",i:"\\n",c:[this.BE],r:0};this.QSM={cN:"string",b:'"',e:'"',i:"\\n",c:[this.BE],r:0};this.CLCM={cN:"comment",b:"//",e:"$"};this.CBLCLM={cN:"comment",b:"/\\*",e:"\\*/"};this.HCM={cN:"comment",b:"#",e:"$"};this.NM={cN:"number",b:this.NR,r:0};this.CNM={cN:"number",b:this.CNR,r:0};this.BNM={cN:"number",b:this.BNR,r:0};this.inherit=function(r,s){var p={};for(var q in r){p[q]=r[q]}if(s){for(var q in s){p[q]=s[q]}}return p}}();hljs.LANGUAGES.cpp=function(){var a={keyword:{"false":1,"int":1,"float":1,"while":1,"private":1,"char":1,"catch":1,"export":1,virtual:1,operator:2,sizeof:2,dynamic_cast:2,typedef:2,const_cast:2,"const":1,struct:1,"for":1,static_cast:2,union:1,namespace:1,unsigned:1,"long":1,"throw":1,"volatile":2,"static":1,"protected":1,bool:1,template:1,mutable:1,"if":1,"public":1,friend:2,"do":1,"return":1,"goto":1,auto:1,"void":2,"enum":1,"else":1,"break":1,"new":1,extern:1,using:1,"true":1,"class":1,asm:1,"case":1,typeid:1,"short":1,reinterpret_cast:2,"default":1,"double":1,register:1,explicit:1,signed:1,typename:1,"try":1,"this":1,"switch":1,"continue":1,wchar_t:1,inline:1,"delete":1,alignof:1,char16_t:1,char32_t:1,constexpr:1,decltype:1,noexcept:1,nullptr:1,static_assert:1,thread_local:1,restrict:1,_Bool:1,complex:1},built_in:{std:1,string:1,cin:1,cout:1,cerr:1,clog:1,stringstream:1,istringstream:1,ostringstream:1,auto_ptr:1,deque:1,list:1,queue:1,stack:1,vector:1,map:1,set:1,bitset:1,multiset:1,multimap:1,unordered_set:1,unordered_map:1,unordered_multiset:1,unordered_multimap:1,array:1,shared_ptr:1}};return{dM:{k:a,i:"</",c:[hljs.CLCM,hljs.CBLCLM,hljs.QSM,{cN:"string",b:"'\\\\?.",e:"'",i:"."},{cN:"number",b:"\\b(\\d+(\\.\\d*)?|\\.\\d+)(u|U|l|L|ul|UL|f|F)"},hljs.CNM,{cN:"preprocessor",b:"#",e:"$"},{cN:"stl_container",b:"\\b(deque|list|queue|stack|vector|map|set|bitset|multiset|multimap|unordered_map|unordered_set|unordered_multiset|unordered_multimap|array)\\s*<",e:">",k:a,r:10,c:["self"]}]}}}();hljs.LANGUAGES.r={dM:{c:[hljs.HCM,{cN:"number",b:"\\b0[xX][0-9a-fA-F]+[Li]?\\b",e:hljs.IMMEDIATE_RE,r:0},{cN:"number",b:"\\b\\d+(?:[eE][+\\-]?\\d*)?L\\b",e:hljs.IMMEDIATE_RE,r:0},{cN:"number",b:"\\b\\d+\\.(?!\\d)(?:i\\b)?",e:hljs.IMMEDIATE_RE,r:1},{cN:"number",b:"\\b\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d*)?i?\\b",e:hljs.IMMEDIATE_RE,r:0},{cN:"number",b:"\\.\\d+(?:[eE][+\\-]?\\d*)?i?\\b",e:hljs.IMMEDIATE_RE,r:1},{cN:"keyword",b:"(?:tryCatch|library|setGeneric|setGroupGeneric)\\b",e:hljs.IMMEDIATE_RE,r:10},{cN:"keyword",b:"\\.\\.\\.",e:hljs.IMMEDIATE_RE,r:10},{cN:"keyword",b:"\\.\\.\\d+(?![\\w.])",e:hljs.IMMEDIATE_RE,r:10},{cN:"keyword",b:"\\b(?:function)",e:hljs.IMMEDIATE_RE,r:2},{cN:"keyword",b:"(?:if|in|break|next|repeat|else|for|return|switch|while|try|stop|warning|require|attach|detach|source|setMethod|setClass)\\b",e:hljs.IMMEDIATE_RE,r:1},{cN:"literal",b:"(?:NA|NA_integer_|NA_real_|NA_character_|NA_complex_)\\b",e:hljs.IMMEDIATE_RE,r:10},{cN:"literal",b:"(?:NULL|TRUE|FALSE|T|F|Inf|NaN)\\b",e:hljs.IMMEDIATE_RE,r:1},{cN:"identifier",b:"[a-zA-Z.][a-zA-Z0-9._]*\\b",e:hljs.IMMEDIATE_RE,r:0},{cN:"operator",b:"<\\-(?!\\s*\\d)",e:hljs.IMMEDIATE_RE,r:2},{cN:"operator",b:"\\->|<\\-",e:hljs.IMMEDIATE_RE,r:1},{cN:"operator",b:"%%|~",e:hljs.IMMEDIATE_RE},{cN:"operator",b:">=|<=|==|!=|\\|\\||&&|=|\\+|\\-|\\*|/|\\^|>|<|!|&|\\||\\$|:",e:hljs.IMMEDIATE_RE,r:0},{cN:"operator",b:"%",e:"%",i:"\\n",r:1},{cN:"identifier",b:"`",e:"`",r:0},{cN:"string",b:'"',e:'"',c:[hljs.BE],r:0},{cN:"string",b:"'",e:"'",c:[hljs.BE],r:0},{cN:"paren",b:"[[({\\])}]",e:hljs.IMMEDIATE_RE,r:0}]}};
173
hljs.initHighlightingOnLoad();
174
</script>
175

  
176

  
177

  
178

  
179
</head>
180

  
181
<body>
182
<h1>LST Climatology Evaluation</h1>
183

  
184
<h3>Adam M. Wilson (Compiled on Tue Mar  4 14:31:08 2014  using code version (git hash): f41365c)</h3>
185

  
186
<p>A short script to visualize and explore the updated Land Surface Climatology algorithm that &#39;lowers the standards&#39; in some areas to increase the number of available observations.  </p>
187

  
188
<h2>Download data from ECOcast and convert to raster stacks</h2>
189

  
190
<pre><code class="r">download = F
191
if (download) system(&quot;wget -e robots=off -L -r -np -nd -p 20140304_LST -nc -A tif http://ecocast.arc.nasa.gov/data/pub/climateLayers/LST_new/&quot;)
192

  
193
## organize file names
194
f = data.frame(full = T, path = list.files(&quot;20140304_LST&quot;, pattern = &quot;tif$&quot;, 
195
    full = T), stringsAsFactors = F)
196
f$month = as.numeric(do.call(rbind, strsplit(basename(f$path), &quot;_|[.]&quot;))[, 7])
197
f$type = do.call(rbind, strsplit(basename(f$path), &quot;_|[.]&quot;))[, 1]
198
f = f[order(f$month), ]
199
f$mn = month.name[f$month]
200

  
201
## create raster stacks
202
lst_mean = stack(f$path[f$type == &quot;mean&quot;])
203
names(lst_mean) = f$mn[f$type == &quot;mean&quot;]
204
NAvalue(lst_mean) = 0
205

  
206
lst_nobs = stack(f$path[f$type == &quot;nobs&quot;])
207
names(lst_nobs) = f$mn[f$type == &quot;nobs&quot;]
208

  
209
lst_qa = stack(f$path[f$type == &quot;qa&quot;])
210
names(lst_qa) = f$mn[f$type == &quot;qa&quot;]
211

  
212
## define a function to summarize data
213
fst = function(x, na.rm = T) c(mean = mean(x, na.rm = T), min = min(x, na.rm = T), 
214
    max = max(x, na.rm = T))
215
rfst = function(r) cellStats(r, fst)
216
</code></pre>
217

  
218
<h2>Mean Monthly LST</h2>
219

  
220
<p>Map of LST by month (with white indicating missing data).  Note that many inland regions have missing data (white) in some months (mostly winter).</p>
221

  
222
<pre><code class="r">colramp = colorRampPalette(c(&quot;blue&quot;, &quot;orange&quot;, &quot;red&quot;))
223
dt_mean = rfst(lst_mean)
224
levelplot(lst_mean, col.regions = c(colramp(99)), at = seq(0, 65, len = 99), 
225
    main = &quot;Mean Land Surface Temperature&quot;, sub = &quot;Tile H08v05 (California and Northern Mexico)&quot;)
226
</code></pre>
227

  
228
<p><img src="http://i.imgur.com/LTEp1xT.png" alt="plot of chunk unnamed-chunk-4"/> </p>
229

  
230
<p>Table of mean, min, and maximum LST for this tile by month.</p>
231

  
232
<pre><code class="r">print(xtable(dt_mean), type = &quot;html&quot;)
233
</code></pre>
234

  
235
<!-- html table generated in R 3.0.2 by xtable 1.7-1 package -->
236

  
237
<!-- Tue Mar  4 14:19:55 2014 -->
238

  
239
<TABLE border=1>
240
<TR> <TH>  </TH> <TH> January </TH> <TH> February </TH> <TH> March </TH> <TH> April </TH> <TH> May </TH> <TH> June </TH> <TH> July </TH> <TH> August </TH> <TH> September </TH> <TH> October </TH> <TH> November </TH> <TH> December </TH>  </TR>
241
  <TR> <TD align="right"> mean </TD> <TD align="right"> 15.01 </TD> <TD align="right"> 18.41 </TD> <TD align="right"> 25.81 </TD> <TD align="right"> 32.05 </TD> <TD align="right"> 39.49 </TD> <TD align="right"> 44.18 </TD> <TD align="right"> 44.70 </TD> <TD align="right"> 41.96 </TD> <TD align="right"> 38.59 </TD> <TD align="right"> 30.84 </TD> <TD align="right"> 21.77 </TD> <TD align="right"> 14.33 </TD> </TR>
242
  <TR> <TD align="right"> min </TD> <TD align="right"> 1.43 </TD> <TD align="right"> 1.98 </TD> <TD align="right"> 1.08 </TD> <TD align="right"> 1.28 </TD> <TD align="right"> 2.37 </TD> <TD align="right"> 5.03 </TD> <TD align="right"> 12.04 </TD> <TD align="right"> 12.96 </TD> <TD align="right"> 12.72 </TD> <TD align="right"> 6.90 </TD> <TD align="right"> 2.77 </TD> <TD align="right"> 2.76 </TD> </TR>
243
  <TR> <TD align="right"> max </TD> <TD align="right"> 31.31 </TD> <TD align="right"> 36.74 </TD> <TD align="right"> 45.88 </TD> <TD align="right"> 52.29 </TD> <TD align="right"> 58.66 </TD> <TD align="right"> 60.88 </TD> <TD align="right"> 61.15 </TD> <TD align="right"> 60.99 </TD> <TD align="right"> 57.07 </TD> <TD align="right"> 48.82 </TD> <TD align="right"> 39.17 </TD> <TD align="right"> 29.42 </TD> </TR>
244
   </TABLE>
245

  
246
<h3>Boxplot of Monthly Mean LST</h3>
247

  
248
<pre><code class="r">lst_tmean = melt(unlist(as.matrix(lst_mean)))
249
colnames(lst_tmean) = c(&quot;cell&quot;, &quot;month&quot;, &quot;value&quot;)
250
lst_tmean = lst_tmean[!is.na(lst_tmean$value), ]
251
lst_tmean$month = factor(lst_tmean$month, levels = month.name, ordered = T)
252
bwplot(value ~ month, data = lst_tmean, ylab = &quot;Mean LST (c)&quot;, xlab = &quot;Month&quot;)
253
</code></pre>
254

  
255
<p><img src="http://i.imgur.com/5Knr2zX.png" alt="plot of chunk unnamed-chunk-6"/> </p>
256

  
257
<h2>Total number of available observations</h2>
258

  
259
<p>This section details the spatial and temporal distribution of the number of LST observations that were not masked by quality control (see section below).  Note that the regions with no data in the map above have missing data (nobs=0) here as well, but also the areas surrounding those regions have low numbers of observations in some months (blue colors).  </p>
260

  
261
<pre><code class="r">dt_nobs = rfst(lst_nobs)
262
levelplot(lst_nobs, col.regions = c(&quot;grey&quot;, colramp(99)), at = c(-0.5, 0.5, 
263
    seq(1, 325, len = 99)), main = &quot;Sum Available Observations&quot;, sub = &quot;Tile H08v05 (California and Northern Mexico) \n Grey indicates zero observations&quot;)
264
</code></pre>
265

  
266
<p><img src="http://i.imgur.com/n7HfvPt.png" alt="plot of chunk unnamed-chunk-7"/> </p>
267

  
268
<p>Table of mean, min, and maximum number of observations for this tile by month.</p>
269

  
270
<!-- html table generated in R 3.0.2 by xtable 1.7-1 package -->
271

  
272
<!-- Tue Mar  4 14:21:49 2014 -->
273

  
274
<TABLE border=1>
275
<TR> <TH>  </TH> <TH> January </TH> <TH> February </TH> <TH> March </TH> <TH> April </TH> <TH> May </TH> <TH> June </TH> <TH> July </TH> <TH> August </TH> <TH> September </TH> <TH> October </TH> <TH> November </TH> <TH> December </TH>  </TR>
276
  <TR> <TD align="right"> mean </TD> <TD align="right"> 107.97 </TD> <TD align="right"> 100.06 </TD> <TD align="right"> 140.35 </TD> <TD align="right"> 152.19 </TD> <TD align="right"> 177.02 </TD> <TD align="right"> 178.22 </TD> <TD align="right"> 156.86 </TD> <TD align="right"> 169.87 </TD> <TD align="right"> 180.29 </TD> <TD align="right"> 167.68 </TD> <TD align="right"> 136.12 </TD> <TD align="right"> 102.86 </TD> </TR>
277
  <TR> <TD align="right"> min </TD> <TD align="right"> 0.00 </TD> <TD align="right"> 0.00 </TD> <TD align="right"> 0.00 </TD> <TD align="right"> 0.00 </TD> <TD align="right"> 0.00 </TD> <TD align="right"> 0.00 </TD> <TD align="right"> 0.00 </TD> <TD align="right"> 0.00 </TD> <TD align="right"> 0.00 </TD> <TD align="right"> 0.00 </TD> <TD align="right"> 0.00 </TD> <TD align="right"> 0.00 </TD> </TR>
278
  <TR> <TD align="right"> max </TD> <TD align="right"> 272.00 </TD> <TD align="right"> 238.00 </TD> <TD align="right"> 281.00 </TD> <TD align="right"> 293.00 </TD> <TD align="right"> 319.00 </TD> <TD align="right"> 304.00 </TD> <TD align="right"> 319.00 </TD> <TD align="right"> 324.00 </TD> <TD align="right"> 310.00 </TD> <TD align="right"> 305.00 </TD> <TD align="right"> 271.00 </TD> <TD align="right"> 260.00 </TD> </TR>
279
   </TABLE>
280

  
281
<h3>Boxplot of Number of Observations</h3>
282

  
283
<p>The seasonal cycle of missing data is quite noisy, though there tend to be fewer observations in winter months (DJF).  </p>
284

  
285
<pre><code class="r">lst_tnobs = melt(unlist(as.matrix(lst_nobs)))
286
colnames(lst_tnobs) = c(&quot;cell&quot;, &quot;month&quot;, &quot;value&quot;)
287
lst_tnobs = lst_tnobs[!is.na(lst_tnobs$value), ]
288
lst_tnobs$month = factor(lst_tnobs$month, levels = month.name, ordered = T)
289
bwplot(value ~ month, data = lst_tnobs, ylab = &quot;Number of availble observations&quot;, 
290
    xlab = &quot;Month&quot;)
291
</code></pre>
292

  
293
<p><img src="http://i.imgur.com/G9g9qQw.png" alt="plot of chunk unnamed-chunk-9"/> </p>
294

  
295
<h2>Quality Assessment level used</h2>
296

  
297
<p>Map of the Quality Assessment (QA) level used to fill the pixels. It goes from 0 (highest quality) to 3(low). For h08v05 all pixels are filled with either 0 or 1. So red indicates areas with the lower quality data (most of the tile).</p>
298

  
299
<pre><code class="r">levelplot(lst_qa, col.regions = c(&quot;grey&quot;, &quot;red&quot;), at = c(-0.5, 0.5, 1.5), cuts = 2, 
300
    main = &quot;Quality Assessment Filter&quot;, sub = &quot;Tile H08v05 (California and Northern Mexico)&quot;)
301
</code></pre>
302

  
303
<p><img src="http://i.imgur.com/LWLYRXJ.png" alt="plot of chunk unnamed-chunk-10"/> </p>
304

  
305
<p>Proportion of cells in each month with QA=1 (including cells in the Pacific Ocean)</p>
306

  
307
<!-- html table generated in R 3.0.2 by xtable 1.7-1 package -->
308

  
309
<!-- Tue Mar  4 14:23:35 2014 -->
310

  
311
<TABLE border=1>
312
<TR> <TH>  </TH> <TH> January </TH> <TH> February </TH> <TH> March </TH> <TH> April </TH> <TH> May </TH> <TH> June </TH> <TH> July </TH> <TH> August </TH> <TH> September </TH> <TH> October </TH> <TH> November </TH> <TH> December </TH>  </TR>
313
  <TR> <TD align="right"> ProportionQA_1 </TD> <TD align="right"> 0.47 </TD> <TD align="right"> 0.47 </TD> <TD align="right"> 0.42 </TD> <TD align="right"> 0.40 </TD> <TD align="right"> 0.38 </TD> <TD align="right"> 0.37 </TD> <TD align="right"> 0.42 </TD> <TD align="right"> 0.40 </TD> <TD align="right"> 0.38 </TD> <TD align="right"> 0.38 </TD> <TD align="right"> 0.43 </TD> <TD align="right"> 0.47 </TD> </TR>
314
   </TABLE>
315

  
316
<h2>Questions</h2>
317

  
318
<p>A few open questions/comments (in my mind):</p>
319

  
320
<ol>
321
<li>Why are there only two QA classes for this tile (0 and 1) rather than 4 (0-3)?  There are still missing data in some months, is the plan to do it or was there another reason to not consider all classes for this tile?</li>
322
<li>How exactly are the different QA levels selected?  If QA=0 results in &lt;33 obs, go to QA=1, etc.?<br/></li>
323
<li> Please name monthly output in a way that it sorts chronologically  (e.g. mean_LST_Day_1km_h08v05_04.tif instead of mean_LST_Day_1km_h08v05_apr_4.tif )<br/></li>
324
<li> Please name directories on ECOcast with dates rather than &ldquo;new&rdquo;.  E.g. LST/20140304/*   That will make it easier to see which is the new version.</li>
325
<li> Should we consider also saving the SD of the observations in each pixel (in addition to the mean and n of observations)?</li>
326
</ol>
327

  
328
</body>
329

  
330
</html>
331

  
climate/research/LST_missingdata.md
1
LST Climatology Evaluation
2
====
3

  
4

  
5

  
6
### Adam M. Wilson (Compiled on Tue Mar  4 14:31:08 2014  using code version (git hash): f41365c)
7

  
8
A short script to visualize and explore the updated Land Surface Climatology algorithm that 'lowers the standards' in some areas to increase the number of available observations.  
9

  
10

  
11

  
12

  
13

  
14
## Download data from ECOcast and convert to raster stacks
15

  
16
```r
17
download = F
18
if (download) system("wget -e robots=off -L -r -np -nd -p 20140304_LST -nc -A tif http://ecocast.arc.nasa.gov/data/pub/climateLayers/LST_new/")
19

  
20
## organize file names
21
f = data.frame(full = T, path = list.files("20140304_LST", pattern = "tif$", 
22
    full = T), stringsAsFactors = F)
23
f$month = as.numeric(do.call(rbind, strsplit(basename(f$path), "_|[.]"))[, 7])
24
f$type = do.call(rbind, strsplit(basename(f$path), "_|[.]"))[, 1]
25
f = f[order(f$month), ]
26
f$mn = month.name[f$month]
27

  
28
## create raster stacks
29
lst_mean = stack(f$path[f$type == "mean"])
30
names(lst_mean) = f$mn[f$type == "mean"]
31
NAvalue(lst_mean) = 0
32

  
33
lst_nobs = stack(f$path[f$type == "nobs"])
34
names(lst_nobs) = f$mn[f$type == "nobs"]
35

  
36
lst_qa = stack(f$path[f$type == "qa"])
37
names(lst_qa) = f$mn[f$type == "qa"]
38

  
39
## define a function to summarize data
40
fst = function(x, na.rm = T) c(mean = mean(x, na.rm = T), min = min(x, na.rm = T), 
41
    max = max(x, na.rm = T))
42
rfst = function(r) cellStats(r, fst)
43
```
44

  
45

  
46
## Mean Monthly LST
47

  
48
Map of LST by month (with white indicating missing data).  Note that many inland regions have missing data (white) in some months (mostly winter).
49

  
50
```r
51
colramp = colorRampPalette(c("blue", "orange", "red"))
52
dt_mean = rfst(lst_mean)
53
levelplot(lst_mean, col.regions = c(colramp(99)), at = seq(0, 65, len = 99), 
54
    main = "Mean Land Surface Temperature", sub = "Tile H08v05 (California and Northern Mexico)")
55
```
56

  
57
![plot of chunk unnamed-chunk-4](http://i.imgur.com/LTEp1xT.png) 
58

  
59

  
60

  
61
Table of mean, min, and maximum LST for this tile by month.
62

  
63
```r
64
print(xtable(dt_mean), type = "html")
65
```
66

  
67
<!-- html table generated in R 3.0.2 by xtable 1.7-1 package -->
68
<!-- Tue Mar  4 14:19:55 2014 -->
69
<TABLE border=1>
70
<TR> <TH>  </TH> <TH> January </TH> <TH> February </TH> <TH> March </TH> <TH> April </TH> <TH> May </TH> <TH> June </TH> <TH> July </TH> <TH> August </TH> <TH> September </TH> <TH> October </TH> <TH> November </TH> <TH> December </TH>  </TR>
71
  <TR> <TD align="right"> mean </TD> <TD align="right"> 15.01 </TD> <TD align="right"> 18.41 </TD> <TD align="right"> 25.81 </TD> <TD align="right"> 32.05 </TD> <TD align="right"> 39.49 </TD> <TD align="right"> 44.18 </TD> <TD align="right"> 44.70 </TD> <TD align="right"> 41.96 </TD> <TD align="right"> 38.59 </TD> <TD align="right"> 30.84 </TD> <TD align="right"> 21.77 </TD> <TD align="right"> 14.33 </TD> </TR>
72
  <TR> <TD align="right"> min </TD> <TD align="right"> 1.43 </TD> <TD align="right"> 1.98 </TD> <TD align="right"> 1.08 </TD> <TD align="right"> 1.28 </TD> <TD align="right"> 2.37 </TD> <TD align="right"> 5.03 </TD> <TD align="right"> 12.04 </TD> <TD align="right"> 12.96 </TD> <TD align="right"> 12.72 </TD> <TD align="right"> 6.90 </TD> <TD align="right"> 2.77 </TD> <TD align="right"> 2.76 </TD> </TR>
73
  <TR> <TD align="right"> max </TD> <TD align="right"> 31.31 </TD> <TD align="right"> 36.74 </TD> <TD align="right"> 45.88 </TD> <TD align="right"> 52.29 </TD> <TD align="right"> 58.66 </TD> <TD align="right"> 60.88 </TD> <TD align="right"> 61.15 </TD> <TD align="right"> 60.99 </TD> <TD align="right"> 57.07 </TD> <TD align="right"> 48.82 </TD> <TD align="right"> 39.17 </TD> <TD align="right"> 29.42 </TD> </TR>
74
   </TABLE>
75

  
76

  
77
###  Boxplot of Monthly Mean LST
78

  
79
```r
80
lst_tmean = melt(unlist(as.matrix(lst_mean)))
81
colnames(lst_tmean) = c("cell", "month", "value")
82
lst_tmean = lst_tmean[!is.na(lst_tmean$value), ]
83
lst_tmean$month = factor(lst_tmean$month, levels = month.name, ordered = T)
84
bwplot(value ~ month, data = lst_tmean, ylab = "Mean LST (c)", xlab = "Month")
85
```
86

  
87
![plot of chunk unnamed-chunk-6](http://i.imgur.com/5Knr2zX.png) 
88

  
89

  
90

  
91
## Total number of available observations
92

  
93
This section details the spatial and temporal distribution of the number of LST observations that were not masked by quality control (see section below).  Note that the regions with no data in the map above have missing data (nobs=0) here as well, but also the areas surrounding those regions have low numbers of observations in some months (blue colors).  
94

  
95
```r
96
dt_nobs = rfst(lst_nobs)
97
levelplot(lst_nobs, col.regions = c("grey", colramp(99)), at = c(-0.5, 0.5, 
98
    seq(1, 325, len = 99)), main = "Sum Available Observations", sub = "Tile H08v05 (California and Northern Mexico) \n Grey indicates zero observations")
99
```
100

  
101
![plot of chunk unnamed-chunk-7](http://i.imgur.com/n7HfvPt.png) 
102

  
103

  
104
Table of mean, min, and maximum number of observations for this tile by month.
105
<!-- html table generated in R 3.0.2 by xtable 1.7-1 package -->
106
<!-- Tue Mar  4 14:21:49 2014 -->
107
<TABLE border=1>
108
<TR> <TH>  </TH> <TH> January </TH> <TH> February </TH> <TH> March </TH> <TH> April </TH> <TH> May </TH> <TH> June </TH> <TH> July </TH> <TH> August </TH> <TH> September </TH> <TH> October </TH> <TH> November </TH> <TH> December </TH>  </TR>
109
  <TR> <TD align="right"> mean </TD> <TD align="right"> 107.97 </TD> <TD align="right"> 100.06 </TD> <TD align="right"> 140.35 </TD> <TD align="right"> 152.19 </TD> <TD align="right"> 177.02 </TD> <TD align="right"> 178.22 </TD> <TD align="right"> 156.86 </TD> <TD align="right"> 169.87 </TD> <TD align="right"> 180.29 </TD> <TD align="right"> 167.68 </TD> <TD align="right"> 136.12 </TD> <TD align="right"> 102.86 </TD> </TR>
110
  <TR> <TD align="right"> min </TD> <TD align="right"> 0.00 </TD> <TD align="right"> 0.00 </TD> <TD align="right"> 0.00 </TD> <TD align="right"> 0.00 </TD> <TD align="right"> 0.00 </TD> <TD align="right"> 0.00 </TD> <TD align="right"> 0.00 </TD> <TD align="right"> 0.00 </TD> <TD align="right"> 0.00 </TD> <TD align="right"> 0.00 </TD> <TD align="right"> 0.00 </TD> <TD align="right"> 0.00 </TD> </TR>
111
  <TR> <TD align="right"> max </TD> <TD align="right"> 272.00 </TD> <TD align="right"> 238.00 </TD> <TD align="right"> 281.00 </TD> <TD align="right"> 293.00 </TD> <TD align="right"> 319.00 </TD> <TD align="right"> 304.00 </TD> <TD align="right"> 319.00 </TD> <TD align="right"> 324.00 </TD> <TD align="right"> 310.00 </TD> <TD align="right"> 305.00 </TD> <TD align="right"> 271.00 </TD> <TD align="right"> 260.00 </TD> </TR>
112
   </TABLE>
113

  
114

  
115
###  Boxplot of Number of Observations
116
The seasonal cycle of missing data is quite noisy, though there tend to be fewer observations in winter months (DJF).  
117

  
118
```r
119
lst_tnobs = melt(unlist(as.matrix(lst_nobs)))
120
colnames(lst_tnobs) = c("cell", "month", "value")
121
lst_tnobs = lst_tnobs[!is.na(lst_tnobs$value), ]
122
lst_tnobs$month = factor(lst_tnobs$month, levels = month.name, ordered = T)
123
bwplot(value ~ month, data = lst_tnobs, ylab = "Number of availble observations", 
124
    xlab = "Month")
125
```
126

  
127
![plot of chunk unnamed-chunk-9](http://i.imgur.com/G9g9qQw.png) 
128

  
129

  
130

  
131
## Quality Assessment level used
132

  
133
Map of the Quality Assessment (QA) level used to fill the pixels. It goes from 0 (highest quality) to 3(low). For h08v05 all pixels are filled with either 0 or 1. So red indicates areas with the lower quality data (most of the tile).
134

  
135
```r
136
levelplot(lst_qa, col.regions = c("grey", "red"), at = c(-0.5, 0.5, 1.5), cuts = 2, 
137
    main = "Quality Assessment Filter", sub = "Tile H08v05 (California and Northern Mexico)")
138
```
139

  
140
![plot of chunk unnamed-chunk-10](http://i.imgur.com/LWLYRXJ.png) 
141

  
142

  
143

  
144
Proportion of cells in each month with QA=1 (including cells in the Pacific Ocean)
145
<!-- html table generated in R 3.0.2 by xtable 1.7-1 package -->
146
<!-- Tue Mar  4 14:23:35 2014 -->
147
<TABLE border=1>
148
<TR> <TH>  </TH> <TH> January </TH> <TH> February </TH> <TH> March </TH> <TH> April </TH> <TH> May </TH> <TH> June </TH> <TH> July </TH> <TH> August </TH> <TH> September </TH> <TH> October </TH> <TH> November </TH> <TH> December </TH>  </TR>
149
  <TR> <TD align="right"> ProportionQA_1 </TD> <TD align="right"> 0.47 </TD> <TD align="right"> 0.47 </TD> <TD align="right"> 0.42 </TD> <TD align="right"> 0.40 </TD> <TD align="right"> 0.38 </TD> <TD align="right"> 0.37 </TD> <TD align="right"> 0.42 </TD> <TD align="right"> 0.40 </TD> <TD align="right"> 0.38 </TD> <TD align="right"> 0.38 </TD> <TD align="right"> 0.43 </TD> <TD align="right"> 0.47 </TD> </TR>
150
   </TABLE>
151

  
152

  
153

  
154
## Questions
155

  
156
A few open questions/comments (in my mind):
157

  
158
  1. Why are there only two QA classes for this tile (0 and 1) rather than 4 (0-3)?  There are still missing data in some months, is the plan to do it or was there another reason to not consider all classes for this tile?
159
  2. How exactly are the different QA levels selected?  If QA=0 results in <33 obs, go to QA=1, etc.?  
160
  3.  Please name monthly output in a way that it sorts chronologically  (e.g. mean_LST_Day_1km_h08v05_04.tif instead of mean_LST_Day_1km_h08v05_apr_4.tif )  
161
  4.  Please name directories on ECOcast with dates rather than "new".  E.g. LST/20140304/*   That will make it easier to see which is the new version.
162
  5.  Should we consider also saving the SD of the observations in each pixel (in addition to the mean and n of observations)?
163

  

Also available in: Unified diff