通过XRJulia将公式从R传递给Julia
我试图通过XRJulia使用R的Julia来拟合一些回归模型。我想把R数据和公式对象传递给Julia。到目前为止,我的情况如下:通过XRJulia将公式从R传递给Julia,r,julia,R,Julia,我试图通过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=JuliaFun
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))")
但此呼叫失败(模糊):
res您能给出一个运行代码的示例数据集吗
再次检查后,我怀疑问题不在于公式,而在于XRJulia
中Rdata.frame
的转换,因为在您的消息中可以看到jdata
是Dict
(字典)的代理,而不是DataFrame
或julia
中类似的东西。我还(简要地)签入了MixedModels
,似乎包无法将Dict
作为数据集处理
JuliaCall
的用法有点类似于XRJulia
,但它会将Rdata.frame
转换为julia
DataFrame
。在您的示例中使用XRJulia
,我觉得还可以。因此,这适用于JuliaCall
但不适用于XRJulia
的事实也意味着问题在于XRJulia
中的数据.frame
的转换
这可能是因为XRJulia
目前缺乏在R中转换data.frame
s的能力。
如果是这种情况,我可以考虑两种(理论上)可能的方法来处理这个问题,第一种是将数据集作为DataFrame
直接读入julia
,另一种是在jlmerj
函数中将Dict
转换为DataFrame
。如果给出了一个示例数据集,我可以在该数据集上尝试解决方案
顺便说一句,MixedModels
的作者与我讨论了使用JuliaCall
基于MixedModels
构建R包的可能性,如果发生这种情况,我认为从R尝试MixedModels
会容易得多
更新1:关于在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
库(XRJulia)
findJulia(test=T)#工作正常
juliaEval(“使用混合模型”)
juliaEval(“使用数据帧”)
嗨,我是朱利亚卡尔的作者。据我所知,JuliaCall确实从函数返回julia对象,并尝试将julia对象转换为R对象;在自动转换失败的情况下,返回julia对象的包装器,非常类似于XRJulia中的julia代理对象。唯一的区别是,XRJulia以非常简洁的形式显示julia代理对象,JuliaCall提供了非常详细的信息,因此可能这就是为什么您认为JuliaCall只打印结果的原因?您可以使用julia函数从返回的对象提取信息,也可以使用JuliaCall提供的一些实用程序函数提取信息一些简单情况下的信息。顺便说一句,我不太熟悉MixedModels包。您能提供一些数据集和您在JuliaCall中使用的命令供我检查吗?谢谢。对不起,我不太清楚。是的,JuliaCall确实返回一个Julia对象或包装器,我已经能够从中提取一些东西-我认为问题在于MixedModels没有很好地记录其返回值,因此很难从中了解我想要的东西(它有各种提取程序,但有些还没有达到它所能适应的模型的全部功能)。因此,关于朱利亚卡尔的问题(这真是令人惊讶)很可能是没有意义的。也就是说,我真的很好奇如何将公式传递给XRJulia中的函数。这是一个产生相同结果的最小数据集:这是一个产生相同结果的最小数据集:Minda我尝试将R数据帧转换为julia数据帧并成功,但是这个过程并不容易,而且专门针对这个简化的数据集,这有点难以推广。你可以看到我更新后的帖子。我想最好是直接把数据读给朱莉娅。哇,那是。。。有趣。这是朱利亚卡尔的一个很好的论点谢谢你的帮助。
res<-jlmer(jfrm,jdata)
Error: Evaluating Julia expression: R_1_7(R_1_9, R_1_29)
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