การทำนายการตอบสนองจากเส้นโค้งใหม่โดยใช้แพ็คเกจ fda ใน R


10

โดยพื้นฐานทั้งหมดที่ฉันต้องการทำคือทำนายการตอบสนองเซนต์คิตส์และเนวิสโดยใช้เส้นโค้งบางอย่าง ฉันใช้วิธีถดถอยแล้ว (ใช้ fRegress จากแพ็คเกจ fda) แต่ก็ไม่รู้ว่าจะใช้ผลลัพธ์กับเส้นโค้งชุดใหม่ได้อย่างไร (สำหรับการทำนาย)

ฉันมีเส้นโค้ง N = 536 และการตอบกลับเซนต์คิตส์และเนวิส 536 นี่คือสิ่งที่ฉันทำไปแล้ว:

  • ฉันได้สร้างพื้นฐานสำหรับเส้นโค้ง
  • ฉันสร้างวัตถุ fdPar เพื่อแนะนำการลงโทษ
  • ฉันได้สร้างวัตถุ fd โดยใช้ smooth.basis เพื่อทำให้เส้นโค้งเรียบโดยมีการลงโทษที่เลือกตามเกณฑ์ที่ระบุ
  • ฉันใช้การถดถอยด้วย fRegress () เพื่อลดความโค้งในการตอบสนองสเกลาร์

ตอนนี้สิ่งที่ฉันอยากทำคือใช้การถดถอยนั้นเพื่อคาดการณ์ชุดข้อมูลใหม่ที่ฉันมี ฉันไม่สามารถหาวิธีที่ง่ายในการทำเช่นนี้

ไชโย


แม้แต่คำอธิบายวิธีการคำนวณการคาดการณ์ด้วยตนเองจากพื้นฐานวัตถุที่ทำให้เรียบ (fd) และการประมาณค่าการถดถอยจาก fRegress () จะมีประโยชน์มาก
dcl

เพียงแค่การตรวจสอบ: คุณพยายามใช้predict.fRegressโดยใช้newdataตัวเลือก (จากคู่มือการองค์การอาหารและยาที่นี่ )?

ฉันมีแค่ว่าฉันไม่แน่ใจว่าคลาสหรือฟอร์แมทใดที่ 'newdata' ต้องเป็น มันจะไม่ยอมรับวัตถุ fd หรือวัตถุ fdSmooth ซึ่งเป็นเส้นโค้งเรียบที่ฉันต้องการคาดการณ์จาก และมันจะไม่ให้ฉันป้อนข้อโต้แย้งแบบดิบและค่า covariate
dcl

1
ฉันจำได้ว่ามีปัญหาที่คล้ายกันเกี่ยวกับปีที่แล้วเมื่อฉันเล่นกับfdaแพคเกจ ฉันกำลังเขียนคำตอบที่เกี่ยวข้องกับการทำนายด้วยตนเอง แต่ก้อนใหญ่ของมันหายไปเนื่องจากไม่ได้บันทึก หากคนอื่นไม่ชนะฉันฉันควรจะมีทางออกให้คุณในสองสามวัน

คำตอบ:


14

ฉันไม่สนใจสำหรับfdaการใช้งานของการจัดตั้งกองทุนเหมือนรายการภายในรายการภายในรายการโครงสร้างวัตถุ แต่การตอบสนองของฉันจะปฏิบัติตามระบบแพคเกจนักเขียนได้สร้าง

ฉันคิดว่ามันเป็นคำแนะนำให้คิดก่อนเกี่ยวกับสิ่งที่เรากำลังทำอยู่ ตามคำอธิบายของคุณเกี่ยวกับสิ่งที่คุณได้ทำไปแล้วนี่คือสิ่งที่ฉันเชื่อว่าคุณกำลังทำอยู่ (แจ้งให้เราทราบหากฉันตีความบางสิ่งผิดไป) ฉันจะใช้สัญกรณ์ต่อไปและเนื่องจากขาดข้อมูลจริงตัวอย่างจาก Ramsay และ Silverman การวิเคราะห์ข้อมูลเชิงหน้าที่และ Ramsay, Hooker และ Graves's Data Data Analysis ด้วย R และ MATLAB (สมการและรหัสต่อไปนี้บางส่วนถูกยกขึ้นโดยตรง จากหนังสือเหล่านี้)

เรากำลังสร้างแบบจำลองการตอบสนองเซนต์คิตส์และเนวิสผ่านแบบจำลองเชิงเส้นหน้าที่เช่น

yi=β0+0TXi(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=λ(0000R1000RK)

ที่อยู่ในแง่ของการขยายพื้นฐานของจากนั้นเราลดจำนวนผลรวมของการลงโทษ:Riβi

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

และดังนั้นปัญหาของเราเป็นเพียงแค่การถดถอยสันเขากับการแก้ปัญหา:

ξ^=(ZZ+λR)1Zy{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โดยประมาณอินทิกรัลผ่านทางกฎสี่เหลี่ยมคางหมู (โดยและขยายในฐานที่เกี่ยวข้อง) 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และดูว่าการเปลี่ยนแปลงหนึ่งครั้งมีค่าเท่าใด แต่ฉันเดาว่ามันจะไม่ทำอะไรมาก เท่าที่มีการลงโทษเรากำลังลงโทษโดยตรงแทนที่จะเป็นในกรณีนี้ Ramsay และ Silverman หารือเกี่ยวกับวิธีการลงโทษอื่นที่ประมาณการโดยไม่ต้องฟังก์ชั่นพื้นฐานที่เราใช้โทษโดยตรงกับ\ทั้งสองวิธีนี้ทำให้เกิดข้อ จำกัด ด้านความนุ่มนวลในฟังก์ชั่นแต่ฉันไม่แน่ใจว่าคุณจะได้รับ 'เอฟเฟกต์เดียวกัน' หรือไม่ ξββ^ββ

ฉันพยายามจัดการรหัสเพื่อสร้างการทำนายสำหรับหลาย ๆ เส้นโค้ง แต่ฉันไม่แน่ใจว่าฉันทำถูกต้องแล้ว สำหรับ starters yhatmat ไม่คงที่สำหรับทุกโค้งหลังจากการวนซ้ำครั้งแรกของลูป ... นี่หมายความว่าเทียบเท่ากับหรือไม่? β0
dcl

1
@dcl ในลูปเมื่อมันกำลังเพิ่มไปที่ (สมมติว่ารายการแรกใน Xlist ของคุณสอดคล้องกับคำว่าดัก) คุณสามารถเพิ่มเกร็ดเล็กเกร็ดน้อยของรหัสที่คุณใช้กับคำถามของคุณเพื่อให้ฉันดูได้หรือไม่ j=1β0^y^
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.