我正在关注随机模拟书中的一些R例子,熟悉F#并且不熟悉R -I决定试用R type provider。
今天我遇到了一个代码片段,我无法弄清楚如何通过R类型提供程序执行。
> Nit = c(0,0,0,1,1,1,2,2,2,3,3,3,4,4,4,6,6,6)
> AOB = c(4.26,4.15,4.68,6.08,5.87,6.92,6.87,6.25,6.84,6.34,6.56,6.52,7.39,7.38,7.74,7.76,8.14,7.22)
> AOBm=tapply(AOB,Nit,mean) #means of AOB
> Nitm=tapply(Nit,Nit,mean) #means of Nit
> fitAOB=lm(AOBm∼ns(Nitm,df=2)) #natural spline
相应的F#代码如下所示:
open System
open System.Linq
open RDotNet
open RProvider
open RProvider.``base``
open RProvider.stats
open RProvider.graphics
open RProvider.splines
let mean (l: float seq) = Seq.sum l / float(Seq.length l)
let Nit = [0;0;0;1;1;1;2;2;2;3;3;3;4;4;4;6;6;6]
let AOB = [4.26;4.15;4.68;6.08;5.87;6.92;6.87;6.25;6.84;6.34;6.56;6.52;7.39;7.38;7.74;7.76;8.14;7.22]
let AOBm =
query {
for x in List.zip AOB Nit do
groupBy (snd x) into g
select (g |> Seq.map fst |> mean) }
|> List.ofSeq
namedParams [
"AOBm", AOBm :> obj
"Nitm", Nit.Distinct() :> obj
]
|> R.data_frame
|> fun data -> R.lm(formula="AOBm~ns(Nitm,df=2)", data=data)
但是,当我尝试执行最后一行以适应线性模型时,我得到了异常:
RDotNet.EvaluationException: Error in eval(expr, envir, enclos) : could not find function "ns"
所以我猜我要么必须传入
R.ns(Nit.Distinct(),df=2)
进入我的命名参数...或者我以某种方式应该能够将'splines :: ns'函数加载到当前环境中..或者我以某种方式可以使用R.formula(...)组成公式..然而,到目前为止,我做这些事情的所有尝试都失败了。
那么在使用R类型提供程序拟合线性模型时,如何从公式中的库中调用函数?
答案 0 :(得分:5)
你需要
将library(splines)
添加到您的R代码或
使通话完全合格:splines::ns(...)
但是因为在ns()
对象中使用了Formula
,所以第一种方法更可取。