簡體   English   中英

如何在 R 中的用戶定義函數中擬合線性模型; 指定響應變量時錯誤的非數字參數?

[英]How can I fit a linear model inside a user defined function in R; error non-numeric argument when specifying response variable?

我試圖通過創建函數來完成 R 中的重復性任務來整理一些腳本。我重復完成的一項任務是將線性模型擬合到一組數據並根據該線性模型擬合創建預測。 我正在使用的數據是來自流的濃度和流量數據,流量始終是解釋變量,但響應變量會發生變化,因此我想將其作為函數輸入。 但是,我在運行函數時收到“數學函數的非數字參數”錯誤。 我嘗試了帶引號和不帶引號,因為lm()調用不需要引號,但這會導致類“找不到對象'myobject'”。 這是一個簡單的例子。

更新

flows <- seq(0,7,0.01) 
  dat <- tibble(flow=sample(flows,30),
                parameter1_conc=rnorm(30,15,4),
                parameter2_conc=rnorm(30,50,8))
  
  regr_func <- function(modeldata,parameter,pred_maxflow,pred_flowint) {
    mod <- lm(as.formula(paste('log(', parameter, ') ~ log(', flow, ')')), data=modeldata)
    
    newflow <- data.frame(flow = seq(0, pred_maxflow, pred_flowint))

    preds <<- predict(mod, newdata = newflow,
                       interval = 'prediction')
  }
regr_func(modeldata = dat,
          parameter = 'parameter1_conc',
          pred_maxflow = 20,
          pred_flowint = 0.001)

原始示例錯誤


flows <- seq(0,7,0.01) 
  dat <- tibble(flow=sample(flows,30),
                parameter1_conc=rnorm(30,15,4),
                parameter1_conc=rnorm(30,50,8))
  
  regr_func <- function(modeldata,parameter,pred_maxflow,pred_flowint) {
    mod <- lm(log(parameter)~log(flow), data = modeldata)
    
    newflow <- data.frame(flow = seq(0, maxflow, flowint))

    preds <<- predict(mod, newdata = newflow,
                       interval = 'prediction')
  }
regr_func(modeldata = dat,
          parameter = 'parameter1_conc',
          pred_maxflow = 20,
          pred_flowint = 0.001)

這里有3個問題。 主要的是lm公式中的log(parameter)不會被作為parameter傳入的變量替換。 這意味着lm實際上是在您的數據中尋找一個名為parameter的列,該列不存在。 您可以通過創建一個替換名稱的公式來解決此問題。雖然使用字符串執行此操作是最常用的方法,但使用substitute更有效且更安全。 這也允許您傳遞不帶引號的列名。

第二個問題是參數maxflowflowint可能應該是pred_maxflowpred_flowint以匹配您的函數參數。

第三,使用<<-運算符寫入調用框架中的變量是不好的做法。 R 用戶希望函數沒有這樣的副作用,並且知道將函數調用的輸出存儲到他們控制的變量中。 僅在極少數情況下才應在函數內完成此操作。

將所有這些放在一起,我們有:

regr_func <- function(modeldata, parameter, pred_maxflow, pred_flowint) {
    
    f <-  `[[<-`(x ~ log(flow), 2, substitute(log(parameter)))

    mod <- lm(f, data = modeldata)
    
    newflow <- data.frame(flow = seq(0, pred_maxflow, pred_flowint))

    predict(mod, newdata = newflow, interval = 'prediction')
  }

我們會這樣調用函數:

preds <- regr_func(modeldata = dat,
          parameter = parameter1_conc,
          pred_maxflow = 20,
          pred_flowint = 0.001)

導致:

head(preds)
#>        fit      lwr      upr
#> 1      Inf      NaN      NaN
#> 2 3.365491 2.188942 4.542041
#> 3 3.312636 2.219223 4.406049
#> 4 3.281717 2.236294 4.327140
#> 5 3.259780 2.248073 4.271488
#> 6 3.242765 2.256998 4.228531

reprex 包於 2022-06-03 創建 (v2.0.1)

暫無
暫無

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

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