จะรวมคำศัพท์โต้ตอบใน GAM ได้อย่างไร


24

รหัสต่อไปนี้ประเมินความคล้ายคลึงกันระหว่างอนุกรมเวลาสองชุด:

set.seed(10)
RandData <- rnorm(8760*2)
America <- rep(c('NewYork','Miami'),each=8760)

Date = seq(from=as.POSIXct("1991-01-01 00:00"), 
           to=as.POSIXct("1991-12-31 23:00"), length=8760)

DatNew <- data.frame(Loc = America,
                     Doy = as.numeric(format(Date,format = "%j")),
                     Tod = as.numeric(format(Date,format = "%H")),
                     Temp = RandData,
                     DecTime = rep(seq(1, length(RandData)/2) / (length(RandData)/2),
                                   2))
require(mgcv)
mod1 <- gam(Temp ~ Loc + s(Doy) + s(Doy,by = Loc) +
  s(Tod) + s(Tod,by = Loc),data = DatNew, method = "ML")

ที่นี่gamใช้เพื่อประเมินว่าอุณหภูมิที่นิวยอร์กและไมอามีแตกต่างจากอุณหภูมิเฉลี่ย (ของทั้งสองที่) ในแต่ละช่วงเวลาของวันอย่างไร ปัญหาที่ฉันมีอยู่ในตอนนี้คือฉันต้องรวมคำที่ใช้โต้ตอบซึ่งแสดงให้เห็นว่าอุณหภูมิของแต่ละตำแหน่งแตกต่างกันอย่างไรในแต่ละวันในวันที่แตกต่างกันของปี ในที่สุดฉันก็หวังว่าจะแสดงข้อมูลทั้งหมดนี้ในกราฟเดียว (สำหรับแต่ละตำแหน่ง) ดังนั้นสำหรับไมอามี่ฉันหวังว่าจะมีกราฟหนึ่งกราฟที่แสดงว่าอุณหภูมิแตกต่างจากค่าเฉลี่ยในช่วงเวลาต่าง ๆ ของวันและเวลาที่แตกต่างกันของปี (พล็อต 3 มิติหรือไม่)


2
คุณอาจพบคำตอบสำหรับคำถามนี้stats.stackexchange.com/questions/18937/…มีความเกี่ยวข้อง
jbowman

คำตอบ:


18

"a" ใน "gam" หมายถึง "สารเติมแต่ง" ซึ่งหมายถึงไม่มีการโต้ตอบดังนั้นถ้าคุณพอดีกับการโต้ตอบคุณจะไม่เหมาะกับรูปแบบการเล่นเกมอีกต่อไป

ที่กล่าวว่ามีวิธีการที่จะได้รับการทำงานร่วมกันบางอย่างเช่นเงื่อนไขในแง่สารเติมแต่งในเกมที่คุณกำลังใช้หนึ่งในบรรดาโดยใช้อาร์กิวเมนต์by sคุณสามารถลองขยายสิ่งนี้เพื่อให้อาร์กิวเมนต์byเป็นเมทริกซ์ที่มีฟังก์ชัน (sin, cos) ของ doy หรือ tod คุณยังสามารถใส่เส้นโค้งที่ราบเรียบในโมเดลเชิงเส้นปกติที่อนุญาตให้มีการโต้ตอบ (นี่ไม่ได้ให้ backfitting ที่เกมทำ แต่อาจมีประโยชน์)

คุณอาจดูการถดถอยการติดตามการฉายเป็นเครื่องมือที่เหมาะสมอีกอย่างหนึ่ง โมเดลที่มีสีเหลืองหรือมากกว่านั้น (ซึ่งมีทั้งบาปและ / หรือ cos) ก็อาจมีประโยชน์เช่นกัน

ส่วนหนึ่งของการตัดสินใจว่าจะใช้เครื่องมือใดเป็นคำถามที่คุณพยายามตอบ คุณเพียงแค่พยายามหาแบบจำลองเพื่อทำนายวันที่และเวลาในอนาคตหรือไม่ คุณกำลังพยายามทดสอบเพื่อดูว่าตัวทำนายเฉพาะมีความสำคัญในแบบจำลองหรือไม่? คุณพยายามที่จะเข้าใจรูปร่างของความสัมพันธ์ระหว่างตัวทำนายและผลลัพธ์หรือไม่ อื่น ๆ อีก?


3
x1,x2
Y=1(x1)+2(x2)+3(x1x2)+ε
gam
Y=1(x1)+2(x2)+3(x1)x2+4(x2)x1+ε
by

1
@Macro มันขึ้นอยู่กับว่าคุณต้องการแยกขนหรือไม่ (ในทางเทคนิคสิ่งที่คุณเขียนอาจจะเป็นเพราะคุณไม่ได้ใช้ส่วน g)
Greg Snow

2
@Macro ฉันแน่ใจมากขึ้นได้รับการกล่าวเกี่ยวกับเรื่องนี้ แต่ดูหน้า 4 Gams ของบทความของ Venable นี้Exegeses on Linear รุ่น ยังไม่ชัดเจนว่าจะระบุผลกระทบหลักที่ไม่ใช่สารเติมแต่งและเอฟเฟกต์การโต้ตอบพร้อมกันอย่างไร
Andy W

ขอบคุณมากสำหรับความคิดเห็นของคุณ เป้าหมายหลักของฉันที่นี่คือการไม่ทำนายค่าในอนาคต แต่เพียงเพื่อดูว่าแต่ละครั้งชุดเปลี่ยนแปลงจากค่าเฉลี่ยของทั้งสองชุด ตัวอย่างเช่นผลลัพธ์ของ mod1 แสดงให้เห็นว่าอนุกรมเวลาในแต่ละสถานที่แตกต่างจากค่าเฉลี่ยแรกในช่วงเวลาของวันของปี (Doy) และเวลาของวัน (Tod) จากนี้ฉันต้องการดูว่าแต่ละซีรีย์แตกต่างกันอย่างไรในการทำงานของ Doy และท็อดซึ่งฉันคาดว่าซีรีย์เวลาจะแตกต่างกันอย่างมากในช่วงฤดูร้อน
KatyB

2
@AndyW เป็นสิ่งสำคัญที่จะต้องทราบว่า GAM มาไกลตั้งแต่ Venable แสดงความคิดเห็นกับพวกเขา - การพัฒนาในทศวรรษที่ผ่านมาหรือมากกว่านั้นด้วยเส้นประสาทที่ถูกลงโทษ Sensu Simon Wood (ตามการนำไปใช้ในmgcv ) และการรักษาแบบ Bayesian อย่างเต็มที่ การเลือกความราบรื่นการตอบสนองและวิธีการปรับให้เข้ากับสิ่งต่าง ๆ (ผลิตภัณฑ์เทนเซอร์ของฐานที่ขอบเป็นแนวทางหนึ่ง) ในกรอบแบบจำลองเพิ่มเติม ฉันมีความมั่นใจอย่างมีเหตุผลที่คัดค้าน & ค็อกซ์ของ Venable ต่อเกมตามที่ระบุไว้ในอดีตผู้บริหารระดับสูงต้องได้รับการแก้ไขในระดับสูงจากการพัฒนาล่าสุดเหล่านี้ในทฤษฎี GAM
Reinstate Monica - G. Simpson

25

สำหรับตัวแปรต่อเนื่องสองตัวคุณสามารถทำสิ่งที่คุณต้องการได้ (ไม่ว่าจะเป็นการโต้ตอบหรือไม่ฉันจะปล่อยให้คนอื่นอภิปรายตามความคิดเห็นต่อ @ Greg's Answer) โดยใช้:

mod1 <- gam(Temp ~ Loc + s(Doy, bs = "cc", k = 5) + 
                         s(Doy, bs = "cc", by = Loc, k = 5, m = 1) + 
                         s(Tod, bs = "cc", k = 5) + 
                         s(Tod, bs = "cc", by = Loc, k = 5, m = 1) +
                         te(Tod, Doy, by = Loc, bs = rep("cc",2)),
            data = DatNew, method = "ML")

แบบจำลองที่ง่ายกว่านั้นควรซ้อนอยู่ในโมเดลที่ซับซ้อนกว่าด้านบน รูปแบบที่เรียบง่ายนั้นคือ:

mod0 <- gam(Temp ~ Loc + s(Doy, bs = "cc", k = 5) + 
                         s(Doy, bs = "cc", by = Loc, k = 5, m = 1) + 
                         s(Tod, bs = "cc", k = 5) + 
                         s(Tod, bs = "cc", by = Loc, k = 5, m = 1),
            data = DatNew, method = "ML")

สังเกตสองสิ่งที่นี่:

  1. ประเภทพื้นฐานสำหรับแต่ละเรียบเนียนมีการระบุไว้ ในกรณีนี้เราจะคาดหวังว่าจะมีต่อเนื่องในอุณหภูมิไม่ 23:59-00:00 สำหรับTodมิได้ระหว่างและDoy == 1 ดังนั้นลูกบาศก์เส้นโค้งเป็นวงกลมมีความเหมาะสมที่ระบุไว้ที่นี่ผ่านDoy == 365.25bs = "cc"
  2. มิติข้อมูลพื้นฐานถูกระบุไว้อย่างชัดเจน ( k = 5) สิ่งนี้ตรงกับมิติพื้นฐานเริ่มต้นสำหรับแต่ละสมูทในหนึ่งte()คำ

เมื่อรวมคุณสมบัติเหล่านี้เข้าด้วยกันจะทำให้แน่ใจว่าโมเดลที่เรียบง่ายกว่านั้นซ้อนอยู่ภายในโมเดลที่ซับซ้อนมากขึ้น

สำหรับการดูรายละเอียดเพิ่มเติม?gam.modelsในmgcv


เกี่ยวข้องกับประเด็นที่ 2 ของคุณ - นอกจากข้อกำหนดkแล้วยังควรกำหนดจำนวนนอต (เช่นfx=TRUE) หากไม่เป็นเช่นนั้นแบบจำลองที่ได้จะแสดงความแตกต่างกันedfในแต่ละคำ
Marc ในกล่อง

ฉันควรปรับปรุงคำตอบนี้ให้ฟังก์ชั่นใหม่บางอย่างในแพ็คเกจmgcvในแง่ของเส้นโค้งสำหรับฐานส่วนเพิ่ม ที่กล่าวว่าฉันไม่เห็นด้วยที่คุณต้องแก้ไของศาอิสระสำหรับอิสระ กุญแจสำคัญคือเพื่อให้แน่ใจว่าฐานสำหรับแบบจำลองนั้นซ้อนกันอย่างเหมาะสม จากนั้นความแตกต่างระหว่างแบบจำลองสามารถทำได้โดยการตั้งค่าสัมประสิทธิ์สำหรับฟังก์ชันพื้นฐานให้เป็นศูนย์เช่นเดียวกับที่เกิดขึ้นในตัวแบบเชิงเส้นที่มีเงื่อนไขที่ไม่เป็นอิสระ
Reinstate Monica - G. Simpson

3
หวังว่าบางคนยังคงดูกระทู้นี้อยู่และอาจตอบคำถามได้ ในรูปแบบเหล่านี้ทำไมคุณต้องระบุทั้งสองs(Doy...)และs(Doy, by =Loc...)? ฉันคิดว่าอันแรกจะซ้อนอยู่หลังสุดและดังนั้นจึงไม่จำเป็นต้องระบุ?
ego_

3
ไม่ความราบรื่นแรกคือฟังก์ชั่นทั่วโลกและโดยราบรื่นแสดงถึงความแตกต่างเฉพาะไซต์ระหว่างมันและความราบรื่นระดับโลก โดยสมูทต้องm = 1เพิ่มให้กับพวกเขาเพื่อวางจุดโทษในอนุพันธ์อันดับแรกสำหรับความแตกต่างที่ราบรื่น
Reinstate Monica - G. Simpson

2
@JoshuaRosenberg ถ้าคุณหมายถึงte()มันขึ้นอยู่กับว่าคุณรวมอะไรบ้างในผลิตภัณฑ์เทนเซอร์? การโต้ตอบที่อธิบายไว้ที่นี่เป็นการโต้ตอบที่ใช้ปัจจัยอย่างราบรื่น แต่te()จะบอกถึงตัวแปรต่อเนื่องสองตัวหรือมากกว่านั้น หากคุณต้องการคำศัพท์ที่ครอบคลุมทั่วโลกและการเบี่ยงเบนเฉพาะเรื่องคุณte(DoY, Year, by = Loc, m = 1)สามารถใช้คำว่าใช่ได้te(DoY, Year)แม้ว่าจะมีวิธีอื่นในการบรรลุสิ่งที่คล้ายกันโดยใช้การโต้ตอบที่ราบรื่นโดยใช้เอฟเฟกต์แบบแฟคเตอร์ที่เหมือนte()กัน
Reinstate Monica - G. Simpson
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.