R'de fda paketi kullanarak yeni eğrilerden gelen yanıtı tahmin etme


10

Temelde yapmak istediğim tek şey bazı eğrileri kullanarak skaler yanıtı tahmin etmek. Bir regresyon (fda paketinden fRegress kullanarak) yapmak kadar var ama sonuçları (tahmin için) YENİ bir eğriler kümesine nasıl uygulanacağına dair hiçbir fikrim yok.

N = 536 eğrisi ve 536 skaler yanıtı var. Şimdiye kadar yaptığım şey:

  • Eğriler için bir temel oluşturdum.
  • Ceza vermek için fdPar nesnesi oluşturdum
  • Fd nesnesini smooth.basis kullanarak eğrileri belirtilen temelde seçilen ceza ile düzeltmek için oluşturdum.
  • Ben skaler yanıt eğrileri gerileme, fRegress () kullanarak bir regresyon koştum.

Şimdi yapmak istediğim tek şey, sahip olduğum yeni veri grubu için tahminler üretmek için bu gerilemeyi kullanmak. Bunu yapmanın kolay bir yolunu bulamıyorum.

Şerefe


Tahminlerin temelden, düzeltilmiş (fd) nesnelerden ve fRegress () 'den gelen regresyon tahminlerinden manuel olarak nasıl hesaplanacağına dair bir açıklama bile çok yardımcı olacaktır.
dcl

Sadece kontrol: Kullandığınız denedi predict.fRegresskullanarak newdata(FDA manuel seçeneği burada )?

Ben sadece 'newdata' sınıfının veya biçiminin ne olduğundan emin değilim. Tahmin etmek istediğim yumuşatılmış eğriler olan bir fd veya fdSmooth nesnesini kabul etmez. Ve ham argümanları ve değişken değerleri girmeme izin vermiyor.
dcl

1
Bir yıl önce fdapaketle oynadığımda benzer bir sorun yaşadığımı hatırlıyorum . Tahminleri elle almayı içeren bir yanıt yazıyordum, ancak büyük bir kısmı kaydetmemesi nedeniyle kayboldu. Birisi beni yenmezse, birkaç gün içinde sizin için bir çözüm bulmalıyım.

Yanıtlar:


14

Inception benzeri liste-liste-içinde-liste nesne yapıları fdakullanı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+0TXi(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. fdaPaket 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=λ(0000R1000RK)

burada temel genişlemesi açısından , cezalandırılmış karelerin toplamını en aza :Riβi

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

ve bu yüzden sorunumuz sadece çözümlü bir sırt regresyonudur:

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

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. fdaPakette 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 ( fdaaş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.fRegressbana 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 fRegresshesaplamak yhatfdobjve düzenlemek için kullanılan kodu alır . yamuk kuralı üzerinden integrali tahmin edilerek fRegresshesaplanır ( ve kendi tabanlarında genişletilir). yhatfdobj0TXi(s)β(s)Xiβ

Normalde, fRegresstakı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 ( fRegressiki 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, fRegressyukarı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$yhatfdobjve 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.


Bu tam olarak ihtiyacım olan şey gibi görünüyor. Teşekkür ederim. Ben nfine / tine / deltat şeyler ile uğraşmak zorunda olmayacağını varsayalım değil mi? Entegrasyonun yeterince doğru olduğunu varsaymalı mıyım?
dcl

Ayrıca, 'yeni' eş değişkenleri veya 'eski' eş değişkenleri doğrudan cezalandırmadığınızı fark ettim. Her şey cezalandırıcı beta (ve sanırım temel işlevlerin sayısı) ile yapılır. Lambda penaltı cezası uygulanır. Aynı etkiyi regresyon öncesi düzeltmeleri cezalandırarak mı elde ediyorsunuz? (aynı lambda değeriyle)
dcl

1
İntegrale yaklaştırmak için kullanılan ızgara oldukça incedir, bu yüzden yaklaşım oldukça iyi olmalıdır. Her zaman artabilir nfineve integralin ne kadar değiştiğini görebilirsiniz, ancak sanırım çok fazla işe yaramayacak. Cezaya gelince, evet bu durumda yerine doğrudan 'yi cezalandırıyoruz . Ramsay ve Silverman , cezayı doğrudan uyguladığımız temel işlevler olmadan tahmin eden başka bir ceza yöntemini tartışırlar . Her iki yol da işlevleri üzerinde bir düzgünlük kısıtlaması yaratıyor, ancak 'aynı etkiyi' elde edip etmeyeceğinizden emin değilim. ξββ^ββ

Birden fazla eğri için tahminler üretmek için kodu manipüle etmeyi denedim, ancak doğru yaptığımdan emin değilim. Yeni başlayanlar için, yhatmat, döngünün ilk yinelemesinden sonra tüm eğriler için sabit değildir ... Bu ile eşdeğer ? β0
dcl

1
döngü içinde @dcl zaman , bu ilave edilir için (sabit terimi için XLIST tekabül ilk listeyi varsayılarak). Bakabilmem için kullandığınız kod snippet'ini sorunuza ekleyebilir misiniz? j=1β0^y^
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.