Inception benzeri liste-liste-içinde-liste nesne yapıları fda
kullanımı için umurumda değil , ama benim yanıt paket yazarlarının oluşturduğu sistem tarafından uyulacaktır.
Bence tam olarak ne yaptığımızı düşünmek öğretici. Şimdiye kadar ne yaptığınıza ilişkin açıklamanıza dayanarak, yaptığınıza inandığım şey bu (bir şeyi yanlış yorumladıysam bana bildirin). Notasyonu kullanmaya devam edeceğim ve gerçek veri eksikliğinden dolayı Ramsay ve Silverman'ın Fonksiyonel Veri Analizi ile Ramsay, Hooker ve Graves'in R ve MATLAB ile Fonksiyonel Veri Analizi'nden bir örnek (Aşağıdaki denklemlerin ve kodların bazıları doğrudan kaldırılır) bu kitaplardan).
Fonksiyonel bir doğrusal model yoluyla skaler bir yanıt modelliyoruz, yani
yi=β0+∫T0Xi(s)β(s)ds+ϵi
temelde genişletiyoruz . Diyelim ki temel fonksiyonlarını kullanıyoruz. Yani,KβK
β(s)=∑k=1Kbkθk(s)
Matris notasyonunda bu dır .β(s)=θ′(s)b
Aynı zamanda, değişken fonksiyonları da bazı bazda genişletiyoruz (örneğin baz fonksiyonları). Yani,L
Xi(s)=∑k=1Lcikψk(s)
Yine, matris gösteriminde, bu .X(s)=Cψ(s)
Böylece, izin verirsek , modelimiz şu şekilde ifade edilebilir:J=∫ψ(s)θ′(s)ds
y=β0+CJb .
Ve eğer ve , modelimizZ=[1CJ]ξ=[β0b′]′
y=Zξ
Ve bu bize çok daha tanıdık geliyor.
Şimdi bir çeşit düzenlilik eklediğinizi görüyorum. fda
Paket formunun pürüzlülük cezalar ile çalışır
P=λ∫[Lβ(s)]2ds
bazı doğrusal diferansiyel operatör . Şimdi gösterilebilir (ayrıntılar burada bıraktı - bu göstermek için gerçekten zor değil) biz ceza matrisi tanımlarsanız olarakLR
R=λ⎛⎝⎜⎜⎜⎜⎜00⋮00R1⋮0⋯⋯⋱⋯00⋮RK⎞⎠⎟⎟⎟⎟⎟
burada temel genişlemesi açısından , cezalandırılmış karelerin toplamını en aza :Riβi
(y−Zξ)′(y−Zξ)+λξ′Rξ ,
ve bu yüzden sorunumuz sadece çözümlü bir sırt regresyonudur:
ξ^=(Z′Z+λR)−1Z′y .
Yukarıdakilerden geçtim çünkü, (1) ne yaptığımızı anlamanın önemli olduğunu ve (2) daha sonra kullanacağım bazı kodları anlamak için yukarıdakilerin bazıları gerekli. Kod üzerinde ...
İşte R kodlu bir veri örneği. fda
Pakette verilen Kanada hava durumu veri kümesini kullanıyorum . Bir dizi hava istasyonu için günlük yıllık yağış miktarını fonksiyonel bir doğrusal model üzerinden modelleyeceğiz ve her bir istasyondan sıcaklık değişimlerini (sıcaklıklar günde bir kez kaydedildi) fonksiyonel ortak değişkenler olarak kullanacağız. Durumunuzda tarif ettiğiniz şekilde benzer şekilde ilerleyeceğiz. Veriler 35 istasyonda kaydedildi. Veri setini, verilerim olarak kullanılacak 34 istasyona ve "yeni" veri setim olacak son istasyona ayıracağım.
R kodu ve yorumları ile devam ediyorum ( fda
aşağıdaki hiçbir şey çok şaşırtıcı olmayacak şekilde pakete yeterince aşina olduğunuzu varsayıyorum - bu durumda değilse lütfen bana bildirin):
# 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)
Şimdi bir yıl kadar önce işlevsel veriler hakkında ilk öğretildiğimde, bu paketle oynadım. Ayrıca predict.fRegress
bana istediğimi veremedim. Şimdi geriye dönüp baktığımda hala nasıl davranacağını bilmiyorum. Yani, tahminleri yarı manuel olarak almamız gerekecek. Doğrudan koddan çıkardığım parçaları kullanacağım fRegress()
. Yine kod ve yorumlarla devam ediyorum.
İlk olarak, kurulum:
# 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)
Şimdi tahminleri almak için
y^new=Znewξ^
Ben sadece biraz fRegress
hesaplamak yhatfdobj
ve düzenlemek için kullanılan kodu alır . yamuk kuralı üzerinden integrali tahmin edilerek fRegress
hesaplanır ( ve kendi tabanlarında genişletilir). yhatfdobj
∫T0Xi(s)β(s)Xiβ
Normalde, fRegress
takılan değerleri depolanan ortak değişkenler arasında döngü yaparak hesaplar annPrecTemp$xfdlist
. Bu yüzden, sorunumuz için, bu değişken listesini yeni değişken listemizdeki karşılık gelen listeyle değiştiriyoruz, yani templistNew
. Kod ( fRegress
iki düzenlemeyle bulunan kodla aynı , gereksiz kodun bazı silinmeleri ve birkaç yorum eklendi):
# 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
}
(not: bu parçaya ve çevresindeki koda bakarsanız, fRegress
yukarıda özetlediğim adımları görürsünüz).
Veriyi 35 istasyonun hepsini kullanarak hava örneğini yeniden çalıştırarak kodu test ettim ve yukarıdaki döngüden çıktıyı karşılaştırdım annPrecTemp$yhatfdobj
ve her şey eşleşti. Ayrıca "yeni" verilerim olarak farklı istasyonları kullanarak birkaç kez koştu ve her şey makul görünüyor.
Yukarıdakilerden herhangi birinin net olup olmadığını veya herhangi bir şeyin düzgün çalışmadığını bildirin. Aşırı ayrıntılı yanıt için özür dilerim. Kendime yardım edemedim :) Ve eğer onlara sahip değilseniz, bu yanıtı yazmak için kullandığım iki kitaba göz atın. Gerçekten iyi kitaplar.