簡體   English   中英

通過XRJulia將公式從R傳遞到Julia

[英]Passing formulas from R to Julia via XRJulia

我正在嘗試通過XRJulia使用R中的Julia來擬合一些回歸模型。 我想將R數據和公式對象傳遞給Julia。 這是我到目前為止的位置:

library(XRJulia)
findJulia(test=T) # Works fine
juliaEval("using MixedModels")

jlmerj<-juliaEval("
 function(f,d)
   m=fit(LinearMixedModel,f,d)
   return(m)
 end
 ")
jlmer=JuliaFunction(jlmerj)

jdata<-juliaSend(data[,c('IRI_EC','learnid')])
jfrm<-juliaEval("@formula(IRI_EC ~  1 + (1|learnid))")

此時,jdata和jfrm似乎是Julia代理對象:

> jdata
Julia proxy object
Server Class: Dict{String,Any}; size: 7
> jfrm
Julia proxy object
Server Class: StatsModels.Formula; size: NA

但是這個調用失敗了(模糊地):

res<-jlmer(jfrm,jdata)
Error: Evaluating Julia expression: R_1_7(R_1_9, R_1_29)

(R_1_7等是juliaName(jlmerj),juliaName(jfrm),juliaName(jdata)返回的函數的名稱)。 相同的模型語法在JuliaCall中可以正常工作(我試圖轉換為XRJulia,因為JuliaCall似乎只打印出擬合結果,而沒有返回我可以有用地轉換回R對象的任何內容)。

其他juliaEvals等功能也可以使用,但使用公式對象無法正常工作。

有人這樣做嗎? 怎么樣?

您能否給出一個示例數據集來運行代碼?

再次檢查之后,我懷疑問題是不是與公式,但與R的轉換data.frameXRJulia ,因為在你的消息,你可以看到, jdata是的代理Dict (字典),而不是一個DataFrame或類似julia事情。 而且,我也(簡短地)簽入了MixedModels ,似乎該程序包無法將Dict作為數據集處理。

的使用JuliaCall有點類似XRJulia但它會[R轉換data.framejulia DataFrame 在您的示例中使用XRJulia對我來說似乎還可以。 因此,這適用於JuliaCall但不適XRJulia也意味着問題出在data.frameXRJulia的轉換中。

可能是XRJulia當前缺乏在R中轉換data.frame的能力。如果是這種情況,我可以想到兩種(理論上)解決問題的方法,第一種是將數據集直接讀取為julia一個DataFrame ,另一個是在jlmerj函數中將Dict轉換為DataFrame 如果給出了示例數據集,我可以在數據集中嘗試解決方案。

順便說一句, MixedModels作者與我談到了使用JuliaCall基於MixedModels構建R包的可能性,如果發生這種情況,我認為嘗試使用R的MixedModels容易MixedModels

更新1:有關在XRJulia為特定小型數據XRJulia轉換數據幀的示例

library(XRJulia)
findJulia(test = T) # Works fine
juliaEval("using MixedModels")

juliaEval("using DataFrames")

jlmerj <- juliaEval("
                  function(f,d)
                  m=fit(LinearMixedModel,f,d)
                  return(m)
                  end
                  ")
jlmer <- JuliaFunction(jlmerj)

mindata <- data.frame(IRI_EC = c(15, 14, 27, 0, 22, 16, 23, 17, 20, 26), learnid = factor(1:10))

jfrm <- juliaEval("@formula(IRI_EC ~  1 + (1|learnid))")

jIRI_EC <- juliaSend(mindata$IRI_EC) ## send columns one by one
## first convert factors to integers and convert back in julia
jlearnid <- juliaCall("CategoricalArrays.CategoricalArray", juliaSend(as.integer(mindata$learnid))

## combine columns to create dataframe in julia
jdata <- juliaEval(paste0('DataFrame(Dict([(:IRI_EC,', juliaName(jIRI_EC),
                          '), (:learnid, ', juliaName(jlearnid), ')]))'))

res <- jlmer(jfrm,jdata)

res

暫無
暫無

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

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