나는 목록과 같은 목록과 목록 내 객체 구조와 같은 Inceptionfda
사용을 신경 쓰지 않지만 패키지 작성자가 만든 시스템에 따라 응답이 달라집니다.
먼저 우리가하는 일을 먼저 생각하는 것이 유익하다고 생각합니다. 지금까지 한 일에 대한 귀하의 설명을 바탕으로, 이것이 당신이하고 있다고 생각하는 것입니다 (내가 무언가를 잘못 해석했는지 알려주세요). 계속해서 표기법을 사용하고 실제 데이터가 부족하기 때문에 Ramsay 및 Silverman의 기능적 데이터 분석 및 Ramsay, Hooker 및 Graves의 기능적 데이터 분석 ( R 및 MATLAB)의 예 (다음 방정식 및 코드 중 일부는 직접 해제 됨) 이 책에서).
함수 선형 모델을 통해 스칼라 응답을 모델링합니다. 즉
yi=β0+∫T0Xi(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=λ⎛⎝⎜⎜⎜⎜⎜00⋮00R1⋮0⋯⋯⋱⋯00⋮RK⎞⎠⎟⎟⎟⎟⎟
여기서 는 의 기본 확장 측면 에서 벌칙 제곱합을 최소화합니다.Riβi
(y−Zξ)′(y−Zξ)+λξ′Rξ ,
따라서 우리의 문제는 해결책을 가진 능선 회귀입니다.
ξ^=(Z′Z+λR)−1Z′y .
위의 내용을 살펴 보았습니다. (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
합니다 ( 및 는 각각 밑으로 확장 됨). ∫T0Xi(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
모든 것이 일치 하는지 확인 했습니다. 또한 "새"데이터로 다른 스테이션을 사용하여 두 번 실행했으며 모든 것이 합리적으로 보입니다.
위의 내용이 확실하지 않거나 올바르게 작동하지 않는 경우 알려주십시오. 지나치게 자세한 답변에 대해 죄송합니다. 나는 나 자신을 도울 수 없었다 :) 만약 당신이 그것들을 아직 가지고 있지 않다면,이 응답을 쓰는 데 사용한 두 권의 책을 확인하십시오. 그들은 정말 좋은 책입니다.