圖資讀取
library(rgdal);library(GISTools);library(spatstat);library(splancs);library(magrittr)
setwd("D:/1082SA/Mid2/Data")
case=readOGR("case.shp")
grid=readOGR("grid.shp")
SH=readOGR("SCHOOL.shp",encoding="utf8")
FS=readOGR("FASTFOOD.shp")
TPE=readOGR("TPE.shp")
Q1.圖表判讀
[10%]
每一張圖2%*5=10%
b / c / f / g / j
Q2-1. 樣方分析
Q2-1-1
[3%]計算VMR
num=poly.counts(case,grid)
VMR=var(num)/mean(num)
cat("VMR=",VMR,sep='')
VMR=0.5416667
Q2-1-2
[3%]檢定
注意:p-value雙尾(若算成單尾則-1%)
VMR.t=(VMR-1)/sqrt(2/(25-1))
p.two_tail=1-2*abs(0.5-pt(VMR.t,25-1))
p-val=0.1254>0.1,不拒絕虛無假設,病例點呈隨機分布。
Q2-2. 高階最鄰近距離分析
Q2-2-1
[5%]畫圖
cap=ppp(case@coords[,1],case@coords[,2],as.owin(grid))
NNI=colMeans(nndist(cap, k=1:5))
plot(1:5,NNI,type='o',lwd=2,xlab="K",ylab="NND",ylim=c(0,2))
Q2-2-2
[5%]蒙地卡羅檢定
排序後找出前後5個(3%)、畫圖(1%)、結論「不隨機」(1%)
NNI_sim=matrix(nrow=99,ncol=5)
for(i in 1:99) NNI_sim[i,]=colMeans(nndist(rpoint(50, win=as.owin(grid)),k=1:5))
NNI_sim=apply(NNI_sim,2,sort)
plot(1:5,NNI,type='o',lwd=2,xlab="K",ylab="NND",ylim=c(0,2.5))
lines(1:5,NNI_sim[5,],lty=2,type='o')
lines(1:5,NNI_sim[95,],lty=2,type='o')
觀察值絡在信賴包絡之外,拒絕虛無假設,病例點不呈隨機分布。
Q2-3. 高階G函數
Q2-3-1
[4%]畫圖 (若沒有設定k=3則-1%)
ND3=nndist(cap,k=3)
plot(ecdf(ND3),verticals=T,lwd=3,cex=0,col="red",xaxs="i",yaxs ="i",main=expression(G[3](d)),xlab="distance",ylab=expression(G[3](d)))
Q2-3-2
[2%]結論「不隨機」
觀察值絡在信賴包絡之外,拒絕虛無假設,病例點不呈隨機分布。
Q2-4. Ripley’s K函數
[5%]畫圖
扣分:設定nrank=5(-1%);圖表中L(r)-r,隨機值=0而不是隨機值=r(-1%);結論「不隨機」(-1%)
L.env=envelope(cap,Lest,nrank=5)
plot(L.env,.-r~r,main="L Function",ylab="L(d)")
觀察值曲線落在信賴包絡之外,拒絕虛無假設,病例點不呈隨機分布。
Q2-5. 綜合分析
[3%]
根據以上檢定方法,評估病例點不為隨機分布。
樣方分析的結果為隨機,建立網格會忽略網格內的點分布,設定網格的大小或位置會影響分析結果。
Q3.程式碼判讀
Q3-1
[4%]
G Function(最鄰近距離的累積頻率分布)。
Q3-2
[6%]
4% + 2%
每個點與最鄰近鄰居的距離。
第一欄是自己和自己距離=0,第二欄才是自己和最近鄰居的距離。
Q1. 學校肥胖指標差異?
[5%]兩母體平均之t檢定
注意假設和結論要一致(單雙尾)
\(H_0: 公立與私立學校的平均腰圍身高比沒有差異\)
\(H_a: 公立與私立學校的平均腰圍身高比有差異\)
\(\alpha=0.05\)
(T.=t.test(index~Type,SH@data))
Welch Two Sample t-test
data: index by Type
t = 5.048, df = 64.98, p-value = 3.849e-06
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
0.01252157 0.02891541
sample estimates:
mean in group 公立 mean in group 私立
0.4349403 0.4142218
p-val<0.05,拒絕虛無假設,公立與私立學校的平均腰圍身高比有差異。
Q2. KDE方法:學校的速食店獨占性
Q2-1
[6%]
※需用splancs的kernel2d,poly引數需從TPE@polygons…擷取
kernel2d設定(2%)、KDE相減(2%)、畫圖(2%)
TPE.bnd=TPE@polygons[[1]]@Polygons[[1]]@coords
SH.KDE=kernel2d(SH@coords,TPE.bnd,1000,100,100,quiet=T)
FS.KDE=kernel2d(FS@coords,TPE.bnd,1000,100,100,quiet=T)
DualKDE=SH.KDE
DualKDE$z=FS.KDE$z-SH.KDE$z
polymap(TPE.bnd,axes=F)
image(DualKDE,add=T,col = brewer.pal(7,"RdYlGn"))
polymap(TPE.bnd,add=T)
Q2-2
[6%]
運算過程(3%)、三間學校的名稱(1%*3=3%)
需先將KDE轉換成SP格式去做套疊,這部分很難,呵呵。
可以用gIntersection的方法應該最直觀,但比較久。
以下用兩個其他方法來作答。
# way 1
grd=GridTopology(c(DualKDE$x[1],DualKDE$y[1]),c(DualKDE$x[2]-DualKDE$x[1],DualKDE$y[2]-DualKDE$y[1]),c(100,100))
grd=as.SpatialPolygons.GridTopology(grd,proj4string = TPE@proj4string)
grd=SpatialPolygonsDataFrame(grd,data=data.frame(z=as.vector(t(apply(DualKDE$z,1,rev))
)),match.ID=F)
# gIntersection
# SH.grd=gIntersection(SH,grd,byid=T)
# SH.grd.ID=rownames(data.frame(SH.grd))
# SH.grd.ID=unlist(strsplit(SH.grd.ID," "))
# grd.ID=SH.grd.ID[seq(2,length(SH.grd.ID),2)]
# SH$z=grd[grd.ID,]$z
grd.ID=apply(gWithin(SH,grd,byid=T),2,which)
SH$z=grd[grd.ID,]$z
# way 2
KDE.sp=SpatialPoints(cbind(rep(DualKDE$x,times=100),rep(DualKDE$y,each=100)),proj4string=FS@proj4string)
KDE.pts=SpatialPointsDataFrame(KDE.sp,data=data.frame(z=as.vector(DualKDE$z)))
DIST=gDistance(SH,KDE.pts,byid =T)
near.id=apply(DIST,2,which.min)
SH$z=KDE.pts$z[near.id]
High.SH=SH[order(SH$z,decreasing=T)[1:3],]
cat(High.SH$Name%>%as.character())
福星國小 敦化國小 光復國小
附註三間學校的地圖
polymap(TPE.bnd,axes=F)
image(DualKDE,add=T,col = brewer.pal(7,"RdYlGn"))
polymap(TPE.bnd,add=T)
points(High.SH,cex=.8)
Q3. 學校到第K鄰近速食店的距離
Q3-1
[6%]
前十鄰近運算過程(4%)、畫出正確的兩條曲線(2%)
NS=SH[SH$Type=="公立",];PS=SH[SH$Type=="私立",]
NS2FS=rowMeans(apply(gDistance(FS,NS,byid=T),1,sort))
PS2FS=rowMeans(apply(gDistance(FS,PS,byid=T),1,sort))
x=1:10
plot (x,NS2FS[x],type='b',col='blue',xaxt='n',ylim=c(0,3500),xlab="K order",ylab="distance")
lines(x,PS2FS[x],type='b',col='red')
axis(1,x,x)
P.S.也可以用ppp格式+nncross方法,結果圖表一樣。
NP=ppp(NS@coords[,1],NS@coords[,2],as.owin(TPE))
PP=ppp(PS@coords[,1],PS@coords[,2],as.owin(TPE))
FP=ppp(FS@coords[,1],FS@coords[,2],as.owin(TPE))
plot (x,colMeans(nncross(NP,FP,k=x)[,x]),type='b',col='blue',xaxt='n',ylim=c(0,3500),xlab="K order",ylab="distance")
lines(x,colMeans(nncross(PP,FP,k=x)[,x]),type='b',col='red')
axis(1,x,x)
Q3-2
[2%]
學校到鄰近速食店的距離。公立學校離鄰近幾家速食店,平均來說,都比私立學校還近。
Q4. 速食店環形搜尋範圍的肥胖指標
Q4-1
[12%]
運算過程(4%)、速食店的id(2%)、該店指標(2%)、平均指標(4%)。
DIST=gDistance(SH,FS,byid=T)
M=DIST>200&DIST<300
near.index=(M%*%SH$index)/rowSums(M)
max.near=max(near.index,na.rm=T)
max.id=which(near.index==max.near)
mean.index=mean(near.index,na.rm = T)
cat(sprintf("d=300時,鄰近肥胖指標最高的速食店的id為「%d」,指標為「%.4f」。平均鄰近肥胖指標為「%.4f」。",max.id,max.near,mean.index))
d=300時,鄰近肥胖指標最高的速食店的id為「23」,指標為「0.5002」。平均鄰近肥胖指標為「0.4410」。
Q4-2
[6%]
運算過程(4%)、畫出正確的兩條曲線(2%)
P.S.運算過程中應該包含gDistance或gBuffer等相關方法
這小題應該是全部最難的部分
x=seq(100,1000,100)
y.NS=y.PS=c()
DIST.NS=gDistance(NS,FS,byid=T)
DIST.PS=gDistance(PS,FS,byid=T)
for(i in x){
M.NS=(DIST.NS>=(i-100)&DIST.NS<i)
M.PS=(DIST.PS>=(i-100)&DIST.PS<i)
z.NS=M.NS%*%NS$index/rowSums(M.NS)
z.PS=M.PS%*%PS$index/rowSums(M.PS)
y.NS=c(y.NS,mean(z.NS,na.rm = T))
y.PS=c(y.PS,mean(z.PS,na.rm = T))
}
plot(NA,xlim=c(100,1000),ylim=c(0.4,0.53),xaxt='n',xlab="搜尋距離",ylab="平均鄰近肥胖指標")
axis(1,seq(100,1000,100))
lines(x,y.NS,type='o',col='blue')
lines(x,y.PS,type='o',col='red')
Q4-3
[2%]
計算速食店附近學校的肥胖指標,以環形的搜尋區域來觀察,隨著搜尋距離越遠,肥胖指標變化趨勢。能看出隨著距離速食店越遠,平均的肥胖指標有下降再持平的趨勢,且公立的指標皆高於私立。
Q5. 綜合評估
[5%]
速食店、公私立學校與學生肥胖的關連性:
1. 平均而言,公立學校的肥胖指標較私立學校高。
2. 公立學校到速食店距離也比私立學校近。
3. 離速食店越附近的學校,平均的肥胖指標也會較高,且公立學校也高於私立學校。