簡體   English   中英

將列名傳遞給函數內的問題

[英]Problem passing column name to sapply within a function

我需要為多個 logit 模型計算很多預測概率,並且我正在嘗試編寫一個函數來加快這個過程。 但是,我無法使我的功能正常工作。 問題似乎是下面代碼的“iv=x”部分。 我不確定如何在那里正確傳遞列名。

pp <- function(iv, model, df) {
  lev <- levels(df[[iv]])
  l.prob <- sapply(lev, FUN=function(x){
  mean(predict(model, type = "response", 
               newdata = mutate(df, iv = x)), na.rm=TRUE)
  })
  l.prob
}


test <- pp(iv="myvar", model=model1, df=mydf)
test

以下是一些示例數據,顯示該函數如何不工作:

set.seed(123123)
df=data.frame(y=sample(c(0,1), replace=TRUE, size=100), x1=as.factor(rep(c("value1", "value2"), 50)), x2=rnorm(100, mean=50, sd=10))


logit1 <- glm(y ~ x1+x2, data = df, family=binomial(link="logit"))
summary(logit1)


#what the predicted probabilities should be (0.4173400, 0.4625565)
lev <- levels(df$x1)
pp <- sapply(lev, FUN=function(x){
  mean(predict(logit1, type = "response", 
               newdata = mutate(df, x1 = x)), na.rm=TRUE)
})
pp

#now running function (produces probabilities 0.44 and 0.44)

pp <- function(iv, model, df) {
  lev <- levels(df[[iv]])
  l.prob <- sapply(lev, FUN=function(x){
    mean(predict(model, type = "response", 
                 newdata = mutate(df, iv = x)), na.rm=TRUE)
  })
  l.prob
}


test <- pp(iv="x1", model=logit1, df=df)
test

考慮在使用[[進行預測之前動態分配列並避免mutate (特別是如果它是dplyr使用的唯一方法並且可以為您節省library調用)。

pp <- function(iv, model, df) {
  lev <- levels(df[[iv]])
  l.prob <- sapply(lev, FUN=function(x){
        df[[iv]] <- x
        mean(predict(model, type = "response", newdata = df), na.rm=TRUE)
  })
}

另一種基本的 R 方法是添加具有臨時名稱的新列,然后使用動態參數重命名所有列。

  l.prob <- sapply(lev, FUN=function(x){
        mean(predict(model, type = "response", 
                     newdata = setNames(transform(df, tmp = x), c(colnames(df), iv)), 
             na.rm=TRUE)
  })

您只需要模仿原始pp的分配: x1 = x 現在您正嘗試在sapply使用iv ,但在sapply您的函數僅指x

進行此更新可使用test重現pp的結果:

library(dplyr)
set.seed(1L)

# hard-coded df$x1
lev <- levels(df$x1)
pp <- sapply(lev, FUN=function(x){
  mean(predict(logit1, type = "response", 
               newdata = mutate(df, x1 = x)), na.rm=TRUE)
})
pp
   value1    value2 
0.4799503 0.5400409 


# 'x1' passed in as :iv: arg
pp <- function(iv, model, df) {
  lev <- levels(df[[iv]])
  l.prob <- sapply(lev, FUN=function(x){
    mean(predict(model, type = "response", 
                 newdata = mutate(df, x1 = x)), na.rm=TRUE) 
  })
  l.prob
}

test <- pp(iv="x1", model=logit1, df=df)

test
   value1    value2 
0.4799503 0.5400409 

作為替代方案,您可以將x1引號直接傳遞給pp() ,並使用{{ }}卷曲符號)來評估df iv

pp <- function(iv, model, df) {
  lev <- levels(df %>% pull({{iv}})) # <-- use {{ }}
  l.prob <- sapply(lev, FUN=function(x){
    mean(predict(model, type = "response", 
                 newdata = mutate(df, x1 = x)), na.rm=TRUE)
  })
  l.prob
}


test <- pp(iv=x1, model=logit1, df=df) # <-- x1 has no quotes
test
   value1    value2 
0.4799503 0.5400409 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM