लॉजिस्टिक रिग्रेशन पॉवर विश्लेषण का अनुकरण - डिज़ाइन किए गए प्रयोग


39

यह सवाल लॉजिस्टिक रिग्रेशन और एसएएस के साथ शक्ति विश्लेषण के संबंध में पूछे गए एक प्रश्न के संबंध में @ ग्रेग स्नो द्वारा दिए गए उत्तर के जवाब में है Proc GLMPOWER

यदि मैं एक प्रयोग डिजाइन कर रहा हूं और एक तथ्यात्मक लॉजिस्टिक रिग्रेशन में परिणामों का विश्लेषण करूंगा, तो मैं शक्ति विश्लेषण करने के लिए सिमुलेशन (और यहां ) का उपयोग कैसे कर सकता हूं ?

यहां एक सरल उदाहरण है जहां दो चर हैं, पहला तीन संभावित मानों पर लेता है {0.03, 0.06, 0.09} और दूसरा एक डमी संकेतक है {0,1}। प्रत्येक के लिए हम प्रत्येक संयोजन के लिए प्रतिक्रिया दर का अनुमान लगाते हैं (# उत्तरदाताओं की संख्या / विपणन किए गए लोगों की संख्या)। इसके अलावा, हम दूसरों के रूप में कारकों के पहले संयोजन के 3 गुना (जो समान माना जा सकता है) चाहते हैं, क्योंकि यह पहला संयोजन हमारा आजमाया हुआ और सच्चा संस्करण है। यह एक सेटअप है जो एसएएस पाठ्यक्रम में दिए गए लिंक से जुड़ा हुआ है।

यहाँ छवि विवरण दर्ज करें

परिणामों का विश्लेषण करने के लिए उपयोग किया जाने वाला मॉडल एक लॉजिस्टिक प्रतिगमन होगा, जिसमें मुख्य प्रभाव और इंटरैक्शन (प्रतिक्रिया 0 या 1 है)।

mod <- glm(response ~ Var1 + Var2 + I(Var1*Var2))

एक शक्ति विश्लेषण करने के लिए मैं इस मॉडल के साथ उपयोग करने के लिए सेट किए गए डेटा का अनुकरण कैसे कर सकता हूं?

जब मैं इसे एसएएस के माध्यम से चलाता हूं Proc GLMPOWER( STDDEV =0.05486016 जिसके उपयोग से पता चलता है sqrt(p(1-p))कि पी दिखाया प्रतिक्रिया दर का भारित औसत कहां है)

data exemplar;
  input Var1 $ Var2 $ response weight;
  datalines;
    3 0 0.0025  3
    3 1 0.00395 1
    6 0 0.003   1
    6 1 0.0042  1
    9 0 0.0035  1
    9 1 0.002   1;
run;

proc glmpower data=exemplar;
  weight weight;
  class Var1 Var2;
  model response = Var1 | Var2;
  power
    power=0.8
    ntotal=.
    stddev=0.05486016;
run;

नोट: GLMPOWERकेवल वर्ग (नाममात्र) चर का उपयोग करेंगे, इसलिए 3, 6, 9 से ऊपर वर्णों के रूप में माना जाता है और निम्न, मध्य और उच्च या किसी भी अन्य तीन तार हो सकते हैं। जब वास्तविक विश्लेषण किया जाता है, तो किसी भी वक्रता को ध्यान में रखते हुए, Var1 को एक संख्यात्मक (और हम एक बहुपद शब्द Var1 * Var1) शामिल करेंगे।

एसएएस से आउटपुट है

यहाँ छवि विवरण दर्ज करें

इसलिए हम देखते हैं कि हमें अपने नमूने के आकार के रूप में 762,112 की आवश्यकता है (0. अनुमान के बराबर शक्ति के साथ Var2 मुख्य प्रभाव 0.80 और अल्फा के बराबर शक्ति के साथ सबसे कठिन है)। हम इन्हें आवंटित करेंगे ताकि 3 बार आधारभूत संयोजन (यानी 0.375 * 762112) और शेष 5 अन्य संयोजनों में समान रूप से गिरे।


यह आर। 1 प्रश्न में करना आसान है: क्या मैं सही हूं कि आप सभी मामलों का 75% {var1 = .03, var2 = 0} और 25% अन्य सभी कॉम्बो के लिए चाहते हैं, और हर 1 के लिए 3 इकाइयां नहीं हैं। इकाई में से प्रत्येक में अन्य combos (यानी, 37.5%)? दूसरा सवाल, क्या आप उन प्रभावों को निर्दिष्ट कर सकते हैं जिन्हें आप पता लगाने में रुचि रखते हैं? यानी, 1 बनाम 0 का लॉग ऑड क्या होगा? यदि var1 .01 से ऊपर जाता है, तो लॉग ऑड ऑफ़ सक्सेस को कैसे बदलना चाहिए? क्या आपको लगता है कि कोई इंटरैक्शन हो सकता है (यदि हां, तो यह कितना बड़ा है)? (नायब, इन क्यू के जवाब देने के लिए कठिन हो सकता है, 1 रणनीति 1 के अनुपात आपको लगता है प्रत्येक कॉम्बो में हो सकता है निर्दिष्ट करने के लिए है।)
गुंग - को पुनः स्थापित मोनिका

पहला: बेसलाइन मामले के लिए 3 का वजन है कि कई मामलों में 3 बार है जहां {var1 = 0.03, var2 = 1}। तो एसएएस से परिणाम (जो कहता है कि हमें 762,112 कुल नमूना आकार की आवश्यकता है, मुख्य प्रभाव var2 = 0 को अस्वीकार करने की 80% शक्ति है, इसलिए कि हमें कुल नमूना आकार की आवश्यकता है) इस बेसलाइन मामले को 37.5% आवंटित किया जाएगा।
B_Miner

दूसरा: अच्छी तरह से हमारे पास सभी प्रतिक्रिया दरें हैं (जो कि परीक्षणों की संख्या के अनुसार सफलता की संख्या का अपेक्षित अनुपात है)। इसलिए, अगर हम Var1 = 0.03 और Var2 = 0 के साथ 1,000 पत्र भेजते हैं, जो कि क्रेडिट कार्ड प्रत्यक्ष मेल ऑफर 0.03 (3%) पर ब्याज दर के प्रस्ताव के अनुरूप हो सकता है और लिफाफे पर कोई स्टिकर नहीं है (जहां Var2 = 1 का अर्थ है एक स्टिकर), हम 1000 * 0.0025 प्रतिक्रियाओं की अपेक्षा करते हैं।
B_Miner

दूसरा कॉन्टेस्ट: हम इंटरेक्शन की उम्मीद करते हैं - इसलिए रिस्पांस रेट्स। ध्यान दें कि Var1 के मूल्य के आधार पर Var2 = 0 के लिए एक अलग प्रतिक्रिया दर है। मुझे यकीन नहीं है कि ऑड्स लॉग करने के लिए इनका अनुवाद कैसे किया जाए और फिर एक नकली डेटा सेट।
B_Miner

एक आखिरी बात, यद्यपि। मुझे लगता है कि जब var2 = 0 (यानी, .25%, .30%, .35%) के लिए प्रतिक्रिया दर रैखिक होती है। क्या आपने इसके लिए एक रैखिक प्रभाव या वक्रता का इरादा किया था? आपको पता होना चाहिए कि संभावनाएं उनकी सीमा के छोटे सबसेट के लिए काफी रैखिक दिख सकती हैं, लेकिन वास्तव में रैखिक नहीं हो सकती हैं। रसद प्रतिगमन लॉग बाधाओं में रेखीय है, नहीं संभावना (मुझे लगता है कि जैसे सामान मेरा उत्तर में चर्चा यहाँ )।
गंग -

जवाबों:


43

प्रारंभिक:

  • NESα

    • Nα=.05
    • N
  • @ ग्रेग्वेन के उत्कृष्ट पोस्ट के अलावा , सीवी पर सिमुलेशन-आधारित पावर विश्लेषणों के लिए एक और बहुत अच्छा मार्गदर्शक यहां पाया जा सकता है: भौगोलिक शक्ति की गणना । मूल विचारों को संक्षेप में प्रस्तुत करने के लिए:

    1. उस प्रभाव का पता लगाएं, जिसका आप पता लगाना चाहते हैं
    2. उस संभव दुनिया से एन डेटा उत्पन्न करते हैं
    3. विश्लेषण आप उन अशुद्ध डेटा पर आचरण करने का इरादा चलाते हैं
    4. स्टोर करें कि क्या परिणाम आपके चुने हुए अल्फा के अनुसार 'महत्वपूर्ण' हैं
    5. BN
    6. एक प्राथमिकता-प्राथमिक शक्ति का निर्धारण संभव पर खोज करेंN
  • ppBpB

  • आर में, 'सफलता' की दी गई संभावना के साथ द्विआधारी डेटा उत्पन्न करने का प्राथमिक तरीका है ? Rbinom

    • उदाहरण के लिए 10 बर्नौली परीक्षणों में से प्रायिकता p के साथ सफलताओं की संख्या प्राप्त करने के लिए, कोड होगा rbinom(n=10, size=1, prob=p), (आप शायद भंडारण के लिए एक चर को परिणाम असाइन करना चाहते हैं)
    • आप इस तरह के डेटा का उपयोग कम सुरुचिपूर्ण ढंग से भी कर सकते हैं; रनिफ़ , जैसे;ifelse(runif(1)<=p, 1, 0)
    • यदि आप मानते हैं कि परिणाम एक अव्यक्त गाऊसी चर द्वारा मध्यस्थ हैं, तो आप अपने covariates के एक समारोह के रूप में अव्यक्त चर उत्पन्न कर सकते हैं ? rnorm , और फिर उन्हें संभावनाओं में परिवर्तित करके pnorm()और अपने rbinom()कोड में उन का उपयोग करें ।
  • var12var1var2var12var2

  • यद्यपि एक अलग प्रश्न के संदर्भ में लिखा गया है, मेरा जवाब यहां: लॉगिट और प्रोबेट मॉडल के बीच अंतर इस प्रकार के मॉडल के बारे में बहुत सारी बुनियादी जानकारी है।
  • जैसे कई प्रकार की परिकल्पनाएँ (जैसे, प्रति-विपरीत त्रुटि दर , परिवार की त्रुटि दर , और प्रति-परिवार त्रुटि दर ) होने पर विभिन्न प्रकार की टाइप I त्रुटि दरें होती हैं , उसी प्रकार विभिन्न प्रकार की शक्ति * (जैसे, एक के लिए) हैं एकल पूर्व-निर्दिष्ट प्रभाव , किसी भी प्रभाव के लिए , और सभी प्रभावों के लिए )। आप प्रभावों के एक विशिष्ट संयोजन का पता लगाने के लिए या संपूर्ण रूप से मॉडल के एक साथ परीक्षण की शक्ति के लिए भी खोज सकते हैं। आपके एसएएस कोड के विवरण से मेरा अनुमान है कि यह बाद की तलाश में है। हालाँकि, आपकी स्थिति के विवरण से, मैं मान रहा हूँ कि आप एक न्यूनतम पर बातचीत प्रभाव का पता लगाना चाहते हैं।

  • बिजली से संबंधित मुद्दों के बारे में सोचने के एक अलग तरीके के लिए, मेरा जवाब यहां देखें: नमूना आकार को सही ठहराने के संदर्भ में सहसंबंधों का आकलन करने में सामान्य सटीकता की रिपोर्ट कैसे करें।

आर में लॉजिस्टिक प्रतिगमन के लिए सरल पोस्ट-हॉक पावर:

मान लीजिए कि आपकी सकारात्मक प्रतिक्रिया दरें दुनिया में सही स्थिति का प्रतिनिधित्व करती हैं, और आपने 10,000 पत्र भेजे थे। उन प्रभावों का पता लगाने की शक्ति क्या है? (ध्यान दें कि मैं "हास्य रूप से अक्षम" कोड लिखने के लिए प्रसिद्ध हूं, निम्नलिखित का उद्देश्य दक्षता के लिए अनुकूलित करने के बजाय अनुसरण करना आसान है, वास्तव में, यह काफी धीमा है।)

set.seed(1)

repetitions = 1000
N = 10000
n = N/8
var1  = c(   .03,    .03,    .03,    .03,    .06,    .06,    .09,   .09)
var2  = c(     0,      0,      0,      1,      0,      1,      0,     1)
rates = c(0.0025, 0.0025, 0.0025, 0.00395, 0.003, 0.0042, 0.0035, 0.002)

var1    = rep(var1, times=n)
var2    = rep(var2, times=n)
var12   = var1**2
var1x2  = var1 *var2
var12x2 = var12*var2

significant = matrix(nrow=repetitions, ncol=7)

startT = proc.time()[3]
for(i in 1:repetitions){
  responses          = rbinom(n=N, size=1, prob=rates)
  model              = glm(responses~var1+var2+var12+var1x2+var12x2, 
                           family=binomial(link="logit"))
  significant[i,1:5] = (summary(model)$coefficients[2:6,4]<.05)
  significant[i,6]   = sum(significant[i,1:5])
  modelDev           = model$null.deviance-model$deviance
  significant[i,7]   = (1-pchisq(modelDev, 5))<.05
}
endT = proc.time()[3]
endT-startT

sum(significant[,1])/repetitions      # pre-specified effect power for var1
[1] 0.042
sum(significant[,2])/repetitions      # pre-specified effect power for var2
[1] 0.017
sum(significant[,3])/repetitions      # pre-specified effect power for var12
[1] 0.035
sum(significant[,4])/repetitions      # pre-specified effect power for var1X2
[1] 0.019
sum(significant[,5])/repetitions      # pre-specified effect power for var12X2
[1] 0.022
sum(significant[,7])/repetitions      # power for likelihood ratio test of model
[1] 0.168
sum(significant[,6]==5)/repetitions   # all effects power
[1] 0.001
sum(significant[,6]>0)/repetitions    # any effect power
[1] 0.065
sum(significant[,4]&significant[,5])/repetitions   # power for interaction terms
[1] 0.017

इसलिए हम देखते हैं कि इन प्रतिक्रिया दरों का पता लगाने के लिए 10,000 अक्षर वास्तव में 80% शक्ति (किसी भी प्रकार) प्राप्त नहीं करते हैं। (मैं पर्याप्त रूप से इस बारे में निश्चित नहीं हूं कि एसएएस कोड इन दृष्टिकोणों के बीच स्टार्क विसंगति को समझाने में सक्षम होने के लिए क्या कर रहा है, लेकिन यह कोड वैचारिक रूप से सीधा है - अगर धीमा है - और मैंने इसे जांचने में कुछ समय बिताया है, और मुझे लगता है कि ये परिणाम उचित हैं।)

लॉजिस्टिक प्रतिगमन के लिए सिमुलेशन-आधारित-प्राथमिक शक्ति:

NNNN

NN

sum(significant[,1])/repetitions      # pre-specified effect power for var1
[1] 0.115
sum(significant[,2])/repetitions      # pre-specified effect power for var2
[1] 0.091
sum(significant[,3])/repetitions      # pre-specified effect power for var12
[1] 0.059
sum(significant[,4])/repetitions      # pre-specified effect power for var1X2
[1] 0.606
sum(significant[,5])/repetitions      # pre-specified effect power for var12X2
[1] 0.913
sum(significant[,7])/repetitions      # power for likelihood ratio test of model
[1] 1
sum(significant[,6]==5)/repetitions   # all effects power
[1] 0.005
sum(significant[,6]>0)/repetitions    # any effect power
[1] 0.96
sum(significant[,4]&significant[,5])/repetitions   # power for interaction terms
[1] 0.606

var12significant

N


गंग - इस तरह के एक विस्तृत और विचारशील जवाब के लिए धन्यवाद! मेरे खुद के लिखने और अपने कोड के साथ खेलने में, द्विघात नियम इस मुद्दे के रूप में दिखाई देते हैं - जैसा कि मॉडल में विचार किए बिना कम से कम 80% शक्ति बहुत छोटे नमूना आकार के साथ हासिल की जाती है।
B_Miner सेप

1
यह बढ़िया है, @B_Miner, आप जिस तरह की चीज़ करना चाहते हैं। इसके अलावा, यह कारण है कि मुझे लगता है कि सिमुलेशन-आधारित दृष्टिकोण विश्लेषणात्मक सॉफ्टवेयर से बेहतर है जो बस एक नंबर से बाहर निकलता है (आर में यह भी है, pwrपैकेज)। यह दृष्टिकोण आपको अधिक स्पष्ट रूप से सोचने (और / या अपनी सोच को परिष्कृत करने) का अवसर देता है कि आप क्या होने की उम्मीद करते हैं, आप w / से कैसे निपटेंगे, आदि NB हालांकि, कि आपको द्विघात शब्दों की आवश्यकता है, या कुछ और सादृश्य, यदि आपकी प्रस्तुत दरें सही हैं, तो b / c वे रैखिक नहीं हैं, और अकेले बातचीत आपको वक्रतापूर्ण संबंधों को पकड़ने नहीं देती है।
गंग -

मुझे लगता है कि आपको polyकच्चे मानों को चुकाने की अधिक त्रुटि वाली रणनीति आर के नए उपयोगकर्ताओं को दिखाने के बजाय उपयोग का प्रदर्शन करना चाहिए । मुझे लगता है कि पूर्ण मॉडल के रूप में पेश किया जाना चाहिए था glm(responses~ poly(var1, 2) * var2, family=binomial(link="logit")। यह व्याख्या में सांख्यिकीय त्रुटि के लिए कम प्रवण और अधिक कॉम्पैक्ट होगा। इस सटीक उदाहरण में महत्वपूर्ण नहीं हो सकता है जब आप केवल एक समग्र फिट देख रहे हैं, लेकिन आसानी से कम परिष्कृत उपयोगकर्ताओं को गुमराह कर सकते हैं जिन्हें व्यक्तिगत रूप से देखने के लिए लुभाया जा सकता है।
डीडविन

@ जब मैं सीवी पर यहां चीजों को चित्रित करने के लिए आर का उपयोग करता हूं, तो मैं इसे बहुत गैर-आर तरीके से करता हूं। यह विचार उन लोगों के लिए जितना संभव हो उतना पारदर्शी होना चाहिए, जो परिचित डब्ल्यू / आर। जैसे नहीं हैं, मैं वेक्टर की संभावनाओं का उपयोग नहीं कर रहा हूं, छोरों का उपयोग कर रहा हूं =, आदि। लोग एक मूल प्रतिगमन से स्क्वेअर चर के साथ अधिक परिचित होंगे वर्ग, और poly()यदि वे आर उपयोगकर्ता नहीं हैं, तो कम जानकारी है ।
गुंग - को पुनः स्थापित मोनिका

17

@ गंग का जवाब समझने के लिए बहुत अच्छा है। यहाँ दृष्टिकोण है कि मैं का उपयोग करेगा:

mydat <- data.frame( v1 = rep( c(3,6,9), each=2 ),
    v2 = rep( 0:1, 3 ), 
    resp=c(0.0025, 0.00395, 0.003, 0.0042, 0.0035, 0.002) )

fit0 <- glm( resp ~ poly(v1, 2, raw=TRUE)*v2, data=mydat,
    weight=rep(100000,6), family=binomial)
b0 <- coef(fit0)


simfunc <- function( beta=b0, n=10000 ) {
    w <- sample(1:6, n, replace=TRUE, prob=c(3, rep(1,5)))
    mydat2 <- mydat[w, 1:2]
    eta <- with(mydat2,  cbind( 1, v1, 
                v1^2, v2,
                v1*v2,
                v1^2*v2 ) %*% beta )
    p <- exp(eta)/(1+exp(eta))
    mydat2$resp <- rbinom(n, 1, p)

    fit1 <- glm( resp ~ poly(v1, 2)*v2, data=mydat2,
        family=binomial)
    fit2 <- update(fit1, .~ poly(v1,2) )
    anova(fit1,fit2, test='Chisq')[2,5]
}

out <- replicate(100, simfunc(b0, 10000))
mean( out <= 0.05 )
hist(out)
abline(v=0.05, col='lightgrey')

यह फ़ंक्शन v2 के समग्र प्रभाव का परीक्षण करता है, अन्य प्रकार के परीक्षणों को देखने के लिए मॉडल को बदला जा सकता है। मैं इसे एक फ़ंक्शन के रूप में लिखना पसंद करता हूं ताकि जब मैं कुछ अलग परीक्षण करना चाहता हूं तो मैं फ़ंक्शन तर्क को बदल सकता हूं। आप एक प्रगति पट्टी भी जोड़ सकते हैं, या चीजों को गति देने के लिए समानांतर पैकेज का उपयोग कर सकते हैं।

यहाँ मैंने सिर्फ 100 प्रतिकृति की है, मैं आमतौर पर उस स्तर के आस-पास शुरू करता हूं ताकि अनुमानित नमूना आकार मिल सके, तब पुनरावृत्तियों को उठाएं जब मैं सही बॉल पार्क में हूं (जब आपके पास 20% शक्ति है तो 10,000 पुनरावृत्तियों पर समय बर्बाद करने की आवश्यकता नहीं है)।


धन्यवाद ग्रेग! मैं इसी दृष्टिकोण के बारे में सोच रहा था (यदि मैं सही तरीके से समझ रहा हूं कि आपने क्या किया था)। पुष्टि करने के लिए: क्या आप एक डेटा सेट बना रहे हैं (प्रभाव में, लेकिन यह क्रूरता के बजाय भार के साथ कर रहे हैं Var1 और Var2 के मानों के व्यक्तिगत रिकॉर्ड बनाते हैं और फिर 1 की और 0 की प्रतिक्रिया के लिए) जो "mydat" पर आधारित है। , एक लॉजिस्टिक रिग्रेशन को फिट करना और फिर सिमुलेशन में प्रस्तावित मॉडल से नमूना लेने के लिए उन गुणांकों का उपयोग करना? ऐसा लगता है कि यह गुणांक के साथ आने के लिए एक सामान्य तरीका है - फिर इसके ठीक उसी तरह जैसे आपकी प्रतिक्रिया के बारे में मेरी ओर से आद्य शक्ति के बारे में आपकी प्रतिक्रिया।
B_Miner

प्रारंभिक मॉडल वजन का उपयोग करने के लिए गुणांक प्राप्त करने के लिए उपयोग करता है, लेकिन सिमुलेशन में यह nपंक्तियों के साथ एक डेटा फ्रेम बना रहा है । यह फ़ंक्शन के रूप में अच्छी तरह से वज़न करने के लिए अधिक कुशल हो सकता है।
ग्रेग स्नो

मैं सही हूं कि आप शुरू में उपयोग किए गए गुणांक प्राप्त करने के उद्देश्य से डेटा का उपयोग शुरू में कर रहे हैं (बहुत अच्छा अनुमान लगाने के लिए इसे बड़ा बना रहे हैं)?
B_Miner

हां, अच्छी तरह से बड़ा है ताकि वजन कई बार एक पूर्णांक देता है।
ग्रेग स्नो

2
@B_Miner, मैं एक लेख पर योजना बना रहा हूं, मुझे नहीं पता कि पूरी किताब के लिए पर्याप्त है या नहीं। लेकिन प्रोत्साहन के लिए धन्यवाद।
ग्रेग स्नो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.