插值产品属性
我有一组离散select任务的数据,其中包括两个具有三个属性(品牌,价格,性能)的select。 从这些数据中,我已经从后验分布中抽取了1000个抽签,然后我将用它来计算每个个人和每个抽签的效用和最终偏好份额。
价格和performance分别在离散水平(-2,0,2)和(-25,0.25)进行testing。 我需要能够在testing的属性级别之间插入实用程序。 现在我们假设一个线性插值是统计上合理的事情。 换句话说,如果我想testing价格低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)
为了提供我想要实现的内容而不插入属性级别,下面是我该怎么做。 请注意,品牌现在按其列参考来定义。 p1&p2是指产品定义,u1&u2是实用程序,s1,s2是该绘图的优先份额。
任何微调正确的方向将不胜感激。 我的真实案例有10个产品,每个产品有8个属性。 在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
一个有点非传统的方式来得到你想要的是build立一个全球排名的所有产品使用你的10K抽奖。
使用每个平局作为10个产品之间的二元比赛的来源,并总结这些比赛的结果。
这将为您提供10个产品的最终“排行榜”。 由此,您可以在所有消费者中获得相对的实用性,或者您可以根据每个产品的获胜数(以及可选的替代品在每个比赛中的“强度”)来分配绝对值。
当您想要testing具有不同属性configuration文件的新产品时,将其稀疏(st)表示法作为(加权的)其他样本产品的向量总和,然后您可以再次运行竞赛,组件属性向量。
这样做的好处是,模拟比赛是有效的,全球排名结合代表新产品作为现有数据的稀疏vector和允许对结果进行更多的思考和解释,这在您考虑战略打败竞争对手时非常有用产品属性。
要find新产品(y)的稀疏(描述性)表示,求解Ax = y,其中A是现有产品的matrix(行作为其属性向量),y是现有产品的贡献权重向量。 你想最小化y中的非零项。 查看Donoho DL关于快速同伦方法的文章(例如幂迭代)以快速求解l0-l1最小化以find稀疏表示。
当你有这个(或稀疏表示的加权平均值)时,你可以基于你现有的首选项设置的模型有效地推断你的新产品的性能。
稀疏性作为表示的优势在于,它使您可以有用地进行推理,而且,您拥有的function或产品越多越好,因为产品可能被他们稀疏表示的可能性越大。 所以你可以扩展到大matrix,并用一个快速的algorithm得到真正有用的结果。