2011-10-26 19 views
58

मेरे पास discrete choice tasks के सेट से डेटा का एक सेट है जिसमें तीन विशेषताओं (ब्रांड, मूल्य, प्रदर्शन) के साथ दो विकल्प शामिल हैं। इस डेटा से, मैंने बाद के वितरण से 1000 ड्रॉ लिया है जिसका उपयोग मैं उपयोगिता की गणना करने के लिए और अंततः प्रत्येक व्यक्ति और प्रत्येक ड्रॉ के लिए वरीयता शेयर की गणना करने के लिए करता हूं।इंटरपोलेट उत्पाद विशेषताओं

मूल्य और प्रदर्शन क्रमशः अलग स्तर (-.2, 0, .2) और (-.25, 0, .25) पर परीक्षण किया गया था। मुझे परीक्षण स्तर के परीक्षण के बीच उपयोगिता को अलग करने में सक्षम होना चाहिए। आइए अब मान लें कि एक रैखिक इंटरपोलेशन सांख्यिकीय रूप से करने के लिए एक उचित बात है। दूसरे शब्दों में, अगर मैं एक परिदृश्य का परीक्षण @ 10% कम के साथ परीक्षण करना चाहता हूं तो कीमत के लिए उपयोगिता को पार करने का सबसे प्रभावी तरीका क्या है? मैं इंटरपोलेशन करने के लिए एक चिकना या कुशल तरीका सोचने में सक्षम नहीं हूं। मैं plyr से mdply समारोह के साथ एक mapply() दृष्टिकोण का सहारा लिया गया है

यहाँ कुछ डेटा है और मेरे वर्तमान दृष्टिकोण:

library(plyr) 
#draws from posterior, 2 respondents, 2 draws each 
draw <- list(structure(c(-2.403, -2.295, 3.198, 1.378, 0.159, 1.531, 
1.567, -1.716, -4.244, 0.819, -1.121, -0.622, 1.519, 1.731, -1.779, 
2.84), .Dim = c(2L, 8L), .Dimnames = list(NULL, c("brand_1", 
"brand_2", "price_1", "price_2", "price_3", "perf_1", "perf_2", 
"perf_3"))), structure(c(-4.794, -2.147, -1.912, 0.241, 0.084, 
0.31, 0.093, -0.249, 0.054, -0.042, 0.248, -0.737, -1.775, 1.803, 
0.73, -0.505), .Dim = c(2L, 8L), .Dimnames = list(NULL, c("brand_1", 
"brand_2", "price_1", "price_2", "price_3", "perf_1", "perf_2", 
"perf_3")))) 

#define attributes for each brand: brand constant, price, performance 
b1 <- c(1, .15, .25) 
b2 <- c(2, .1, .2) 

#Create data.frame out of attribute lists. Wil use mdply to go through each 
interpolateCombos <- data.frame(xout = c(b1,b2), 
           atts = rep(c("Brand", "Price", "Performance"), 2), 
           i = rep(1:2, each = 3), 
           stringsAsFactors = FALSE) 

#Find point along line. Tried approx(), but too slow 

findInt <- function(x1,x2,y1,y2,reqx) { 
    range <- x2 - x1 
    diff <- reqx - x1 
    out <- y1 + ((y2 - y1)/range) * diff 
    return(out) 
} 


calcInterpolate <- function(xout, atts, i){ 
    if (atts == "Brand") { 
    breaks <- 1:2 
    cols <- 1:2 
    } else if (atts == "Price"){ 
    breaks <- c(-.2, 0, .2) 
    cols <- 3:5 
    } else { 
    breaks <- c(-.25, 0, .25) 
    cols <- 6:8 
    } 

    utils <- draw[[i]][, cols] 

    if (atts == "Brand" | xout %in% breaks){ #Brand can't be interpolated or if level matches a break 
    out <- data.frame(out = utils[, match(xout, breaks)]) 
    } else{ #Must interpolate  
    mi <- min(which(breaks <= xout)) 
    ma <- max(which(breaks >= xout)) 
    out <- data.frame(out = findInt(breaks[mi], breaks[ma], utils[, mi], utils[,ma], xout)) 
    } 
    out$draw <- 1:nrow(utils) 
    return(out) 
} 
out <- mdply(interpolateCombos, calcInterpolate) 

मैं क्या विशेषता स्तरों interpolating के बिना पूरा करने के लिए कोशिश कर रहा हूँ पर संदर्भ प्रदान करने के लिए , यहां मैं यह कैसे करूंगा। ध्यान दें कि ब्रांड अब उनके कॉलम संदर्भ के संदर्भ में परिभाषित किए गए हैं। पी 1 & पी 2 उत्पाद परिभाषा का संदर्भ लें, u1 & u2 उपयोगिता है, और एस 1, एस 2 उस ड्रॉ के लिए वरीयता शेयर हैं।

सही दिशा में किसी भी झुकाव की सराहना की जाएगी। मेरे असली मामले में 10 उत्पाद प्रत्येक के साथ 10 उत्पाद हैं। 10k ड्रॉ पर, मेरा 8 जीबी रैम बाहर निकल रहा है, लेकिन मैं इस खरगोश के छेद से बाहर नहीं निकल सकता हूं जिसे मैंने खुद खोला है।

p1 <- c(1,2,1) 
p2 <- c(2,1,2) 


FUN <- function(x, p1, p2) { 
    bases <- c(0,2,5) 

    u1 <- rowSums(x[, bases + p1]) 
    u2 <- rowSums(x[, bases + p2]) 
    sumExp <- exp(u1) + exp(u2) 
    s1 <- exp(u1)/sumExp 
    s2 <- exp(u2)/sumExp 
    return(cbind(s1,s2)) 
} 
lapply(draw, FUN, p1 = p1, p2 = p2) 

[[1]] 
       s1  s2 
[1,] 0.00107646039 0.9989235 
[2,] 0.00009391749 0.9999061 

[[2]] 
       s1  s2 
[1,] 0.299432858 0.7005671 
[2,] 0.004123175 0.9958768 
+2

आप क्या सुधार करना चाहते हैं? स्पीड? याद? सांख्यिकीय अभिसरण? (उपर्युक्त सभी? :)) मैं आपके कोड को गड़बड़ कर सकता हूं, लेकिन मैं उस सांख्यिकीय समस्या को समझ नहीं पा रहा हूं जिसे आप हल करने का प्रयास कर रहे हैं। मुझे हास्य: यह सामान्य रूप से साधारण वर्गों के प्रतिशोध क्यों नहीं होगा? 'एलएम()' स्पष्ट कारकों के साथ ठीक है, और (जब तक कि मैं गलत नहीं हूं) आदेशित कारक भी। – Iterator

+0

@ इटरेटर - मैं कृपया 500 के लिए विकल्प 3 ले जाऊंगा! जिन मुख्य मुद्दों में मैं दौड़ रहा हूं वे दोनों गति और स्मृति आधारित हैं। सांख्यिकीय समस्या, अगर मैं इसे भी वर्गीकृत करना चाहता हूं, तो बस लगभग 0.5 एम पंक्तियों वाले मैट्रिक्स के लिए 80+ विशेषताओं के लिए रैखिक इंटरपोलेशन करने की आवश्यकता है। मैंने जो दो आसान परिवर्तन किए हैं, वे काफी महत्वपूर्ण साबित हुए हैं। अर्थात्: 1) 'mdply()' से 'mapply()' पर जा रहा है। 2) सभी डेटा.फ्रेम को matrices में बदलना। मुझे अभी भी आश्वस्त नहीं है कि पूरा दृष्टिकोण उतना ही कुशल कम्प्यूटेशनल रूप में हो सकता है जितना हो सकता है, लेकिन यह अभी के लिए पर्याप्त है। जब मैं एक स्टॉपिंग प्वाइंट – Chase

+0

पर जाता हूं तो मैं पोस्टरिटी के लिए अपने स्वयं के प्रश्न को अपडेट/उत्तर दूंगा। मैं आपको संबंधित काम (उचित नाम और सभी के साथ) की उचित मात्रा में इकट्ठा करता हूं, इसलिए यदि ब्याज की बात है तो अधिक जानकारी में ऑफ़लाइन बात कर सकते हैं! – Chase

उत्तर

3

आपके 10k ड्रॉ का उपयोग करके अपने सभी उत्पादों की वैश्विक रैंकिंग बनाने के लिए कुछ हद तक अपरंपरागत तरीका है।

प्रत्येक ड्रॉ का उपयोग 10 उत्पादों के बीच बाइनरी प्रतियोगिताओं के स्रोत के रूप में करें, और सभी ड्रॉओं पर इन प्रतियोगिताओं के परिणामों को पूरा करें।

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

जब आप एक अलग उत्पाद प्रोफ़ाइल के साथ एक नए उत्पाद का परीक्षण करना चाहते हैं तो अपने नमूना (सेंट) प्रतिनिधित्व को अन्य नमूना उत्पादों के वेक्टर योग (भारित) के रूप में ढूंढें, और आप प्रतिस्पर्धा को फिर से जीतने की जीत संभावनाओं के साथ चला सकते हैं घटक विशेषता वैक्टर के योगदान वजन।

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

अपने नए उत्पाद (वाई) के एक स्पैस (वर्णनात्मक) प्रतिनिधित्व को खोजने के लिए एक्स = वाई हल करें जहां ए मौजूदा उत्पादों (पंक्तियों को उनके गुण वैक्टर के रूप में) का मैट्रिक्स है, और वाई आपके योगदान से वजन का एक वेक्टर है मौजूदा उत्पाद। आप y में गैर-शून्य प्रविष्टियों को कम करना चाहते हैं। स्पैस प्रस्तुतियों को खोजने के लिए जल्दी से l0-l1 minimization को हल करने के लिए तेज़ होमोटॉपी विधि (जैसे बिजली पुनरावृत्ति) पर डोनोहो डीएल आलेख देखें।

जब आपके पास यह (या स्पैस प्रस्तुतियों का भारित औसत) होता है तो आप अपने मौजूदा प्राथमिकता ड्रॉ द्वारा सेट किए गए मॉडल के आधार पर अपने नए उत्पाद के प्रदर्शन के बारे में उपयोगी रूप से कारण बता सकते हैं।

एक प्रतिनिधित्व के रूप में स्पर्सनेस का लाभ यह है कि यह आपको उपयोगी रूप से, और अधिक सुविधाओं या उत्पाद के लिए बेहतर कारण बताता है, क्योंकि अधिक संभावना है कि उत्पाद उनके द्वारा कम प्रतिनिधित्व किया जा सकता है। तो आप बड़े matrices के लिए स्केल कर सकते हैं और एक त्वरित एल्गोरिदम के साथ वास्तव में उपयोगी परिणाम प्राप्त कर सकते हैं।

संबंधित मुद्दे