คุณอาจต้องการติดตามIntroduction to เศรษฐมิติของ Dougherty บางทีเมื่อพิจารณาแล้วว่าเป็นตัวแปรที่ไม่สุ่มและกำหนดค่าเบี่ยงเบนกำลังสองเฉลี่ยของxเป็นMSD ( x ) = 1xx2 โปรดทราบว่า MSD ถูกวัดในจตุรัสของหน่วยของx(เช่นถ้าxเป็นซม.ดังนั้น MSD จะอยู่ในหน่วยcm2) ในขณะที่รูตหมายถึงการเบี่ยงเบนกำลังสองสแควร์,RMSD(x)=√เอ็มเอส( x ) = 1nΣni = 1( xผม- x¯)2xxซม.ซม.2อยู่ในระดับเดิม อัตราผลตอบแทนนี้RMSD( x ) = MSD(x)−−−−−−−√
Corr(β^OLS0,β^OLS1)=−x¯MSD(x)+x¯2−−−−−−−−−−−√
นี้จะช่วยให้คุณเห็นวิธีการความสัมพันธ์ได้รับผลกระทบจากทั้งค่าเฉลี่ยของ (โดยเฉพาะความสัมพันธ์ระหว่างความลาดชันและตัดประมาณของคุณจะถูกลบออกถ้าxตัวแปรเป็นศูนย์กลาง) และยังตามของการแพร่กระจาย (การสลายตัวนี้อาจทำให้เส้นกำกับชัดเจนขึ้น!)xx
ฉันจะย้ำถึงความสำคัญของผลลัพธ์นี้: ถ้าไม่มีค่าศูนย์เราสามารถแปลงมันได้โดยการลบˉ xเพื่อให้อยู่ตรงกลาง ถ้าเราพอดีกับเส้นถดถอยของyบนx - ˉ xความชันและการประมาณค่าตัดแกนจะไม่ถูกนำมาสัมพันธ์กัน - ค่าที่ต่ำกว่าหรือสูงเกินไปในค่าหนึ่งไม่น่าจะทำให้ค่าต่ำหรือค่าสูงเกินไป แต่เส้นถดถอยนี้เป็นเพียงการแปลของyบนเส้นถดถอยx ! ข้อผิดพลาดมาตรฐานของการสกัดกั้นของYบนx - ˉ xเส้นเป็นเพียงตัวชี้วัดของความไม่แน่นอนของปีxx¯yx−x¯yxyx−x¯y^เมื่อตัวแปรที่แปลของคุณ ; เมื่อสายที่จะแปลกลับไปยังตำแหน่งเดิมย้อนกลับนี้จะเป็นข้อผิดพลาดมาตรฐานของปีที่x = ˉ x โดยทั่วไปข้อผิดพลาดมาตรฐานของปีที่ใด ๆxค่าเป็นเพียงข้อผิดพลาดมาตรฐานของการสกัดกั้นของการถดถอยของปีบนแปลเหมาะสมx ; ข้อผิดพลาดมาตรฐานของปีที่x = 0เป็นหลักสูตรที่ข้อผิดพลาดมาตรฐานของการสกัดกั้นในต้นฉบับถดถอยที่ไม่ได้แปลx−x¯=0y^x=x¯y^xyxy^x=0
เนื่องจากเราสามารถแปลในความรู้สึกบางมีอะไรพิเศษเกี่ยวกับx = 0และดังนั้นจึงไม่มีอะไรพิเศษเกี่ยวกับβ 0 กับบิตของความคิดสิ่งที่ผมกำลังจะบอกว่าผลงานปีที่ใด ๆค่าของxซึ่งจะเป็นประโยชน์ถ้าคุณกำลังมองหาข้อมูลเชิงลึกในช่วงความเชื่อมั่นเช่นสำหรับการตอบสนองเฉลี่ยจากบรรทัดถดถอยของคุณ แต่เราได้เห็นว่ามีเป็นบางสิ่งบางอย่างที่พิเศษเกี่ยวกับปีที่x = ˉ xเพราะมันอยู่ที่นี่ว่าข้อผิดพลาดในความสูงโดยประมาณของเส้นถดถอย - ซึ่งเป็นของประมาณการที่แน่นอนxx=0β^0y^xy^x=x¯ - และข้อผิดพลาดในความชันโดยประมาณของเส้นการถดถอยไม่มีอะไรเกี่ยวข้องกัน ตัดประมาณของคุณคือ β 0= ˉ Y - β 1 ˉ xและข้อผิดพลาดในการประมาณค่าของมันจะต้องมีต้นกำเนิดทั้งจากการประมาณค่าของ ˉ ปีหรือประมาณค่าของ β 1(ตั้งแต่ที่เราได้รับการยกย่องxเป็นไม่ใช่สุ่ม); ตอนนี้เรารู้แหล่งที่มาของทั้งสองของข้อผิดพลาดจะ uncorrelated ก็เป็นที่ชัดเจนว่าทำไมพีชคณิตควรจะมีความสัมพันธ์ทางลบระหว่างความลาดชันประมาณและตัด (ไขว้เขวลาดชันจะมีแนวโน้มที่จะตัดประมาทตราบ ˉy¯β^0=y¯−β^1x¯y¯β^1x) แต่ความสัมพันธ์เชิงบวกระหว่างการสกัดกั้นโดยประมาณและการตอบสนองที่คาดเฉลี่ย Y = ˉ ปีที่x= ˉ x แต่สามารถเห็นความสัมพันธ์ดังกล่าวได้โดยไม่ต้องใช้พีชคณิตเช่นกันx¯<0y^=y¯x=x¯
ลองนึกภาพเส้นถดถอยโดยประมาณเป็นไม้บรรทัด ผู้ปกครองที่จะต้องผ่าน ) เราเพิ่งเห็นว่ามีความไม่แน่นอนสองอย่างที่ไม่เกี่ยวข้องกันในตำแหน่งของเส้นนี้ซึ่งฉันเห็นภาพ kinaesthetically ว่า "ความไม่แน่นอน" การเปลี่ยน "และความไม่แน่นอน" การเลื่อนแบบขนาน " ก่อนที่คุณจะบิดไม้บรรทัดให้ถือที่( ˉ x , ˉ y )(x¯,y¯)(x¯,y¯)ในฐานะที่เป็นเดือยแล้วให้มันมีความหลากหลายที่เกี่ยวข้องกับความไม่แน่นอนของคุณในความลาดชัน ผู้ปกครองจะมีการโยกเยกที่ดีมากขึ้นอย่างรุนแรงดังนั้นหากคุณไม่แน่ใจเกี่ยวกับความลาดชัน (แน่นอนความลาดชันเชิงบวกก่อนหน้านี้อาจจะกลายเป็นลบหากความไม่แน่นอนของคุณมีขนาดใหญ่) แต่โปรดทราบว่าความสูงของเส้นถดถอยที่ไม่เปลี่ยนแปลงจากความไม่แน่นอนเช่นนี้และเอฟเฟ็กต์ของ twang จะเห็นได้ชัดเจนยิ่งขึ้นจากค่าเฉลี่ยที่คุณมองx=x¯
ในการ "เลื่อน" ไม้บรรทัดจับให้แน่นแล้วเลื่อนขึ้นและลงระวังให้ขนานกับตำแหน่งเดิม - อย่าเปลี่ยนความชัน! การเลื่อนขึ้นและลงอย่างแรงขึ้นอยู่กับความไม่แน่นอนของคุณเกี่ยวกับความสูงของเส้นถดถอยขณะที่ผ่านจุดเฉลี่ย ลองคิดดูว่าข้อผิดพลาดมาตรฐานของการสกัดกั้นจะเป็นอย่างไรถ้าถูกแปลเพื่อให้แกน-yผ่านจุดเฉลี่ย อีกวิธีหนึ่งคือตั้งแต่ความสูงโดยประมาณของเส้นถดถอยที่นี่เป็นเพียงˉ ปีก็ยังเป็นข้อผิดพลาดมาตรฐานของˉ Y โปรดทราบว่าความไม่แน่นอนของ "การเลื่อน" แบบนี้มีผลต่อทุกจุดบนเส้นการถดถอยอย่างเท่าเทียมกันซึ่งแตกต่างจาก "twang"xyy¯y¯
สองคนนี้ไม่แน่นอนสมัครอิสระ (ดี uncorrelatedly แต่ถ้าเราคิดแง่ข้อผิดพลาดการกระจายตามปกติแล้วพวกเขาก็ควรจะเป็นอิสระในทางเทคนิค) เพื่อให้ความสูงYของทุกจุดบนเส้นถดถอยของคุณจะได้รับผลกระทบจาก "การทำเสียงซอ" ความไม่แน่นอนซึ่งเป็นศูนย์ที่ หมายถึงและแย่ลงกว่าเดิมและความไม่แน่นอน "เลื่อน" ซึ่งเหมือนกันทุกที่ (คุณเห็นความสัมพันธ์กับช่วงความมั่นใจในการถดถอยที่ฉันสัญญาไว้ก่อนหน้านี้โดยเฉพาะความกว้างของพวกเขาแคบที่สุดที่ˉ xหรือไม่)y^x¯
ซึ่งรวมถึงความไม่แน่นอนในปีที่x = 0ซึ่งเป็นหลักสิ่งที่เราหมายถึงข้อผิดพลาดมาตรฐานในβ 0 ทีนี้สมมุติว่าˉ xอยู่ทางขวาของx = 0 ; จากนั้นการปรับกราฟให้มีความลาดชันโดยประมาณที่สูงขึ้นมีแนวโน้มที่จะลดการสกัดกั้นโดยประมาณของเราเนื่องจากร่างสเก็ตช์จะแสดง นี่คือความสัมพันธ์เชิงลบที่ทำนายโดย- ˉ xy^x=0β^0x¯x=0เมื่อˉxเป็นบวก ในทางกลับกันถ้าˉxอยู่ทางซ้ายของx=0คุณจะเห็นว่าความชันโดยประมาณที่สูงกว่ามีแนวโน้มที่จะเพิ่มการสกัดกั้นโดยประมาณของเราซึ่งสอดคล้องกับความสัมพันธ์เชิงบวกที่สมการของคุณคาดการณ์เมื่อˉxติดลบ โปรดทราบว่าถ้าˉxอยู่ไกลจากศูนย์การประมาณของเส้นถดถอยที่มีความชันไล่ระดับไม่แน่นอนออกไปทางy−x¯MSD(x)+x¯2√x¯x¯x=0x¯x¯Yแกนจะกลายเป็นล่อแหลมมากขึ้น (ความกว้างของ "twang" แย่ลงจากค่าเฉลี่ย) ว่า "การทำเสียงซอ" ข้อผิดพลาดใน-ระยะจะหนาแน่นเกินดุลข้อผิดพลาด "เลื่อน" ในˉ Yระยะดังนั้นข้อผิดพลาดในβ 0เกือบจะถูกกำหนดโดยสิ้นเชิงข้อผิดพลาดใด ๆ ในβ 1 ในขณะที่คุณสามารถตรวจสอบพีชคณิตถ้าเราใช้เวลาˉ x →การ± ∞โดยไม่ต้องเปลี่ยนเอ็มเอสหรือค่าเบี่ยงเบนมาตรฐานของความผิดพลาดs Uความสัมพันธ์ระหว่างβ 0 และ-β^1x¯Y¯β^0β^1x¯→ ± ∞sยูβ^0มีแนวโน้มที่จะ∓1β^1∓ 1
เพื่อแสดงให้เห็นถึงสิ่งนี้ (คุณอาจต้องการคลิกขวาที่ภาพและบันทึกหรือดูขนาดเต็มในแท็บใหม่หากตัวเลือกนั้นมีให้คุณ) ฉันเลือกที่จะพิจารณาตัวอย่างซ้ำของที่U ฉัน ~ N ( 0 , 10 2 )มีการ IID กว่าชุดถาวรของxค่ากับˉ x = 10ดังนั้นE ( ˉ Y ) = 25Yผม= 5 + 2 xผม+ uผมยูผม~ N( 0 , 10)2)xx¯= 10E ( Y¯)=25. ในการตั้งค่านี้มีความสัมพันธ์เชิงลบแข็งแกร่งอย่างเป็นธรรมระหว่างความลาดชันประมาณและการสกัดกั้นและความสัมพันธ์เชิงบวกระหว่างอ่อนแอการตอบสนองเฉลี่ยประมาณx = ˉ xและประมาณตัด อนิเมชั่นแสดงตัวอย่างที่จำลองขึ้นจำนวนมากพร้อมเส้นตัวอย่างการถดถอย (ทอง) ลากผ่านเส้นการถดถอยจริง (สีดำ) แถวที่สองแสดงให้เห็นว่าการสะสมของเส้นการถดถอยโดยประมาณนั้นดูเหมือนว่ามีข้อผิดพลาดเฉพาะในˉ y ที่ประมาณและลาดที่ตรงกับความชันจริง ("การเลื่อน" ผิดพลาด); จากนั้นหากมีข้อผิดพลาดเฉพาะในลาดและand yy¯x=x¯y¯y¯จับคู่กับค่าประชากร (ข้อผิดพลาด "การจับคู่"); และในที่สุดสิ่งที่คอลเลกชันของเส้นโดยประมาณดูเหมือนจริงเมื่อทั้งสองแหล่งที่มาของข้อผิดพลาดรวมกัน สิ่งเหล่านี้ได้รับการกำหนดรหัสสีโดยขนาดของการสกัดกั้นโดยประมาณจริง ๆ (ไม่ใช่จุดตัดที่แสดงในสองกราฟแรกที่แหล่งที่มาของข้อผิดพลาดถูกกำจัด) จากสีน้ำเงินสำหรับการตัดต่ำไปจนถึงแดงสำหรับการสกัดสูง โปรดสังเกตว่าจากสีเพียงอย่างเดียวเราจะเห็นได้ว่าตัวอย่างที่มีค่า ต่ำมีแนวโน้มที่จะสร้างค่าดักจับโดยประมาณที่ต่ำกว่าเช่นเดียวกับตัวอย่างที่มีค่าสูงy¯ความลาดชันโดยประมาณ แถวถัดไปแสดงการแจกแจงแบบจำลอง (ฮิสโตแกรม) และเชิงทฤษฎี (เส้นโค้งปกติ) ของการประมาณและแถวสุดท้ายจะแสดงแผนการกระจายระหว่างพวกเขา สังเกตว่ามีความสัมพันธ์ระหว่างไม่มีและความลาดชันประมาณความสัมพันธ์เชิงลบระหว่างการสกัดกั้นโดยประมาณและความลาดชันและความสัมพันธ์เชิงบวกระหว่างการสกัดกั้นและˉ Yy¯y¯
MSD กำลังทำอะไรอยู่ในส่วนของ ? แพร่กระจายออกช่วงของxค่าคุณวัดมากกว่าเป็นที่รู้จักกันดีที่จะช่วยให้คุณสามารถที่จะประเมินความลาดชันอย่างแม่นยำมากขึ้นและสัญชาตญาณที่มีความชัดเจนจากร่าง แต่มันไม่ได้ช่วยให้คุณสามารถประเมินˉYใด ๆ ที่ดี ฉันขอแนะนำให้คุณนึกภาพการใช้ MSD ใกล้ศูนย์ (เช่นการสุ่มตัวอย่างคะแนนนั้นใกล้กับค่าเฉลี่ยของx) มากเท่านั้นดังนั้นความไม่แน่นอนของคุณในความชันจะใหญ่มาก: ลองคิด twangs ที่ยิ่งใหญ่ แต่ไม่เปลี่ยนความไม่แน่นอนแบบเลื่อน หากy-axisของคุณอยู่ห่างจากˉx(กล่าวอีกนัยหนึ่งคือถ้าˉx≠0−x¯MSD(x)+x¯2√xy¯xyx¯x¯≠0) คุณจะพบว่าความไม่แน่นอนในการสกัดกั้นของคุณจะถูกครอบงำอย่างเต็มที่จากข้อผิดพลาดการบิดที่เกี่ยวข้องกับความลาดชัน ในทางตรงกันข้ามหากคุณเพิ่มการกระจายของการวัดของคุณโดยไม่ต้องเปลี่ยนค่าเฉลี่ยคุณจะปรับปรุงความแม่นยำของการประมาณความชันของคุณได้อย่างหนาแน่นและต้องการเพียงการใช้ twangs ที่อ่อนโยนต่อสายของคุณเท่านั้น ตอนนี้ความสูงของการสกัดกั้นของคุณถูกครอบงำด้วยความไม่แน่นอนของการเลื่อนซึ่งไม่เกี่ยวข้องกับความชันโดยประมาณของคุณ สิ่งนี้นับด้วยความจริงเกี่ยวกับพีชคณิตว่าความสัมพันธ์ระหว่างความชันโดยประมาณกับการสกัดกั้นมีแนวโน้มที่จะเป็นศูนย์เช่นMSD ( x ) → ± ∞และเมื่อˉ x ≠ 0ต่อ± 1xMSD(x)→±∞x¯≠0±1(เครื่องหมายเป็นตรงข้ามของสัญญาณของ ) ในฐานะเอ็มเอส( x ) → 0x¯MSD(x)→0
ความสัมพันธ์ของตัวประมาณค่าความชันและการสกัดกั้นเป็นหน้าที่ของทั้งและ MSD (หรือ RMSD) ของxดังนั้นการมีส่วนร่วมของพวกเขามีน้ำหนักมากขึ้นอย่างไร? อันที่จริงเรื่องทั้งหมดที่เป็นอัตราส่วนของˉ xเพื่อ RMSD ของx ปรีชาเรขาคณิตคือ RMSD จะช่วยให้เราชนิดของ "หน่วยธรรมชาติ" สำหรับx ; ถ้าเราลดค่าx -axis โดยใช้w i = x i / RMSD ( x )นี่คือการยืดในแนวนอนที่ทำให้การสกัดกั้นโดยประมาณและunch yไม่เปลี่ยนแปลงทำให้เราใหม่x¯xx¯xxxwi=xi/RMSD(x)y¯และคูณลาดประมาณโดย RMSD ของx สูตรสำหรับความสัมพันธ์ระหว่างความลาดชันและตัดใหม่ประมาณคือในแง่เดียวของ RMSD ( W )ซึ่งเป็นหนึ่งและ ˉ Wซึ่งเป็นอัตราส่วน ˉ xRMSD(w)=1xRMSD(w)w¯ ) เมื่อการประมาณค่าสกัดกั้นไม่เปลี่ยนแปลงและการประมาณค่าความชันจะถูกคูณด้วยค่าคงที่เป็นบวกจากนั้นค่าสหสัมพันธ์ระหว่างพวกมันจึงไม่เปลี่ยนแปลง: ดังนั้นความสัมพันธ์ระหว่างความชันดั้งเดิมกับการสกัดกั้นจึงขึ้นอยู่กับ ˉ x เท่านั้นx¯RMSD(x) ) พีชคณิตเราสามารถดูได้โดยการหารด้านบนและด้านล่างของ- ˉ xx¯RMSD(x)โดยRMSD(x)ที่จะได้รับCorr( β 0, β 1)=-( ˉ x /RMSD(x))−x¯MSD(x)+x¯2√RMSD(x) 2Corr(β^0,β^1)=−(x¯/RMSD(x))1+(x¯/RMSD(x))2√
เมื่อต้องการค้นหาความสัมพันธ์ระหว่างβ 0และˉ YพิจารณาCov ( β 0 , ˉ Y ) = Cov ( ˉ Y - β 1 ˉ x , ˉ Y ) โดย bilinearity ของCovนี้อยู่Cov ( ˉ Y , ˉ Y ) - ˉ x Cov ( β 1 , ˉ Y )β^0y¯Cov(β^0,y¯)=Cov(y¯−β^1x¯,y¯)CovCov(y¯,y¯)−x¯Cov(β^1,y¯). เทอมแรกคือในขณะที่คำที่สองที่เราสร้างไว้ก่อนหน้านี้เป็นศูนย์ จากนี้เราอนุมานVar(y¯)=σ2un
Corr(β^0,y¯) = 11 + ( x¯/ RMSD( x ) )2----------------√
ดังนั้นความสัมพันธ์นี้ก็ขึ้นอยู่กับอัตราส่วน ) โปรดทราบว่าสี่เหลี่ยมของCorr( β 0, β 1)และCorr( β 0, ˉ Y )รวมถึงหนึ่ง: เราคาดว่าตั้งแต่ทุกรูปแบบการสุ่มตัวอย่าง (สำหรับการแก้ไขx) ใน β 0เป็นเพราะทั้งรูปแบบ ใน β 1หรือการเปลี่ยนแปลงใน ˉ Y , และแหล่งที่มาของการเปลี่ยนแปลงเหล่านี้จะ uncorrelated กับแต่ละอื่น ๆ นี่คือพล็อตของความสัมพันธ์กับอัตราส่วนx¯RMSD( x )Corr( β^0, β^1)Corr( β^0, y¯)xβ^0β^1Y¯ )x¯RMSD( x )
พล็อตที่แสดงให้เห็นอย่างชัดเจนว่าเมื่อสูงเมื่อเทียบกับ RMSDข้อผิดพลาดในการประมาณการตัดเป็นส่วนใหญ่เนื่องจากข้อผิดพลาดในการประมาณการความลาดชันและทั้งสองมีความสัมพันธ์อย่างใกล้ชิดขณะที่เมื่อˉ xอยู่ในระดับต่ำเมื่อเทียบกับ RMSDมันเป็นข้อผิดพลาด ในการประมาณค่าของthat yที่ครอบงำและความสัมพันธ์ระหว่างการสกัดกั้นและความลาดชันนั้นอ่อนแอ โปรดทราบว่าความสัมพันธ์ของการสกัดกั้นกับความชันเป็นฟังก์ชันแปลกของอัตราส่วนˉ xx¯x¯Y¯ดังนั้นเครื่องหมายขึ้นอยู่กับเครื่องหมายของ ˉ xและเป็นศูนย์ถ้า ˉ x =0ในขณะที่ความสัมพันธ์ของการสกัดกั้นกับ ˉ yนั้นเป็นค่าบวกเสมอและเป็นฟังก์ชั่นของอัตราส่วนนั่นคือมันไม่ได้ ว่าสิ่งที่ด้านข้างของYแกนที่ ˉ xมี ความสัมพันธ์มีความเท่าเทียมกันในขนาดถ้า ˉ xเป็นหนึ่ง RMSD ห่างจากYแกนเมื่อCorr( β 0, ˉ Y )=1x¯RMSD( x )x¯x¯= 0Y¯Yx¯x¯YและCorr(β0,β1)=±1Corr( β^0, y¯) = 12√≈ 0.707ที่ป้ายอยู่ฝั่งตรงข้ามของˉx ในตัวอย่างในการจำลองด้านบนˉx=10และRMSD(x)≈5.16ดังนั้นค่าเฉลี่ยอยู่ที่1.93RMSDs จากy-axis; ในอัตราส่วนนี้ความสัมพันธ์ระหว่างการสกัดกั้นและความลาดชันนั้นแข็งแกร่งขึ้น แต่ความสัมพันธ์ระหว่างการสกัดกั้นและˉyยังคงไม่สำคัญCorr( β^0, β^1) = ± 12√≈ ± 0.707x¯x¯= 10RMSD( x ) ≈ 5.161.93YY¯
นอกจากนี้ฉันชอบคิดสูตรสำหรับข้อผิดพลาดมาตรฐานของการสกัดกั้น
ส. e .( β^O L S0) = s2ยู( 1)n+ x¯2n MSD( x ))-----------------√
ในฐานะและเหมือนกันสำหรับสูตรสำหรับข้อผิดพลาดมาตรฐานของปีที่x=x0(ใช้สำหรับช่วงความเชื่อมั่นสำหรับการตอบสนองค่าเฉลี่ยและที่ตัดเป็นเพียงกรณีพิเศษตามที่ผมอธิบายก่อนหน้านี้ผ่านการแปล ข้อโต้แย้ง),ข้อผิดพลาดในการเลื่อน+ ข้อผิดพลาดการบิด-----------------------√Y^x = x0
ส. e .( y^) = s2ยู( 1)n+ ( x0- x¯)2n MSD( x ))-----------------√
รหัส R สำหรับแปลง
require(graphics)
require(grDevices)
require(animation
#This saves a GIF so you may want to change your working directory
#setwd("~/YOURDIRECTORY")
#animation package requires ImageMagick or GraphicsMagick on computer
#See: http://www.inside-r.org/packages/cran/animation/docs/im.convert
#You might only want to run up to the "STATIC PLOTS" section
#The static plot does not save a file, so need to change directory.
#Change as desired
simulations <- 100 #how many samples to draw and regress on
xvalues <- c(2,4,6,8,10,12,14,16,18) #used in all regressions
su <- 10 #standard deviation of error term
beta0 <- 5 #true intercept
beta1 <- 2 #true slope
plotAlpha <- 1/5 #transparency setting for charts
interceptPalette <- colorRampPalette(c(rgb(0,0,1,plotAlpha),
rgb(1,0,0,plotAlpha)), alpha = TRUE)(100) #intercept color range
animationFrames <- 20 #how many samples to include in animation
#Consequences of previous choices
n <- length(xvalues) #sample size
meanX <- mean(xvalues) #same for all regressions
msdX <- sum((xvalues - meanX)^2)/n #Mean Square Deviation
minX <- min(xvalues)
maxX <- max(xvalues)
animationFrames <- min(simulations, animationFrames)
#Theoretical properties of estimators
expectedMeanY <- beta0 + beta1 * meanX
sdMeanY <- su / sqrt(n) #standard deviation of mean of Y (i.e. Y hat at mean x)
sdSlope <- sqrt(su^2 / (n * msdX))
sdIntercept <- sqrt(su^2 * (1/n + meanX^2 / (n * msdX)))
data.df <- data.frame(regression = rep(1:simulations, each=n),
x = rep(xvalues, times = simulations))
data.df$y <- beta0 + beta1*data.df$x + rnorm(n*simulations, mean = 0, sd = su)
regressionOutput <- function(i){ #i is the index of the regression simulation
i.df <- data.df[data.df$regression == i,]
i.lm <- lm(y ~ x, i.df)
return(c(i, mean(i.df$y), coef(summary(i.lm))["x", "Estimate"],
coef(summary(i.lm))["(Intercept)", "Estimate"]))
}
estimates.df <- as.data.frame(t(sapply(1:simulations, regressionOutput)))
colnames(estimates.df) <- c("Regression", "MeanY", "Slope", "Intercept")
perc.rank <- function(x) ceiling(100*rank(x)/length(x))
rank.text <- function(x) ifelse(x < 50, paste("bottom", paste0(x, "%")),
paste("top", paste0(101 - x, "%")))
estimates.df$percMeanY <- perc.rank(estimates.df$MeanY)
estimates.df$percSlope <- perc.rank(estimates.df$Slope)
estimates.df$percIntercept <- perc.rank(estimates.df$Intercept)
estimates.df$percTextMeanY <- paste("Mean Y",
rank.text(estimates.df$percMeanY))
estimates.df$percTextSlope <- paste("Slope",
rank.text(estimates.df$percSlope))
estimates.df$percTextIntercept <- paste("Intercept",
rank.text(estimates.df$percIntercept))
#data frame of extreme points to size plot axes correctly
extremes.df <- data.frame(x = c(min(minX,0), max(maxX,0)),
y = c(min(beta0, min(data.df$y)), max(beta0, max(data.df$y))))
#STATIC PLOTS ONLY
par(mfrow=c(3,3))
#first draw empty plot to reasonable plot size
with(extremes.df, plot(x,y, type="n", main = "Estimated Mean Y"))
invisible(mapply(function(a,b,c) { abline(a, b, col=c) },
estimates.df$Intercept, beta1,
interceptPalette[estimates.df$percIntercept]))
with(extremes.df, plot(x,y, type="n", main = "Estimated Slope"))
invisible(mapply(function(a,b,c) { abline(a, b, col=c) },
expectedMeanY - estimates.df$Slope * meanX, estimates.df$Slope,
interceptPalette[estimates.df$percIntercept]))
with(extremes.df, plot(x,y, type="n", main = "Estimated Intercept"))
invisible(mapply(function(a,b,c) { abline(a, b, col=c) },
estimates.df$Intercept, estimates.df$Slope,
interceptPalette[estimates.df$percIntercept]))
with(estimates.df, hist(MeanY, freq=FALSE, main = "Histogram of Mean Y",
ylim=c(0, 1.3*dnorm(0, mean=0, sd=sdMeanY))))
curve(dnorm(x, mean=expectedMeanY, sd=sdMeanY), lwd=2, add=TRUE)
with(estimates.df, hist(Slope, freq=FALSE,
ylim=c(0, 1.3*dnorm(0, mean=0, sd=sdSlope))))
curve(dnorm(x, mean=beta1, sd=sdSlope), lwd=2, add=TRUE)
with(estimates.df, hist(Intercept, freq=FALSE,
ylim=c(0, 1.3*dnorm(0, mean=0, sd=sdIntercept))))
curve(dnorm(x, mean=beta0, sd=sdIntercept), lwd=2, add=TRUE)
with(estimates.df, plot(MeanY, Slope, pch = 16, col = rgb(0,0,0,plotAlpha),
main = "Scatter of Slope vs Mean Y"))
with(estimates.df, plot(Slope, Intercept, pch = 16, col = rgb(0,0,0,plotAlpha),
main = "Scatter of Intercept vs Slope"))
with(estimates.df, plot(Intercept, MeanY, pch = 16, col = rgb(0,0,0,plotAlpha),
main = "Scatter of Mean Y vs Intercept"))
#ANIMATED PLOTS
makeplot <- function(){for (i in 1:animationFrames) {
par(mfrow=c(4,3))
iMeanY <- estimates.df$MeanY[i]
iSlope <- estimates.df$Slope[i]
iIntercept <- estimates.df$Intercept[i]
with(extremes.df, plot(x,y, type="n", main = paste("Simulated dataset", i)))
with(data.df[data.df$regression==i,], points(x,y))
abline(beta0, beta1, lwd = 2)
abline(iIntercept, iSlope, lwd = 2, col="gold")
plot.new()
title(main = "Parameter Estimates")
text(x=0.5, y=c(0.9, 0.5, 0.1), labels = c(
paste("Mean Y =", round(iMeanY, digits = 2), "True =", expectedMeanY),
paste("Slope =", round(iSlope, digits = 2), "True =", beta1),
paste("Intercept =", round(iIntercept, digits = 2), "True =", beta0)))
plot.new()
title(main = "Percentile Ranks")
with(estimates.df, text(x=0.5, y=c(0.9, 0.5, 0.1),
labels = c(percTextMeanY[i], percTextSlope[i],
percTextIntercept[i])))
#first draw empty plot to reasonable plot size
with(extremes.df, plot(x,y, type="n", main = "Estimated Mean Y"))
invisible(mapply(function(a,b,c) { abline(a, b, col=c) },
estimates.df$Intercept, beta1,
interceptPalette[estimates.df$percIntercept]))
abline(iIntercept, beta1, lwd = 2, col="gold")
with(extremes.df, plot(x,y, type="n", main = "Estimated Slope"))
invisible(mapply(function(a,b,c) { abline(a, b, col=c) },
expectedMeanY - estimates.df$Slope * meanX, estimates.df$Slope,
interceptPalette[estimates.df$percIntercept]))
abline(expectedMeanY - iSlope * meanX, iSlope,
lwd = 2, col="gold")
with(extremes.df, plot(x,y, type="n", main = "Estimated Intercept"))
invisible(mapply(function(a,b,c) { abline(a, b, col=c) },
estimates.df$Intercept, estimates.df$Slope,
interceptPalette[estimates.df$percIntercept]))
abline(iIntercept, iSlope, lwd = 2, col="gold")
with(estimates.df, hist(MeanY, freq=FALSE, main = "Histogram of Mean Y",
ylim=c(0, 1.3*dnorm(0, mean=0, sd=sdMeanY))))
curve(dnorm(x, mean=expectedMeanY, sd=sdMeanY), lwd=2, add=TRUE)
lines(x=c(iMeanY, iMeanY),
y=c(0, dnorm(iMeanY, mean=expectedMeanY, sd=sdMeanY)),
lwd = 2, col = "gold")
with(estimates.df, hist(Slope, freq=FALSE,
ylim=c(0, 1.3*dnorm(0, mean=0, sd=sdSlope))))
curve(dnorm(x, mean=beta1, sd=sdSlope), lwd=2, add=TRUE)
lines(x=c(iSlope, iSlope), y=c(0, dnorm(iSlope, mean=beta1, sd=sdSlope)),
lwd = 2, col = "gold")
with(estimates.df, hist(Intercept, freq=FALSE,
ylim=c(0, 1.3*dnorm(0, mean=0, sd=sdIntercept))))
curve(dnorm(x, mean=beta0, sd=sdIntercept), lwd=2, add=TRUE)
lines(x=c(iIntercept, iIntercept),
y=c(0, dnorm(iIntercept, mean=beta0, sd=sdIntercept)),
lwd = 2, col = "gold")
with(estimates.df, plot(MeanY, Slope, pch = 16, col = rgb(0,0,0,plotAlpha),
main = "Scatter of Slope vs Mean Y"))
points(x = iMeanY, y = iSlope, pch = 16, col = "gold")
with(estimates.df, plot(Slope, Intercept, pch = 16, col = rgb(0,0,0,plotAlpha),
main = "Scatter of Intercept vs Slope"))
points(x = iSlope, y = iIntercept, pch = 16, col = "gold")
with(estimates.df, plot(Intercept, MeanY, pch = 16, col = rgb(0,0,0,plotAlpha),
main = "Scatter of Mean Y vs Intercept"))
points(x = iIntercept, y = iMeanY, pch = 16, col = "gold")
}}
saveGIF(makeplot(), interval = 4, ani.width = 500, ani.height = 600)
สำหรับพล็อตของความสัมพันธ์กับอัตราส่วนของถึง RMSD:x¯
require(ggplot2)
numberOfPoints <- 200
data.df <- data.frame(
ratio = rep(seq(from=-10, to=10, length=numberOfPoints), times=2),
between = rep(c("Slope", "MeanY"), each=numberOfPoints))
data.df$correlation <- with(data.df, ifelse(between=="Slope",
-ratio/sqrt(1+ratio^2),
1/sqrt(1+ratio^2)))
ggplot(data.df, aes(x=ratio, y=correlation, group=factor(between),
colour=factor(between))) +
theme_bw() +
geom_line(size=1.5) +
scale_colour_brewer(name="Correlation between", palette="Set1",
labels=list(expression(hat(beta[0])*" and "*bar(y)),
expression(hat(beta[0])*" and "*hat(beta[1])))) +
theme(legend.key = element_blank()) +
ggtitle(expression("Correlation of intercept estimates with slope and "*bar(y))) +
xlab(expression("Ratio of "*bar(X)/"RMSD(X)")) +
ylab(expression(paste("Correlation")))