आर में एफडीए पैकेज का उपयोग करके नए घटता से प्रतिक्रिया की भविष्यवाणी करना


10

मूल रूप से सभी जो मैं करना चाहता हूं, वह कुछ घटता का उपयोग करके एक स्केलर प्रतिक्रिया की भविष्यवाणी करता है। मैं एक प्रतिगमन (एफडीए पैकेज से fRegress का उपयोग कर) के रूप में दूर है, लेकिन पता नहीं कैसे घटता के एक नए सेट के लिए आवेदन करने के लिए है (भविष्यवाणी के लिए)।

मेरे पास एन = 536 वक्र हैं, और 536 स्केलर प्रतिक्रियाएं हैं। यहाँ मैंने अभी तक क्या किया है:

  • मैंने कर्व्स के लिए एक आधार बनाया है।
  • मैंने जुर्माना लगाने के लिए एक fdPar ऑब्जेक्ट बनाया है
  • मैंने निर्दिष्ट आधार पर चुने गए दंड के साथ घटता को सुचारू करने के लिए smooth.basis का उपयोग करके fd ऑब्जेक्ट बनाया है।
  • मैंने fRegress () का उपयोग करके एक प्रतिगमन भाग लिया है, जो स्केलर प्रतिक्रिया पर घटता है।

अब, मैं केवल इतना करना चाहूंगा कि डेटा के एक नए सेट के लिए भविष्यवाणियों का उत्पादन करने के लिए उस प्रतिगमन का उपयोग करें। मुझे ऐसा करने का आसान तरीका नहीं मिल रहा है।

चियर्स


यहां तक ​​कि आधार से मैन्युअल रूप से भविष्यवाणियों की गणना करने का एक विवरण, स्मूथ (fd) ऑब्जेक्ट और fRegress () से रिग्रेशन अनुमान बहुत उपयोगी होगा।
DCL

बस जाँच: क्या आपने विकल्प का predict.fRegressउपयोग करने की कोशिश की newdataहै ( यहाँ fda मैनुअल से )?

मेरे पास है, यह सिर्फ इतना है कि मुझे बिल्कुल यकीन नहीं है कि 'न्यूडाटा' को किस वर्ग या प्रारूप में लाना है। यह एक fd या एक fdSmooth ऑब्जेक्ट को स्वीकार नहीं करेगा जो कि स्मूद कर्व्स हैं जिनसे मैं भविष्यवाणी करना चाहता हूं। और यह मुझे कच्चे तर्क और कोवरिएट मान इनपुट नहीं करने देगा।
dcl

1
मुझे याद है कि लगभग एक साल पहले मुझे इस तरह की समस्या हुई थी जब मैंने fdaपैकेज के साथ खेला था । मैं एक प्रतिक्रिया लिख ​​रहा था जिसमें भविष्यवाणियों को मैन्युअल रूप से प्राप्त करना शामिल था, लेकिन इसे नहीं बचाने के कारण इसका एक बड़ा हिस्सा खो गया था। अगर कोई और मुझे इसके लिए नहीं हराता है, तो मुझे आपके लिए एक दो दिनों में समाधान करना चाहिए।

जवाबों:


14

मैं परवाह नहीं करते fdaकी है उपयोग इंसेप्शन की तरह सूची के भीतर सूची के भीतर सूची वस्तु संरचनाओं, लेकिन मेरी प्रतिक्रिया प्रणाली पैकेज लेखकों बनाया है का पालन करेंगे।

मुझे लगता है कि पहले यह सोचने का निर्देश है कि हम वास्तव में क्या कर रहे हैं। आपके द्वारा अब तक किए गए आपके विवरण के आधार पर, यह वही है जो मैं मानता हूं कि आप कर रहे हैं (मुझे बताएं कि क्या मैंने कुछ गलत व्याख्या की है)। मैं वास्तविक डेटा की कमी के कारण नोटेशन का उपयोग करना जारी रखूंगा और रामसे और सिल्वरमैन के कार्यात्मक डेटा विश्लेषण और रामसे, हूकर, और ग्रेव्स के कार्यात्मक डेटा विश्लेषण के साथ आर और MATLAB (निम्नलिखित में से कुछ उद्धरण और कोड) का एक उदाहरण सीधे उठाया जाता है। इन पुस्तकों से)।

हम एक कार्यात्मक रैखिक मॉडल के माध्यम से स्केलर प्रतिक्रिया को मॉडलिंग कर रहे हैं, अर्थात

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

हम कुछ आधार में विस्तार करते हैं। हम, K आधार कार्यों का उपयोग करते हैं। इसलिए,β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

और अगर हम और , को अपना मॉडलξ = [ β 0Z=[1CJ]ξ=[β0b]

y=Zξ

और यह हमें अधिक परिचित लगता है।

अब मैं देख रहा हूँ कि आप नियमितीकरण के कुछ प्रकार जोड़ रहे हैं। fdaपैकेज फार्म के खुरदरापन दंड के साथ काम करता है

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

कुछ रैखिक अंतर ऑपरेटर । अब इसे दिखाया जा सकता है (विवरण यहाँ छोड़ दिया गया है - यह वास्तव में यह दिखाना मुश्किल नहीं है) कि यदि हम पेनल्टी मैट्रिक्स को परिभाषित करेंआरLR

R=λ(0000R1000RK)

जहां के आधार विस्तार के संदर्भ में है , तो हम वर्गों के दंडित योग को कम करते हैं:β iRiβi

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

और इसलिए हमारी समस्या केवल समाधान के साथ रिज प्रतिगमन है:

ξ^=(ZZ+λR)1Zy

मैं उपरोक्त के माध्यम से चला गया, क्योंकि (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अभिन्न का आकलन द्वारा के माध्यम से समलम्ब नियम (साथ और उनके संबंधित ठिकानों में विस्तार)। एक्स मैं β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और देख सकते हैं कि कितना अभिन्न परिवर्तन है लेकिन मुझे लगता है कि यह बहुत कुछ नहीं करेगा। जहाँ तक दंड का सवाल है, हाँ हम सीधे इस मामले में बजाय दंड दे रहे हैं । रामसे और सिल्वरमैन एक और दंड विधि पर चर्चा है कि अनुमान आधार कार्यों जहां हम करने के लिए सीधे दंड लागू बिना । दोनों तरीके कार्यों पर एक चिकना बाधा उत्पन्न कर रहे हैं , लेकिन मैं अनिश्चित हूं कि क्या आपको 'समान प्रभाव' मिलेगा। बीटा बीटा बीटा बीटाξββ^ββ

मैंने कई वक्रों के लिए भविष्यवाणियों का निर्माण करने के लिए कोड में हेरफेर करने की कोशिश की है, लेकिन मुझे यकीन नहीं है कि मैंने इसे सही तरीके से किया है। शुरुआत के लिए, लाह की पहली पुनरावृत्ति के बाद सभी क्यूरेटर के लिए yhatmat स्थिर नहीं है ... क्या इसका मतलब बराबर होना चाहिए ? β0
DCL

1
@dcl लूप में, जब , तो यह को जोड़ रहा है (आपकी Xlist में पहली सूची को इंटरसेप्ट टर्म से मेल खाती है)। क्या आप अपने प्रश्न का उपयोग कर रहे कोड का स्निपेट जोड़ सकते हैं ताकि मैं इसे देख सकूं? ^ β 0 yj=1β0^y^
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.