R의 fda 패키지를 사용하여 새 곡선의 응답 예측


10

기본적으로 내가 원하는 것은 일부 곡선을 사용하여 스칼라 반응을 예측하는 것입니다. fda 패키지에서 fRegress를 사용하여 회귀 분석을 수행했지만 결과를 새로운 곡선 세트 (예측)에 적용하는 방법을 모릅니다.

N = 536 곡선과 536 스칼라 반응이 있습니다. 여기까지 내가 한 일이 있습니다.

  • 커브의 기초를 만들었습니다.
  • 페널티를 도입하기 위해 fdPar 객체를 만들었습니다
  • smooth.basis를 사용하여 fd 객체를 생성하여 지정된 기준으로 선택한 페널티로 커브를 부드럽게합니다.
  • fRegress ()를 사용하여 회귀를 실행하여 스칼라 응답의 곡선을 회귀했습니다.

이제 내가하고 싶은 것은 그 회귀를 사용하여 내가 가진 새로운 데이터 세트에 대한 예측을 생성하는 것입니다. 이 작업을 수행하는 쉬운 방법을 찾지 못하는 것 같습니다.

건배


기초, 평활 (fd) 객체 및 fRegress ()의 회귀 추정치로부터 수동으로 예측을 계산하는 방법에 대한 설명조차도 매우 유용합니다.
dcl

그냥 확인 : 사용 시도 predict.fRegress사용 newdata(FDA의 설명서에서 옵션을 여기에 )?

나는 'newdata'가 어떤 클래스 또는 형식인지 정확히 알지 못합니다. 예측하려는 부드러운 곡선 인 fd 또는 fdSmooth 객체는 허용하지 않습니다. 그리고 원시 인수와 공변량 값을 입력 할 수 없습니다.
dcl

1
fda패키지를 가지고 놀았을 때 약 1 년 전에 비슷한 문제가 있었음을 기억 합니다. 나는 수동으로 예측을 얻는 것과 관련된 응답을 작성하고 있었지만 저장하지 않으면 큰 청크가 손실되었습니다. 다른 사람이 나를 이기지 못하면 며칠 안에 해결책이 있어야합니다.

답변:


14

나는 목록과 같은 목록과 목록 내 객체 구조와 같은 Inceptionfda 사용을 신경 쓰지 않지만 패키지 작성자가 만든 시스템에 따라 응답이 달라집니다.

먼저 우리가하는 일을 먼저 생각하는 것이 유익하다고 생각합니다. 지금까지 한 일에 대한 귀하의 설명을 바탕으로, 이것이 당신이하고 있다고 생각하는 것입니다 (내가 무언가를 잘못 해석했는지 알려주세요). 계속해서 표기법을 사용하고 실제 데이터가 부족하기 때문에 Ramsay 및 Silverman의 기능적 데이터 분석 및 Ramsay, Hooker 및 Graves의 기능적 데이터 분석 ( R 및 MATLAB)의 예 (다음 방정식 및 코드 중 일부는 직접 해제 됨) 이 책에서).

함수 선형 모델을 통해 스칼라 응답을 모델링합니다. 즉

yi=β0+0TXi(s)β(s)ds+ϵi

우리는 를 어느 정도 확장합니다 . 우리는 기본 함수를 사용합니다. 그래서,βK

β(s)=k=1Kbkθk(s)

행렬 표기법에서 이것은 입니다.β(s)=θ(s)b

또한 공변량 함수를 어느 정도 확장합니다 (예 : 기본 함수). 그래서,L

Xi(s)=k=1Lcikψk(s)

다시, 행렬 표기법에서 이것은 입니다.X(s)=Cψ(s)

따라서 하면 모델을 다음과 같이 표현할 수 있습니다.J=ψ(s)θ(s)ds

y=β0+CJb 입니다.

우리가 할 수 있다면 와 우리의 모델입니다Z=[1CJ]ξ=[β0b]

y=Zξ

그리고 이것은 우리에게 훨씬 더 친숙해 보입니다.

이제 일종의 정규화를 추가하고 있습니다. fda패키지 형태의 거칠기 처벌와 함께 작동

P=λ[Lβ(s)]2ds

일부 선형 미분 연산자 입니다. 이제 페널티 매트릭스 과 같이 정의하면 다음과 같이 표시 될 수 있습니다 (자세한 내용은 여기에 나와 있습니다.LR

R=λ(0000R1000RK)

여기서 는 의 기본 확장 측면 에서 벌칙 제곱합을 최소화합니다.Riβi

(yZξ)(yZξ)+λξRξ ,

따라서 우리의 문제는 해결책을 가진 능선 회귀입니다.

ξ^=(ZZ+λR)1Zy .

위의 내용을 살펴 보았습니다. (1) 우리가하는 일을 이해하는 것이 중요하다고 생각합니다. (2) 나중에 사용할 코드 중 일부를 이해하려면 위의 일부가 필요합니다. 코드로 ...

다음은 R 코드가 포함 된 데이터 예입니다. fda패키지에 제공된 캐나다 날씨 데이터 세트를 사용하고 있습니다. 우리는 기능적인 선형 모델을 통해 여러 기상 관측소에 대한 연간 강수량을 모델링하고 각 관측소의 온도 프로필 (온도는 365 일 동안 하루에 한 번 기록됨)을 기능적 공변량으로 사용합니다. 우리는 귀하가 처한 상황과 유사한 방식으로 진행할 것입니다. 데이터는 35 개의 스테이션에서 기록되었습니다. 데이터 세트를 34 개의 스테이션으로 나누고,이 스테이션은 내 데이터로 사용되며 마지막 스테이션은 "새"데이터 셋이됩니다.

나는 R 코드와 주석을 통해 계속한다 (나는 당신이 fda패키지에 충분히 익숙하다고 가정 하여 다음의 어떤 ​​것도 너무 놀랍지 않다-이것이 사실이 아니라면 알려주십시오) :

# pick out data and 'new data'
dailydat <- daily$precav[,2:35]
dailytemp <- daily$tempav[,2:35]
dailydatNew <- daily$precav[,1]
dailytempNew <- daily$tempav[,1]

# set up response variable
annualprec <- log10(apply(dailydat,2,sum))

# create basis objects for and smooth covariate functions
tempbasis <- create.fourier.basis(c(0,365),65)
tempSmooth <- smooth.basis(day.5,dailytemp,tempbasis)
tempfd <- tempSmooth$fd

# create design matrix object
templist <- vector("list",2)
templist[[1]] <- rep(1,34)
templist[[2]] <- tempfd

# create constant basis (for intercept) and
# fourier basis objects for remaining betas
conbasis <- create.constant.basis(c(0,365))
betabasis <- create.fourier.basis(c(0,365),35)
betalist <- vector("list",2)
betalist[[1]] <- conbasis
betalist[[2]] <- betabasis

# set roughness penalty for betas 
Lcoef <- c(0,(2*pi/365)^2,0)
harmaccelLfd <- vec2Lfd(Lcoef, c(0,365))
lambda <- 10^12.5
betafdPar <- fdPar(betabasis, harmaccelLfd, lambda)
betalist[[2]] <- betafdPar

# regress
annPrecTemp <- fRegress(annualprec, templist, betalist)

1 년 전에 기능 데이터에 대해 처음 알게되었을 때이 패키지를 가지고 놀았습니다. 나는 또한 predict.fRegress내가 원하는 것을 줄 수 없었 습니다. 지금 다시 살펴보면 여전히 어떻게 동작하는지 모르겠습니다. 따라서 예측을 반 수동으로 가져와야합니다. 코드에서 똑바로 뽑은 조각을 사용할 것입니다 fRegress(). 다시, 나는 코드와 주석을 통해 계속한다.

먼저 설정 :

# create basis objects for and smooth covariate functions for new data
tempSmoothNew <- smooth.basis(day.5,dailytempNew,tempbasis)
tempfdNew <- tempSmoothNew$fd

# create design matrix object for new data
templistNew <- vector("list",2)
templistNew[[1]] <- rep(1,1)
templistNew[[2]] <- tempfdNew

# convert the intercept into an fd object
onebasis <- create.constant.basis(c(0,365))
templistNew[[1]] <- fd(matrix(templistNew[[1]],1,1), onebasis)

이제 예측을 얻으려면

y^new=Znewξ^

fRegress계산 yhatfdobj하고 약간 편집 하는 데 사용 하는 코드를 사용합니다 . 사다리꼴 규칙을 통해 적분 를 추정하여 fRegress계산 yhatfdobj합니다 ( 및 는 각각 밑으로 확장 됨). 0TXi(s)β(s)Xiβ

일반적으로에 fRegress저장된 공변량을 반복하여 적합치를 계산합니다 annPrecTemp$xfdlist. 따라서 문제에 대해이 공변량 목록을 새 공변량 목록의 해당 목록으로 대체합니다 (예 :) templistNew. 다음은 코드입니다 ( fRegress두 번의 편집, 불필요한 코드의 일부 삭제 및 몇 개의 주석이 추가 된 코드와 동일 함).

# set up yhat matrix (in our case it's 1x1)
yhatmat <- matrix(0,1,1)

# loop through covariates
p <- length(templistNew)
for(j in 1:p){
    xfdj       <- templistNew[[j]]
    xbasis     <- xfdj$basis
    xnbasis    <- xbasis$nbasis
    xrng       <- xbasis$rangeval
    nfine      <- max(501,10*xnbasis+1)
    tfine      <- seq(xrng[1], xrng[2], len=nfine)
    deltat     <- tfine[2]-tfine[1]
    xmat       <- eval.fd(tfine, xfdj)
    betafdParj <- annPrecTemp$betaestlist[[j]]
    betafdj    <- betafdParj$fd
    betamat    <- eval.fd(tfine, betafdj)
    # estimate int(x*beta) via trapezoid rule
    fitj       <- deltat*(crossprod(xmat,betamat) - 
                      0.5*(outer(xmat[1,],betamat[1,]) +
              outer(xmat[nfine,],betamat[nfine,])))
    yhatmat    <- yhatmat + fitj
}

(참고 :에서이 청크 및 주변 코드를 보면 fRegress위에서 설명한 단계가 표시됩니다.)

35 개 방송국을 모두 데이터로 사용하여 날씨 예제를 다시 실행하여 코드를 테스트하고 위 루프의 출력을 비교하여 annPrecTemp$yhatfdobj모든 것이 일치 하는지 확인 했습니다. 또한 "새"데이터로 다른 스테이션을 사용하여 두 번 실행했으며 모든 것이 합리적으로 보입니다.

위의 내용이 확실하지 않거나 올바르게 작동하지 않는 경우 알려주십시오. 지나치게 자세한 답변에 대해 죄송합니다. 나는 나 자신을 도울 수 없었다 :) 만약 당신이 그것들을 아직 가지고 있지 않다면,이 응답을 쓰는 데 사용한 두 권의 책을 확인하십시오. 그들은 정말 좋은 책입니다.


이것은 내가 필요한 것 같습니다. 감사합니다. 나는 nfine / tine / deltat 물건을 가지고 놀 필요가 없다고 생각합니까? 통합이 충분히 정확하게 수행되고 있다고 가정해야합니까?
dcl

또한 '새로운'공변량 또는 '구'의 공변량에 직접적으로 불이익을주지 않은 것으로 나타났습니다. 그것은 벌칙 베타 (그리고 내가 생각하는 기본 기능의 수)로 완료되었습니다. 페널티 람다는 베타에 적용됩니다. 회귀 전에 스무딩을 페널티하여 동일한 효과를 얻습니까? (같은 람다 값으로)
dcl

1
적분을 근사화하는 데 사용되는 그리드는 매우 미세하므로 근사값은 매우 양호해야합니다. 당신은 항상 nfine중요한 변화가 얼마나 많이 증가 하고 볼 수 있었지만 나는 그렇게 많이하지 않을 것이라고 생각합니다. 처벌에 관한 한, 우리는 이 경우 에 대신 직접 처벌하고 있습니다. Ramsay와 Silverman 은 페널티를 직접 적용하는 기본 함수없이 를 추정하는 다른 페널티 방법에 대해 설명 합니다. 두 가지 방법 모두 함수 에 매끄러움 제약을 유발 하지만 '동일한 효과'를 얻을지 확실하지 않습니다. ξββ^ββ

여러 곡선에 대한 예측을 생성하기 위해 코드를 조작하려고 시도했지만 올바르게 수행했는지 확실하지 않습니다. 우선, 루프의 첫 번째 반복 후에 yhatmat가 모든 곡선에 대해 일정하지는 않습니다. 이것은 과 동일 합니까? β0
dcl

1
@dcl 루프에서 인 경우 을 에 추가합니다 (Xlist의 첫 번째 목록이 절편 항에 해당한다고 가정). 질문에 사용중인 코드를 추가하여 볼 수 있습니까? j=1β0^y^
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.