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