2017-11-26 21 views
-1

나는이 벡터 (시계열) 계산 코드를 재현하기 위해 노력하고있어 : 래스터 연산 코드로r -이 시계열 계산을 래스터 계산으로 변환하는 방법?

gamma.parameters<- fitdistr(may_baseline_3months[may_baseline_3months>0],"gamma")

.

이 코드가 원래하는 것은 벡터 (시계열) may_baseline_3months에 최대 우도 추정을 적용하여 감마 분포를 맞추려고합니다.

그리고 내가하고 싶은 것은 같은 것을 계산하는 것이지만 래스터 스택으로 계산하는 것입니다.

나는 calc() 기능이 일을 시도 :

f1<-function(x) { library(MASS) return(fitdistr(x,"gamma")) } gamma.parameters<- calc(x = may_baseline_3months,fun = f1)

Error in .calcTest(x[1:5], fun, na.rm, forcefun, forceapply) : cannot use this function

을했지만 작동하지 않았다. 참고 : 래스터 스택에는 4 개의 레이어 만 있습니다.

당신은 여기 spi

fitdistr 내 주요 목표의 절차의 일부인 예를 들어, 데이터를 다운로드 할 수 있습니다

편집 할 수 있습니다. 표준 강수량 지수를 계산하려고합니다. 30 년의 월간 강수량의 시계열로 이미 작업을 수행했습니다. 마지막 줄은 내가 래스터 스택 계산하는 문제가 발생 하나입니다

data<-read.csv("guatemala_spi.csv",header = T,sep=";") 

dates<-data[,1] 
rain_1month<-data[,2] 
rain_3months<-0 
#Setting the first 2 elements to NA because I'm going to calcule the accumulating the rainfall for 3 month 
for (i in c(1:2)) { 
    rain_3months[i]<-NA 
} 
#Accumulating the rainfall for the rest of the data 
number_of_months<-length(rain_1month) 
for (j in c(3:number_of_months)) 
{ 
rain_3months[j]<-0.0 
for (i in c(0:2)) 
{ 
rain_3months[j] = rain_3months[j] + rain_1month[j-i] 
} 
} 
#Extracting a time-series for the month of interest (May) 
may_rain_3months<-rain_3months[substr(dates,5,6)==”05”] 
dates_may<-dates[substr(dates,5,6)==”05”] 
number_of_years<-length(dates_may) 

#Fitting the gama distribution by maximum likelihood estimation 
start_year<-1971 
end_year<-2010 
start_index<-which(substr(dates_may,1,4)==start_year) 
end_index<-which(substr(dates_may,1,4)==end_year) 
may_baseline_3months<-may_rain_3months[start_index:end_index] 

library(MASS) 
gamma.parameters<-fitdistr(may_baseline_3months[may_baseline_3months>0],"gamma") 

그건 : 여기

내가 재고 해요 라인까지 시계열에 대한 코드입니다.

예 다층 래스터 here (총 월별 강수량 2001 2004, 48 층)

#Initiating a dates vector 
dates<-c("200101","200102","200103","200104","200105","200106","200107","200108","200109","200110","200111","200112", 
    "200201","200202","200203","200204","200205","200206","200207","200208","200209","200210","200211","200212", 
    "200301","200302","200303","200304","200305","200306","200307","200308","200309","200310","200311","200312", 
    "200401","200402","200403","200404","200405","200406","200407","200408","200409","200410","200411","200412") 
#Initiating a NA raster 
rain_3months_1layer<-raster(nrow=1600, ncol=1673,extent(-118.4539, -34.80395, -50, 30),res=c(0.05,0.05)) 
values(rain_3months_1layer)<-NA 

#Creating a raster stack NA of 48 layers 
rain_3months<-stack(mget(rep("rain_3months_1layer" , 48))) 

#Reading the data 
rain_1month <- stack("chirps_rain_1month.tif") 

#Accumulating the rainfall 
number_of_months<-nlayers(rain_1month) 
for (j in c(3:number_of_months)) 
{ 
rain_3months[[j]]<-0.0 
for (i in c(0:2)) 
{ 
rain_3months[[j]] = rain_3months[[j]] + rain_1month[[j-i]] 
} 
} 

#Extracting the raster for the month of interest (May) 
may_rain_3months<-stack(rain_3months[[which(substr(dates,5,6)=="05", arr.ind = T)]]) 
dates_may<-dates[substr(dates,5,6)=="05"] 
number_of_years<-length(dates_may) 

#Fitting the gama distribution by maximum likelihood estimation 
start_year<-2001 
end_year<-2004 
start_index<-which(substr(dates_may,1,4)==start_year) 
end_index<-which(substr(dates_may,1,4)==end_year) 
may_baseline_3months<-stack(may_rain_3months[[start_index:end_index]]) 

library(MASS) 

f1<-function(x) 
{ 
library(MASS) 
return(fitdistr(x,"gamma")) 
} 
gamma.parameters<- calc(x = may_baseline_3months,fun = f1) 

난에 calc()을 할 수 없습니다 : 여기

내가 래스터 형태로 지금까지이 무엇 래스터 스택에 fitdistr()을 계산하십시오.

+0

rstudio 태그는 관련이 없으므로 삭제되었습니다 (일반 R). 래스터 태그가 추가되었습니다. 우리가 모두 실행할 수있는 재현 가능한 예를 만들 수 있습니까? – Spacedman

+0

재생 해 주셔서 감사합니다. 나는 예제를 추가했다. –

답변

0

calc에서 사용할 수있는 기능을 만들어야합니다. 함수 f1fitdistr 클래스의 오브젝트를 리턴합니다. calc 기능은 그와 함께 무엇을 해야할지하지 않습니다

library(MASS) 
set.seed(0) 
x <- runif(10) 

f1 <- function(x) { 
    return(fitdistr(x,"gamma")) 
} 

a <- f1(x) 
class(a) 
# [1] "fitdistr" 
a 
# shape  rate 
# 4.401575 6.931571 
# (1.898550) (3.167113) 

당신은 숫자를 반환하는 함수가 필요합니다. f2처럼 : calc

f2 <- function(x) { 
    fitdistr(x,"gamma")$estimate 
} 

b <- f2(x) 

class(b) 
#[1] "numeric" 
b 
# shape  rate 
#4.401575 6.931571 

시험 f2 :

library(raster) 
s <- stack(lapply(1:12, function(i) setValues(r, runif(ncell(r))))) 
r <- calc(s, f2) 

나는이 질문에 응답한다고 가정합니다. 나는 당신의 질문이 너무 복잡하기 때문에 확신 할 수 없습니다.이와 같은 문제로 가장 먼저해야 할 일은 위에서 한 것처럼 간단한 예제를 만드는 것입니다. 스탯

다음 질문

오류 :: Optim을 (X가 C를 (7, 7, 7, 7), 파 = 목록 (형태 = inf를 속도 = Inf를) : 비 Optim을에 의해 제공 -finite 값., 당신이 처리 할 수없는 값으로 fitdistr를 제공하고 다른 문제입니다

가. 당신은 당신이에 일어나는 세포를 식별 할 수 있습니다. 그 이상 건너 뛸 try 절을 추가 할 수 있으며 당신이해야할 다른 것이 있다면 가치가 무엇인지 알 것입니다. 영형. 당신이 f3에 의해 반환되는 값의 수는 항상 동일해야합니다 있는지 확인해야

f3 <- function(x) { 
    x <- try (fitdistr(x,"gamma")$estimate, silent=TRUE) 
    if (class(x) == 'try-error') { c(-9999, -9999) } else { x } 
} 

x[1] <- NA 
f2(x) 
#Error in fitdistr(x, "gamma") : 'x' contains missing or infinite values 
f3(x) 
#[1] -9999 -9999 

참고. 이 경우 두 값. 여기서는 -9999을 사용하여 세포를 식별 할 수 있습니다. 또한 사용할 수 있습니다 NA

+0

감사합니다! 그게 정확히 내가 원하는하지만 지금은이 문제가''통계 오류 :: optim (x = c (7, 7, 7, 7), par = list (shape = Inf, rate = Inf), : non-finite 가치에 의해 제공된 값 .' –

+0

위의 추가 질문에 대한 답변을 추가했습니다. – RobertH