วิธีการทดสอบสองตัวอย่างใน R โดยการใส่สถิติตัวอย่างมากกว่าข้อมูลดิบ


32

สมมติว่าเรามีสถิติที่ระบุด้านล่าง

gender mean sd n
f 1.666667 0.5773503 3
m 4.500000 0.5773503 4

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

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


2
บทความ Wikipedia นี้รวมถึงหน้าช่วยเหลือสำหรับฟังก์ชั่นการแจกแจงแบบ R ของ (ดูได้จาก?pt) - ดูเป็นพิเศษpt()- มีข้อมูลทั้งหมดที่คุณต้องทำด้วยตัวเอง และคุณจะได้เรียนรู้มากมายเกี่ยวกับสถิติและ R หากคุณทำเช่นนั้น
Josh O'Brien

2
มีคำตอบที่ดีอยู่แล้วและแน่นอนว่ามันง่ายมาก (และแนวปฏิบัติที่ดี) ในการเขียนฟังก์ชั่นสำหรับตัวคุณเอง อย่างไรก็ตามฉันจะเพิ่มที่คุณอาจจะดูtsum.testฟังก์ชั่นในแพคเกจBSDAซึ่งดำเนินการทดสอบ t (สองตัวอย่าง; เวลช์หรือความแปรปรวนเท่ากับและหนึ่งตัวอย่าง) จากข้อมูลสรุปที่คุณให้ มันใช้งานได้ดีเช่นการทดสอบ t ในวานิลลาอาร์ แต่ใช้ข้อมูลสรุป
Glen_b -Reinstate Monica

1
ตามจริงแล้วเมื่อฉันเรียนรู้ที่จะเขียนโปรแกรมครูของฉันมักจะพูดเสมอว่า "อย่าประดิษฐ์วงล้อใหม่" ดังนั้นฟังก์ชั่นตรรกะส่วนใหญ่จะมาtsum.test()จากที่BSDA libraryระบุไว้โดย @Nick Cox มันทำสิ่งเดียวกับที่ @macro เขียนในบรรทัดของรหัส หากคำถามที่ถามความเข้าใจของการคำนวณพื้นหลังสำหรับการคำนวณสถิติการทดสอบ t ใน R แล้วมาร์โกจะเป็นคำตอบที่เหมาะสมกว่า โปรดทราบว่าฉันไม่ได้พยายามที่จะรุกรานใครเพียงแค่แสดงความคิดเห็นส่วนตัวของฉันที่เกี่ยวข้องกับพื้นหลังมืออาชีพของฉัน และ @marco ที่เป็นบางส่วนเรียบร้อยเข้ารหัส :)
tcratius

คำตอบ:


37

คุณสามารถเขียนฟังก์ชั่นของคุณเองขึ้นอยู่กับสิ่งที่เรารู้เกี่ยวกับกลไกการทำงานของทั้งสองตัวอย่างt -test ตัวอย่างเช่นสิ่งนี้จะทำงาน:

# m1, m2: the sample means
# s1, s2: the sample standard deviations
# n1, n2: the same sizes
# m0: the null value for the difference in means to be tested for. Default is 0. 
# equal.variance: whether or not to assume equal variance. Default is FALSE. 
t.test2 <- function(m1,m2,s1,s2,n1,n2,m0=0,equal.variance=FALSE)
{
    if( equal.variance==FALSE ) 
    {
        se <- sqrt( (s1^2/n1) + (s2^2/n2) )
        # welch-satterthwaite df
        df <- ( (s1^2/n1 + s2^2/n2)^2 )/( (s1^2/n1)^2/(n1-1) + (s2^2/n2)^2/(n2-1) )
    } else
    {
        # pooled standard deviation, scaled by the sample sizes
        se <- sqrt( (1/n1 + 1/n2) * ((n1-1)*s1^2 + (n2-1)*s2^2)/(n1+n2-2) ) 
        df <- n1+n2-2
    }      
    t <- (m1-m2-m0)/se 
    dat <- c(m1-m2, se, t, 2*pt(-abs(t),df))    
    names(dat) <- c("Difference of means", "Std Error", "t", "p-value")
    return(dat) 
}
x1 = rnorm(100)
x2 = rnorm(200) 
# you'll find this output agrees with that of t.test when you input x1,x2
t.test2( mean(x1), mean(x2), sd(x1), sd(x2), 100, 200)
Difference of means       Std Error               t         p-value 
        -0.05692268      0.12192273     -0.46687500      0.64113442 

1
การแก้ไขของฉันเปรียบเทียบกับt.testถูกปฏิเสธดังนั้นนี่คือรหัสที่จะยืนยัน:(tt2 <- t.test2(mean(x1), mean(x2), sd(x1), sd(x2), length(x1), length(x2))); (tt <- t.test(x1, x2)); tt$statistic == tt2[["t"]]; tt$p.value == tt2[["p-value"]]
Max Ghenis

20

คุณเพียงแค่คำนวณด้วยมือ:

t=(meanfmeanm)expected differenceSE  SE=sdf2nf+sdm2nm  where,    df=nm+nf2

ความแตกต่างที่คาดหวังอาจเป็นศูนย์

หากคุณต้องการค่า p เพียงใช้pt()ฟังก์ชั่น:

pt(t, df)

ดังนั้นการวางรหัสเข้าด้วยกัน:

> p = pt((((1.666667 - 4.500000) - 0)/sqrt(0.5773503/3 + 0.5773503/4)), (3 + 4 - 2))
> p
[1] 0.002272053

สิ่งนี้ถือว่าผลต่างเท่ากันซึ่งเห็นได้ชัดเพราะพวกมันมีค่าเบี่ยงเบนมาตรฐานเดียวกัน


สองสิ่ง: "ใน" นี้เป็นRอย่างไร การกระจายตัวของสถิติการทดสอบคืออะไร (เช่นคุณจะทำอย่างไรจากสิ่งนี้ถึงค่า ) p
มาโคร

อิสรภาพการศึกษาระดับปริญญาที่ให้ไว้ในกรณีนี้ไม่ถูกต้อง! คุณใช้ความแปรปรวนที่ไม่รวมซึ่งถือว่าผลต่างไม่เท่ากัน ดังนั้นระดับของเสรีภาพมีความแม่นยำมากขึ้นโดยใช้ Scatterwaite Approxation
lzstat

7

คุณสามารถทำการคำนวณตามสูตรในหนังสือ (บนเว็บเพจ) หรือคุณสามารถสร้างข้อมูลแบบสุ่มที่มีคุณสมบัติที่ระบุไว้ (ดูmvrnormฟังก์ชันในMASSแพ็คเกจ) และใช้t.testฟังก์ชันปกติกับข้อมูลจำลอง


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

2
คุณต้องการให้ข้อมูลจำลองมีค่าเฉลี่ยและ var ที่เหมือนกันตามที่ระบุในปัญหา วิธีหนึ่งในการทำเช่นนี้ (มีอีกหลายอย่าง) คือการใช้mvrnormฟังก์ชันในMASSแพ็คเกจ (คุณต้องตั้งค่าอาร์กิวเมนต์เชิงประจักษ์เป็น TRUE)
เกร็กสโนว์

2

คำถามถามเกี่ยวกับ R แต่ปัญหาสามารถเกิดขึ้นได้กับซอฟต์แวร์ทางสถิติอื่น ๆ ตัวอย่างเช่น Stata มีคำสั่งทันทีที่เรียกว่าคำสั่งต่าง ๆ ซึ่งช่วยให้การคำนวณจากสถิติสรุปเพียงอย่างเดียว ดูhttp://www.stata.com/manuals13/rttest.pdfสำหรับกรณีเฉพาะของttestiคำสั่งซึ่งใช้ที่นี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.