【问题标题】:Similar function to R's logsum function (mlogit package) for Survival package与 R 的生存包的 logsum 函数(mlogit 包)类似的功能
【发布时间】:2021-08-17 19:00:21
【问题描述】:

我试图使用 R 的 survival 包(clogit 函数)为每个人获取预期的实用程序,但我找不到像 mlogit 的 logsum 这样的简单解决方案。

下面我设置了一个使用mlogit 包的示例。这非常简单:它只需要使用mlogit 函数对变量进行回归,保存输出并将其用作logsum 函数中的参数——如果需要,此vignette 中有一个简短的解释。我想知道clogit 的类似方法。我已经阅读了包装的manual,但我没有掌握执行分析的最合适的功能。

注意 1:我对 mlogit's 之类的函数的偏好与我以后可能需要执行大量回归以及能够在不同场景中执行正确估计的事实有关。

注意 2:我不打算让下面创建的数据集代表数据的行为方式。我只是为了在 logit 回归后执行函数而设置示例。

**

library(survival)
library(mlogit)

#creating a dataset

df_test=data.frame(id=rep(1:20,each=4),
                   choice=rep(c("train","car","plane","boat")),
                   distance=c(rnorm(80)*10),
                   )

f=function(x,y,z) {
    
  v=round(rnorm(x,y,z))
    
    while(sum(v)>1 | sum(v)==0) {
      
      v=round(rnorm(x,y,z))
      
    }
  
return(v)
    
}

result1=c()

for (i in 1:20) {
  
  result=f(4,0.5,0.1)
  
  result1=c(result,result1)
  
}

df_test$distance=ifelse(df_test$distance<0,df_test$distance*-1,df_test$distance)
df_test$price = 0
df_test$price[df_test$choice=="plane"] = rnorm(20, mean = 300, sd=30)
df_test$price[df_test$choice=="car"] = rnorm(20, mean = 50, sd=10)
df_test$price[df_test$choice=="boat"] = rnorm(20, mean = 100, sd=15)
df_test$price[df_test$choice=="train"] = rnorm(20, mean = 120, sd=25)

df_test$choice2=result1
           
mlog=mlogit(choice2 ~ distance + price , data = df_test)

#the function logsum generates expected utility for each individual

logsum(mlog)

#so what would be adequate alternative with survival's clogit? I set an exemple below of
#of what i would like to regress and then perform something like logsum()

clog=clogit(choice2 ~ distance + price + as.factor(choice), strata(id), data = df_test)

**

【问题讨论】:

    标签: r mlogit


    【解决方案1】:

    你提供的小插图说对数和计算如下:

    在我看来,这类似于用于构建“线性预测器”的计算。 lp 是t(coef(clog)) %*% Xhat。如果我的解释是正确的,那么它存储在clog-object 中:

     clog["linear.predictor"]
    

    所以你可以采取:

    log(sum( exp(clog[["linear.predictors"]]) ))
    [1] 4.286592
    

    如果您需要通过df_test$choice 将其隔离,那么(因为clog 的'linear.predictors' 元素的长度与df_test 的'choice' 列的长度相同)它只是: `

     tapply(clog$linear.predictors, df_test$choice, function(x){ 
                   log(sum( exp(x) ))})
     #--------------------------------------
        boat      car    plane    train 
    2.824502 3.506756 2.825004 1.734258 
    

    如果您需要通过id 聚合它,您可以这样做:

    tapply(clog$linear.predictors, df_test$id, function(x){ 
      log(sum( exp(x) ))})
    
           1        2        3        4        5        6        7        8        9 
    1.405896 1.506152 1.454507 1.539060 1.467082 1.428482 1.393582 1.521877 1.480670 
          10       11       12       13       14       15       16       17       18 
    1.466490 1.416338 1.500581 1.528075 1.488253 1.398405 1.445014 1.483623 1.404041 
          19       20 
    1.460672 1.452709 
    

    【讨论】:

    • 我认为你部分正确。但是我们需要将它索引到每个 id - 每个 'iv' 都有一个 'i'。
    • 好的。轻而易举。见上文。
    • 我将奖励您赏金,但您需要按每个 ID 对每个选项的值求和——索引 J 指的是选项,“i”指的是个人 ID。我的意思是您需要提供每个 ID 的“对数总和”。
    • 能否请您说明如何获得t(coef(clog)) %*% Xhat 中的线性预测变量?我无法通过估计的系数获得值。
    • 我认为您可能没有考虑计算的条件结构。
    猜你喜欢
    • 2018-03-30
    • 1970-01-01
    • 1970-01-01
    • 2020-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-13
    • 1970-01-01
    相关资源
    最近更新 更多