2017-11-22 7 views
0

저는 래스터로 작업 중이며 7n 레이어의 래스터 스택을 사용하고 있습니다. 아래 공식을 사용하여 픽셀 단위 회귀를 계산하고 싶습니다. 내가 raster::calc와 함께 일을하려고했지만, 내 함수는 메시지와 함께 실패 lm.fit에서재미로 래스터 스택에서 R의 픽셀 단위 회귀를 계산할 수 없습니다.

'오류 (= 오프셋 오프셋, X, Y, singular.ok = singular.ok, ...) : 0 (비 NA) 케이스. '

그러나 모든 래스터가 OK이고, 숫자 (단지의 NA)를 포함하고, I는 그것을 플롯하고 I 화학식

cr.sig=lm (raster::as.array(MK_trend.EVI.sig_Only) ~ raster::as.array(stack.pet)+raster::as.array(stack.tmp)+raster::as.array(stack.vap)+raster::as.array(stack.pre)+raster::as.array(stack.wet)+raster::as.array(stack.dtr)) 

와 일반 선형 회귀를 계산할 수하지만

와 레이어 스택 때
allData = stack(MK_trend.EVI.sig_Only,stack.dtr,stack.wet,stack.pre,stack.vap,stack.tmp,stack.pet) 

시도 CALC 기능

# Regression Function, R2 
lmFun=function(x){ 
    x1=as.vector(x); 
    if (is.na(x1[1])){ 
     NA 
    } else { 
     m = lm(x1[1] ~ x1[2]+x1[3]+x1[4]+x1[5]+x1[6]+x1[7]) 
     return(summary(m)$r.squared) 
    } 
} 

오류 메시지가 나타납니다.
저는 R에서 꽤 새로운데, 그래서, 어쩌면 바보 같은 실수가 있을까요? 처리 작업을하기 위해 어떤 힌트를 주셔서 감사하겠습니다.

+0

오류를 재현하는 예제 데이터를 만드는 코드를 제공 할 수 있습니까? – RobertH

+0

@RobertH 친애하는 로버트, 내 데이터 집합에 문제가있는 것 같아서 ZIP 아카이브 (1,7Gb) 형식으로 업로드하십시오. http://dropmefiles.com/PDZL0 –

답변

0

픽셀 단위 (로컬) 회귀에 대해서는 calc을 사용할 수 있지만 다른 식 (글로벌 모델)을 원한다고 제안하는식이 나타납니다.

회귀가 픽셀 단위 인 경우 각 셀에 대해 x와 y 값을 같게하고 calc을 사용할 수 있습니다. 예제는 ?calc을 참조하십시오.

대신 각 셀에 대해 y (독립) 및 6 x (종속) 변수 값이 있습니다. 이는 글로벌 모델을 원한다는 것을 의미합니다. 이를 위해 다음과 같이 할 수 있습니다 :

library(raster) 
# example data 
r <- raster(nrow=10, ncol=10) 
set.seed(0) 
s <- stack(lapply(1:7, function(i) setValues(r, rnorm(ncell(r), i, 3)))) 
x <- values(s) 

# model 
m <- lm(layer.1 ~ ., data=data.frame(x)) 

# prediction 
p <- predict(s, m) 

이렇게하려면 모든 값을 메모리에로드해야합니다. 그렇게 할 수 없다면 큰 표본을 채취 할 수 있습니다. 참조

sampleRegular 그리고 당신의 접근 방식이 작동하지 않는 이유를 보여 :

testFun=function(x1){ 
    lm(x1[1] ~ x1[2]+x1[3]+x1[4]+x1[5]+x1[6]+x1[7]) 
} 

# first cell 
v <- s[1] 
v 
#  layer.1 layer.2 layer.3 layer.4 layer.5 layer.6 layer.7 
#[1,] 4.788863 4.345578 -0.137153 3.626695 3.829971 4.120895 1.936597 

m <- testFun(v) 
m 
#Call: 
#lm(formula = x1[1] ~ x1[2] + x1[3] + x1[4] + x1[5] + x1[6] + x1[7]) 

#Coefficients: 
#(Intercept)  x1[2]  x1[3]  x1[4]  x1[5]  x1[6]  x1[7] 
#  4.789   NA   NA   NA   NA   NA   NA 


summary(m)$r.squared 
# 0 

을 당신이보고하는 오류 메시지가 표시되지 않습니다 (그러나 모든 R^2 개 값은 제로입니다)에도 불구하고.

+0

친애하는 Robert, 정말 고마워요. 설명, 나는 인터셉트 (return (summary (m) $ coefficients [1])를 얻으려고 시도했으나 이전과 같은 오류가있다. –

관련 문제