ฉันไม่สนใจสำหรับfda
การใช้งานของการจัดตั้งกองทุนเหมือนรายการภายในรายการภายในรายการโครงสร้างวัตถุ แต่การตอบสนองของฉันจะปฏิบัติตามระบบแพคเกจนักเขียนได้สร้าง
ฉันคิดว่ามันเป็นคำแนะนำให้คิดก่อนเกี่ยวกับสิ่งที่เรากำลังทำอยู่ ตามคำอธิบายของคุณเกี่ยวกับสิ่งที่คุณได้ทำไปแล้วนี่คือสิ่งที่ฉันเชื่อว่าคุณกำลังทำอยู่ (แจ้งให้เราทราบหากฉันตีความบางสิ่งผิดไป) ฉันจะใช้สัญกรณ์ต่อไปและเนื่องจากขาดข้อมูลจริงตัวอย่างจาก Ramsay และ Silverman การวิเคราะห์ข้อมูลเชิงหน้าที่และ Ramsay, Hooker และ Graves's Data Data Analysis ด้วย R และ MATLAB (สมการและรหัสต่อไปนี้บางส่วนถูกยกขึ้นโดยตรง จากหนังสือเหล่านี้)
เรากำลังสร้างแบบจำลองการตอบสนองเซนต์คิตส์และเนวิสผ่านแบบจำลองเชิงเส้นหน้าที่เช่น
yi=β0+∫T0Xi(s)β(s)ds+ϵi
เราขยายในบางกรณี เราใช้พูดฟังก์ชั่นพื้นฐานดังนั้น,βK
β(s)=∑k=1Kbkθk(s)
ในสัญกรณ์เมทริกซ์นี้เป็น{ข}β(s)=θ′(s)b
นอกจากนี้เรายังขยายฟังก์ชัน covariate ในบางพื้นฐานเช่นกัน (พูดถึงฟังก์ชันพื้นฐาน ) ดังนั้น,L
Xi(s)=∑k=1Lcikψk(s)
อีกครั้งในสัญกรณ์เมทริกซ์นี้เป็น(s)X(s)=Cψ(s)
ดังนั้นถ้าเราปล่อยโมเดลของเราจะแสดงเป็นJ=∫ψ(s)θ′(s)ds
y=β0+CJb{}
และถ้าเราปล่อยและแบบจำลองของเราคือZ=[1CJ]ξ=[β0b′]′
y=Zξ
และนี่ดูเหมือนเราคุ้นเคยมากขึ้น
ตอนนี้ฉันเห็นว่าคุณกำลังเพิ่มการทำให้เป็นมาตรฐาน fda
แพคเกจทำงานร่วมกับการลงโทษความหยาบกร้านของแบบฟอร์ม
P=λ∫[Lβ(s)]2ds
สำหรับบางเส้นแตกต่างประกอบLตอนนี้มันสามารถแสดงให้เห็นได้ (รายละเอียดที่เหลืออยู่ที่นี่ - มันไม่ยากที่จะแสดงให้เห็น) ว่าถ้าเรากำหนด matrix matrixเป็นLR
R=λ⎛⎝⎜⎜⎜⎜⎜00⋮00R1⋮0⋯⋯⋱⋯00⋮RK⎞⎠⎟⎟⎟⎟⎟
ที่อยู่ในแง่ของการขยายพื้นฐานของจากนั้นเราลดจำนวนผลรวมของการลงโทษ:Riβi
(y−Zξ)′(y−Zξ)+λξ′Rξ ,
และดังนั้นปัญหาของเราเป็นเพียงแค่การถดถอยสันเขากับการแก้ปัญหา:
ξ^=(Z′Z+λR)−1Z′y{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)
ตอนนี้เมื่อฉันได้รับการสอนเกี่ยวกับข้อมูลการทำงานเป็นครั้งแรกเมื่อประมาณหนึ่งปีที่ผ่านมาฉันเล่นกับแพ็คเกจนี้ ฉันไม่สามารถ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
และทุกอย่างที่ตรงกัน ฉันวิ่งไปสองสามครั้งโดยใช้สถานีต่าง ๆ เพราะข้อมูล "ใหม่" ของฉันและทุกอย่างดูสมเหตุสมผล
แจ้งให้เราทราบหากข้อใดข้อหนึ่งข้างต้นไม่ชัดเจนหรือหากสิ่งใดไม่ทำงานอย่างถูกต้อง ขออภัยสำหรับการตอบกลับที่มีรายละเอียดมากเกินไป ฉันไม่สามารถช่วยตัวเองได้ :) และถ้าคุณยังไม่ได้เป็นเจ้าของพวกเขาลองอ่านหนังสือสองเล่มที่ฉันเคยเขียนคำตอบนี้ พวกเขาเป็นหนังสือที่ดีจริงๆ