ฉันได้รวมภาพหน้าจอเพื่อช่วยชี้แจงปัญหาของฉัน: ฉันพยายามคำนวณค่าเฉลี่ยเคลื่อนที่และค่าส่วนเบี่ยงเบนมาตรฐานเคลื่อนที่ สิ่งที่ฉันต้องการคำนวณค่าสัมประสิทธิ์ของการเปลี่ยนแปลง (stdevavg) สำหรับค่าจริง โดยปกติจะทำโดยการคำนวณ stdev และค่าเฉลี่ยสำหรับ 5 ปีที่ผ่านมา แต่บางครั้งจะมีการสังเกตในฐานข้อมูลของฉันซึ่งฉันไม่มีข้อมูลในช่วง 5 ปีที่ผ่านมา (อาจจะมีเพียง 3, 2 ฯลฯ ) Thats ทำไมฉันต้องการรหัสที่จะคำนวณเฉลี่ยและ stdev แม้ว่าจะไม่มีข้อมูลสำหรับทั้ง 5 ปี นอกจากนี้ตามที่คุณเห็นในข้อสังเกตบางครั้งฉันมีข้อมูลมากกว่า 5 ปีเมื่อเป็นกรณีนี้ฉันต้องมีค่าเฉลี่ยเคลื่อนที่ซึ่งจะช่วยให้ฉันสามารถคำนวณค่าเฉลี่ยและเฉลี่ยได้ในช่วง 5 ปีที่ผ่านมา ดังนั้นหาก บริษัท มีข้อมูลเป็นเวลา 7 ปีฉันต้องการรหัสบางประเภทซึ่งจะคำนวณค่าเฉลี่ยและค่าเฉลี่ยสำหรับปี 1997 (โดย 1991-1996), 1998 (โดย 1992-1997) และ 1999 (1993-1998) เป็น im ไม่คุ้นเคยกับคำสั่ง sas ควรดู (มากอย่างคร่าว ๆ ) เช่น: หรือบางอย่างเช่นนี้ผมมีเงื่อนงำไม่ Im gonna พยายามและคิดออก แต่มูลค่าการโพสต์มันถ้าฉันเคยชินพบว่าตัวเองฉันเป็น SAS เริ่มต้นและ Im อยากรู้อยากเห็นถ้างานต่อไปนี้สามารถทำได้ง่ายมากขึ้นตามที่อยู่ในหัวของฉัน ฉันมีเมตาดาต้า (แบบง่าย) ต่อไปนี้ในตาราง userdatemoney: User - Date - เงินกับผู้ใช้รายต่างๆและวันที่สำหรับทุกๆปฏิทิน (สำหรับ 4 ปีที่ผ่านมา) ข้อมูลถูกสั่งโดย User ASC และ Date ASC ข้อมูลตัวอย่างมีลักษณะดังนี้: ตอนนี้ฉันต้องการคำนวณค่าเฉลี่ยเคลื่อนที่ 5 วันสำหรับ Money ฉันเริ่มต้นด้วย apprach ที่นิยมมากกับ lag () ฟังก์ชันเช่นนี้: ตามที่คุณเห็นปัญหาเกี่ยวกับวิธีการนี้เกิดขึ้นถ้ามีถ้าขั้นตอนข้อมูลทำงานเป็นผู้ใช้ใหม่ Aron จะได้รับค่าล้าหลังจากแอนนาซึ่งแน่นอนว่าไม่ควรเกิดขึ้น ตอนนี้คำถามของฉัน: ฉันค่อนข้างมั่นใจว่าคุณสามารถจัดการสลับผู้ใช้โดยการเพิ่มเขตข้อมูลพิเศษเช่น laggeduser และโดยการตั้งค่า N, Sum และตัวแปรค่าเฉลี่ยถ้าคุณสังเกตเห็นเช่นเปลี่ยน แต่: นี้สามารถทำได้ในวิธีที่ง่ายขึ้นอาจใช้ โดยวิธีใดขอบคุณสำหรับความคิดและความช่วยเหลือของคุณฉันคิดว่าวิธีที่ง่ายที่สุดคือการใช้ PROC ขยาย: และดังกล่าวในความคิดเห็น Johns สำคัญที่ต้องจำเกี่ยวกับค่าที่หายไป (และเกี่ยวกับการเริ่มต้นและสิ้นสุดการสังเกตด้วย) Ive เพิ่มตัวเลือก SETMISS ลงในรหัสตามที่คุณระบุให้ชัดเจนว่าคุณต้องการ zerofy ค่าที่หายไปอย่าละเลย (พฤติกรรมเริ่มต้นของ MOVAVE) ถ้าคุณต้องการยกเว้น 4 ข้อสังเกตแรกสำหรับผู้ใช้แต่ละคน (เนื่องจากไม่มีประวัติก่อนคำนวณค่าเฉลี่ยเคลื่อนที่ 5) คุณสามารถใช้ตัวเลือก TRIMLEFT 4 ภายใน TRANSFORMOUT () ตอบเมื่อวันที่ 3 ธันวาคม 13 เวลาเฉลี่ย 15: 29 โดยมีค่าเฉลี่ยตามช่วงวันที่ที่มีช่วงค่าเฉลี่ยของช่วงวันที่กับช่วงวันที่ Im new to SAS และฉันมีปัญหาบางอย่างกับการคำนวณค่าเฉลี่ยเคลื่อนที่ตามวันที่และกลุ่มภายในชุดข้อมูล โดยทั่วไปฉันพยายามคำนวณค่าเฉลี่ยเคลื่อนที่สำหรับการสังเกตแต่ละครั้งในช่วง 90 วันที่ผ่านมา การสังเกตแต่ละครั้งมีวันที่ ฉันยังต้องจัดกลุ่มพวกเขาเพื่อให้ค่าเฉลี่ยเคลื่อนที่จะขึ้นอยู่กับกลุ่มเท่านั้น กล่าวอีกนัยหนึ่งถ้าฉันจัดกลุ่มตามผลไม้แอปเปิ้ลจะมีค่าเฉลี่ยเคลื่อนที่และ orages ฯลฯ ฉันรู้ว่าฉันจะต้องจัดเรียงข้อมูลก่อนจากนั้นใช้คำสั่ง retain ฉันกำลังคิดที่จะทำมาโครด้วย ฉันเริ่มต้นนี้ แต่ดูเหมือนจะไม่มีส่วนใดในการทำงาน คนสามารถช่วยฉันได้หรือไม่? ฉันรู้วิธีการเรียงลำดับ แต่ฉันยังรู้วิธีหาค่าเฉลี่ย แต่ไม่ได้จัดกลุ่มอย่างถูกต้อง มันเป็นเพียงการให้ฉันค่าของการสังเกต ฉันก็พยายามที่จะทำกับ SQL แต่ไม่ได้ทำงานอย่างใดอย่างหนึ่ง นี่คือสิ่งที่ฉันเกิดขึ้น proc sql create table data. movingavg as a., mean (basis) as moving จาก xx ตามวันที่กลุ่มผลิตภัณฑ์ RE: ค่าเฉลี่ยเคลื่อนที่โดยใช้ช่วงวันที่ที่ไม่ทำงานอย่างใดอย่างหนึ่ง ข้อมูลใหม่ชุดเก่าโดย id retain basis ถ้า date90 แล้วเฉลี่ยเฉลี่ย (basis) run RE: ค่าเฉลี่ยเคลื่อนที่โดยใช้ช่วงวันที่นี่คือตัวอย่างของชุดข้อมูลของฉัน วันที่ของผลิตภัณฑ์แอปเปิลอาจ 20 4 march2 สีส้ม 3 apple april 3 กล้วย jan31 33 apple feb13 88 apple dec2 12 สิ่งที่ฉันต้องการคือค่าเฉลี่ยเคลื่อนที่ที่วิ่งอยู่ในช่วง 90 วันที่ผ่านมาของผลิตภัณฑ์โดยขึ้นอยู่กับจำนวนพื้นฐาน ขอโทษสำหรับโพสต์หลาย แต่หลังจากที่ฉัน reread โพสต์ก่อนหน้าของฉันดูเหมือนสับสนเป็นสิ่งที่ฉันพยายามที่จะทำ ขอบคุณครับ RE: ค่าเฉลี่ยเคลื่อนที่ที่มีช่วงวันที่ klaz2002 (โปรแกรมเมอร์) 25 Sep 07 16:00 ฉันต้องเริ่มต้นด้วยการกล่าวขอบคุณสำหรับคำถามนี้ เพราะมันทำให้ฉันไม่มีเวลาพักผ่อนจนกว่าฉันจะสามารถแก้ปัญหาได้ ให้ฉันระบุสิ่งที่ฉันเชื่อว่าเป็นความต้องการของคุณเพียงเพื่อให้คุณและฉันอยู่ในหน้าเดียวกัน ต้องการ 1) คุณต้องการมีค่าเฉลี่ยเคลื่อนที่ของ 90 วันที่ผ่านมาของข้อมูลตามชื่อผลิตภัณฑ์ ความหมายว่าสำหรับผลิตภัณฑ์ชิ้นเดียว (เช่นแอปเปิ้ล) คุณสนใจเฉพาะค่าพื้นฐานของผลิตภัณฑ์นั้นที่จะย้อนกลับไป 90 วัน 2) ฉันคิดว่าคุณมีบันทึก (1) ต่อผลิตภัณฑ์ต่อวัน นั่นหมายความว่าคุณไม่มีมูลค่าพื้นฐานมากกว่าหนึ่งครั้งต่อผลิตภัณฑ์ต่อวัน เมื่อต้องการแก้ปัญหาประวัติ (ค่าที่จะย้อนกลับไป 90 วัน) ฉันใช้ lagx () และใส่วันที่ 1-90 ในตัวแปรแล้วเพิ่มลงในอาร์เรย์ เนื่องจากตัวแปรต้องถูกรวมไว้ในอาร์เรย์ฉันจึงสร้างมาโครขนาดเล็กที่สร้างบรรทัดของรหัสที่ฉันต้องการ MACRO ที่สร้าง 270 ตัวแปรสำหรับ 90 วันของประวัติศาสตร์แมโคร SetVars ทำ i1 ถึง 90 ผลิตภัณฑ์โปรโมชั่น lagampi (ผลิตภัณฑ์) dateampi lagampi (วันที่) basisampi lagampi (พื้นฐาน) สิ้นสุดแก้ไขปรับปรุงครั้งแรกโดยผลิตภัณฑ์และวันที่ proc จัดเรียงข้อมูล yourdata out datasorted ตามวันที่ข้อมูลการเรียกใช้ผลิตภัณฑ์ ชุดข้อมูลสุดท้ายที่จัดเก็บตามวันที่ของผลิตภัณฑ์ prod1-prod90 7 date1-date90 basis1-basis90 mysum 8 อาร์เรย์ปัจจุบันอาร์เรย์ mysum prod prod1-prod90 array dt date1-date90 อาร์เรย์ bs basis1-basis90 SetVars กำหนดวันที่ 90 วันเพื่อตรวจสอบ DateMinus90 date-90 bctr 1 mysum 0 วนรอบวันที่เป็นไปได้ทั้งหมดทำ i1 ถึง 90 ข้อยกเว้นสำหรับกรณีแรกในกลุ่มผลิตภัณฑ์ตามที่มีอยู่ไม่ช้าถ้า first. product แล้ว moveavg พื้นฐานตรวจสอบชื่อผลิตภัณฑ์เดียวกันและภายใน 90 วันอื่นถ้าตัด (upcase (แยง) )) ตัด (upcase (ผลิตภัณฑ์)) และ dt dateminus90 แล้วทำถ้าพบแล้วใส่ลงใน SUM VAR mysum sum (mysum, basis, bs) เก็บจำนวน CODE ของเอกสารจำนวนมากที่พบ bctr 1 end end ถ้าไม่พบค่าพื้นฐานปัจจุบัน ควรใช้ ถ้า mysum 0 แล้ว myavg พื้นฐานอื่น myavg mysumbctr รัน proc พิมพ์ dataFINAL var วันที่ผลิตภัณฑ์ dateminus90 พื้นฐาน myavg วันที่รูปแบบ dateminus90 mmddyy10 วิ่งฉันหวังว่านี้จะช่วยให้คุณ จริงๆคุณควรมองเรื่องนี้มากกว่าที่ฉันได้นี้จริงๆโดยไม่ต้องตรวจสอบอย่างกว้างขวาง อาจมีข้อ จำกัด หลายประการในโค้ดนี้ดังนั้นโปรดระวังในโพสต์นี้ฉันจะแสดงเคล็ดลับในการคำนวณค่าเฉลี่ยเคลื่อนที่ (สามารถขยายไปยังการดำเนินการอื่น ๆ ที่ต้องใช้ฟังก์ชั่น windowing) ซึ่งเร็วเกินไป บ่อยครั้งที่นักวิเคราะห์ของ SAS จำเป็นต้องคำนวณค่าเฉลี่ยเคลื่อนที่และมีหลายทางเลือกตามลำดับความชอบ: 1. PROC EXPAND 2. ขั้นตอนของข้อมูล PROC SQL แต่หลายไซต์อาจไม่ได้รับอนุญาต SASETS ใช้ PROC EXPAND และทำค่าเฉลี่ยเคลื่อนที่ใน DATA ขั้นตอนต้องมีการเขียนโค้ดและมีข้อผิดพลาดเกิดขึ้น PROC SQL เป็นทางเลือกที่เป็นธรรมชาติสำหรับโปรแกรมเมอร์รุ่นจูเนียร์และในหลายกรณีทางธุรกิจจะเป็นทางออกเดียว แต่ SAS PROC SQL ของ SAS ขาดฟังก์ชันการทำงานของหน้าต่างที่มีอยู่ในดีดีจำนวนมากเพื่อช่วยในการคำนวณค่าเฉลี่ยเคลื่อนที่ คนเทคนิคหนึ่งมักใช้คือ CROSS JOIN ซึ่งมีราคาแพงมากและไม่ใช่โซลูชันที่ทำงานได้สำหรับชุดข้อมูลที่มีขนาดปานกลาง ในโพสต์นี้ฉันแสดงเคล็ดลับการคำนวณค่าเฉลี่ยเคลื่อนที่ (สามารถขยายไปยังการดำเนินการอื่น ๆ ที่ต้องใช้ฟังก์ชัน windowing) ซึ่งเร็วเกินไป พิจารณาการคำนวณค่าเฉลี่ยเคลื่อนที่ที่ง่ายที่สุดที่มีการสังเกตการณ์ K ต่อท้ายรวมอยู่ในการคำนวณ ได้แก่ MA (K) ที่นี่เรากำหนด K5 เราสร้างข้อมูลตัวอย่าง 20 ครั้งแรกซึ่งใช้ตัวแปร ID สำหรับหน้าต่างและตัวแปร X จะใช้ในการคำนวณ MA และจากนั้นเราจะใช้ CROSS JOIN มาตรฐานเพื่อตรวจสอบข้อมูลที่ได้ก่อนไม่ได้จัดกลุ่มไว้ เพื่อทำความเข้าใจวิธีใช้โครงสร้างข้อมูล จากชุดข้อมูลที่เป็นผลลัพธ์มันเป็นการยากที่จะหาเงื่อนงำตอนนี้ให้เรียงตามคอลัมน์ quotbidquot ในชุดข้อมูลนี้: จากข้อมูลที่เรียงลำดับนี้เป็นที่แน่ชัดว่าเราไม่มีข้อมูล CROSS JOIN ทั้งชุดข้อมูลเดิม แต่ใช้ CROSS JOIN, เราสามารถสร้างชุดข้อมูล quotoperationquot ที่มีค่าความแตกต่างได้และให้ชุดข้อมูลต้นฉบับ CROSS JOIN กับชุดข้อมูล quotoperationquot ขนาดเล็กมากนี้และข้อมูลทั้งหมดที่เราต้องการใช้สำหรับการคำนวณ MA จะอยู่ที่นั่น ตอนนี้ให้ทำ: CROSS JOIN ข้อมูลเดิมที่มีข้อมูล quotoperationquot จัดเรียงตาม (a. idops) ซึ่งเป็นจริงในชุดข้อมูล sortbid39 ตามที่ระบุไว้ในโค้ดด้านบนมีความจำเป็นต้องมีขวานคูณด้วย b. weight เพื่อให้ข้อมูล สามารถเป็นแบบ inter-leaved ได้มิเช่นนั้นค่า X เดียวกันจากตารางต้นฉบับจะถูกส่งออกและการคำนวณ MA จะล้มเหลว ตัวแปรน้ำหนักอย่างชัดเจนจะเพิ่มความยืดหยุ่นในการคำนวณ MA ทั้งหมดได้มากขึ้น ในขณะที่การตั้งค่าให้เป็น 1 สำหรับผลการปฏิบัติงานทั้งหมดในผลการคำนวณ MA แบบธรรมดาให้กำหนดน้ำหนักที่แตกต่างกันจะช่วยในการแก้ไขปัญหาการประมวลผลแบบ MA ที่ซับซ้อนมากขึ้นเช่นให้ข้อสังเกตเพิ่มเติมเกี่ยวกับน้ำหนักที่ลดลงสำหรับ MA ที่ผุกร่อน ถ้าจำเป็นต้องมี K parameter ที่แตกต่างกันในการคำนวณ MA (K) จะต้องมีการปรับปรุงชุดข้อมูลการทำงานซึ่งเป็นงานที่ไม่สำคัญ ตอนนี้แม่แบบรหัสจริงสำหรับการคำนวณ MA (K) จะเป็น: ด้วยวิธีการใหม่นี้เป็นที่น่าสนใจเพื่อเปรียบเทียบกับ CROSS JOIN รวมทั้ง PROC EXPAND บนเวิร์กสเตชันของฉัน (Intel i5 3.8Ghz หน่วยความจำ 32GB และฮาร์ดดิสก์แบบ 1TB 72K) CROSS JOIN มีความยาวมากในการทำงาน (ถ้าข้อมูลมีขนาดใหญ่) ในขณะที่วิธีการใหม่ใช้เวลาในการ PROC EXPAND เพียง 2 เท่าใช้เวลาทั้งหมด เล็กน้อยเมื่อเทียบกับตนเองเข้าร่วม การบริโภคเวลาที่แสดงด้านล่างอยู่ใน quotsecondquot ด้านล่างนี้ผู้อ่านโค้ดสามารถเรียกใช้และเปรียบเทียบตัวเองได้ โพสต์เมื่อ 10 พฤษภาคม 2015 โดย Liang Xie SAS การเขียนโปรแกรมสำหรับการทำเหมืองข้อมูล
Comments
Post a Comment