मैं परवाह नहीं करते fda
की है उपयोग इंसेप्शन की तरह सूची के भीतर सूची के भीतर सूची वस्तु संरचनाओं, लेकिन मेरी प्रतिक्रिया प्रणाली पैकेज लेखकों बनाया है का पालन करेंगे।
मुझे लगता है कि पहले यह सोचने का निर्देश है कि हम वास्तव में क्या कर रहे हैं। आपके द्वारा अब तक किए गए आपके विवरण के आधार पर, यह वही है जो मैं मानता हूं कि आप कर रहे हैं (मुझे बताएं कि क्या मैंने कुछ गलत व्याख्या की है)। मैं वास्तविक डेटा की कमी के कारण नोटेशन का उपयोग करना जारी रखूंगा और रामसे और सिल्वरमैन के कार्यात्मक डेटा विश्लेषण और रामसे, हूकर, और ग्रेव्स के कार्यात्मक डेटा विश्लेषण के साथ आर और MATLAB (निम्नलिखित में से कुछ उद्धरण और कोड) का एक उदाहरण सीधे उठाया जाता है। इन पुस्तकों से)।
हम एक कार्यात्मक रैखिक मॉडल के माध्यम से स्केलर प्रतिक्रिया को मॉडलिंग कर रहे हैं, अर्थात
yमैं= β0+ ∫टी0एक्समैं( s ) β( एस ) डीs + ϵमैं
हम कुछ आधार में विस्तार करते हैं। हम, K आधार कार्यों का उपयोग करते हैं। इसलिए,βक
β( s ) = ∑के = १कखकθक( s )
मैट्रिक्स नोटेशन में, यह ।β( s ) = θ'( s ) बी
हम कुछ आधार में कोवरिएट कार्यों का विस्तार भी करते हैं, साथ ही ( आधार कार्य कहते हैं )। इसलिए,एल
एक्समैं( s ) = ∑के = १एलसीमैं केψक( s )
फिर से, मैट्रिक्स नोटेशन में, यह ।एक्स( s ) = C ψ ( s )
और इस प्रकार, अगर हम , तो हमारा मॉडल इस प्रकार व्यक्त किया जा सकता हैजे =∫ψ ( रों ) θ'( एस ) डीरों
y= β0+ सी जे बी ।
और अगर हम और , को अपना मॉडलξ = [ β 0जेड = [ १सी जे ]ξ = [ β0ख']'
y = Z ξ
और यह हमें अधिक परिचित लगता है।
अब मैं देख रहा हूँ कि आप नियमितीकरण के कुछ प्रकार जोड़ रहे हैं। fda
पैकेज फार्म के खुरदरापन दंड के साथ काम करता है
पी= λ ∫[ एल β( s ) ]2घरों
कुछ रैखिक अंतर ऑपरेटर । अब इसे दिखाया जा सकता है (विवरण यहाँ छोड़ दिया गया है - यह वास्तव में यह दिखाना मुश्किल नहीं है) कि यदि हम पेनल्टी मैट्रिक्स को परिभाषित करेंआरएलR
R=λ⎛⎝⎜⎜⎜⎜⎜00⋮00R1⋮0⋯⋯⋱⋯00⋮RK⎞⎠⎟⎟⎟⎟⎟
जहां के आधार विस्तार के संदर्भ में है , तो हम वर्गों के दंडित योग को कम करते हैं:β iRiβi
(y−Zξ)′(y−Zξ)+λξ′Rξ ,
और इसलिए हमारी समस्या केवल समाधान के साथ रिज प्रतिगमन है:
ξ^=(Z′Z+λR)−1Z′y ।
मैं उपरोक्त के माध्यम से चला गया, क्योंकि (1) मुझे लगता है कि यह महत्वपूर्ण है कि हम समझते हैं कि हम क्या कर रहे हैं, और (2) उपरोक्त में से कुछ को समझने के लिए आवश्यक है जो मैं बाद में उपयोग करूंगा। कोड पर ...
यहां आर कोड के साथ एक डेटा उदाहरण है। मैं fda
पैकेज में उपलब्ध कराए गए कनाडा के मौसम डेटासेट का उपयोग कर रहा हूं । हम एक कार्यात्मक लीनियर मॉडल के माध्यम से कई मौसम स्टेशनों के लिए लॉग वार्षिक वर्षा का मॉडल तैयार करेंगे और प्रत्येक कोवेटिव के रूप में प्रत्येक स्टेशन से तापमान प्रोफाइल (तापमान 365 दिनों के लिए दिन में एक बार दर्ज किया गया) का उपयोग करेंगे। हम उसी तरह से आगे बढ़ेंगे जिस तरह से आप अपनी स्थिति का वर्णन करते हैं। 35 स्टेशनों पर डेटा दर्ज किया गया था। मैं 34 स्टेशनों में डेटासेट तोड़ूंगा, जिसका उपयोग मेरे डेटा और अंतिम स्टेशन के रूप में किया जाएगा, जो मेरा "नया" डेटासेट होगा।
मैं आर कोड और टिप्पणियों के माध्यम से जारी रखता हूं (मुझे लगता है कि आप 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)
अब जब मुझे पहली बार एक या एक साल पहले कार्यात्मक डेटा के बारे में पढ़ाया गया था, तो मैंने इस पैकेज के साथ खेला। मैं वह भी पाने में असमर्थ था 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
और सब कुछ मेल खाता है। मैंने इसे "नए" डेटा के रूप में अलग-अलग स्टेशनों का उपयोग करते हुए दो बार चलाया।
मुझे पता है कि उपरोक्त में से कोई भी अस्पष्ट है या यदि कुछ भी सही ढंग से काम नहीं कर रहा है। अत्यधिक विस्तृत प्रतिक्रिया के लिए क्षमा करें। मैं अपने आप को मदद नहीं कर सका :) और अगर आप पहले से ही उनके पास नहीं हैं, तो उन दो पुस्तकों को देखें जो मैंने इस प्रतिक्रिया को लिखने के लिए उपयोग किया था। वे वास्तव में अच्छी किताबें हैं।