【问题标题】:R statistics Package ISLR with RProvider and F#R 统计包 ISLR 与 RProvider 和 F#
【发布时间】:2015-03-26 23:08:15
【问题描述】:

我正在尝试使用 ISLR 包 (http://cran.r-project.org/web/packages/ISLR/index.html)。

是否可以将包与 F# 一起使用? 我找到了 RProvider 1.1.8 (https://www.nuget.org/packages/RProvider/) 并尝试了我的第一个 F# 程序:

open System
open RDotNet
open RProvider
open RProvider.``base``
open RProvider.graphics
open RProvider.stats
// open RProvider.ISLR

let rng = Random()
let rand () = rng.NextDouble()
let X1s = [ for i in 0 .. 9 -> 10. * rand () ]
let X2s = [ for i in 0 .. 9 -> 5. * rand () ]

// Build Ys, following the "true" model
let Ys = [ for i in 0 .. 9 -> 5. + 3. * X1s.[i] - 2. * X2s.[i] + rand () ]

let dataset =
    namedParams [
        "Y", box Ys;
        "X1", box X1s;
        "X2", box X2s; ]
    |> R.data_frame

let result = R.lm(formula = "Y~X1+X2", data = dataset)
R.plot result

这个程序运行完美。但是,当我尝试使用 ISLR(注释掉“open RProvider.stats”)时,F# 抱怨找不到“lm”。 我希望使用 ISLR 的“lm”版本,它应该是 ISLR 的一部分

我的环境是:Visual Studio 2013,RStudio 版本 0.98.1091,ISLR 版本 1.0

任何关于如何将 ISLR 与 F# 一起使用的建议将不胜感激。

【问题讨论】:

  • pkg:ISLR 只是数据集的集合。您需要在使用 Julia 的课程中​​发布指向该材料的链接。
  • 我没有说教授在课程中使用了 Julia,而是他个人使用的。例如参见:github.com/simonster/GLMNet.jl
  • 你说他在 ISLR 包中使用了它……他没有。你提议“将 ISLR 与 F# 一起使用”。你不能……至少在 ISLR 提供编程解决方案的意义上。一旦认识到 pkg:ISLR 的真正含义,这个问题就没有意义了。
  • 我还没有反对,因为我认为您可以将其重写为 RProvider 包的一个非常好的演示。没有ISLR::lm。那只是普通的stats::lm。并提供您自己的答案。然而,与 Julia 的联系似乎非常脆弱。 (请记住,对包裹推荐的请求被视为 OT。)
  • 你是对的。 ISLR 中没有函数。运行 RStudio 几天后,很容易忘记我想要使用的函数是哪个库。我应该做 "open RProvider.e1071" 而不是 "open RProvider.ISLR" 。对困惑感到抱歉。如果您保持打开状态,我将提交 RProvider 包的更好演示。

标签: r f# lm


【解决方案1】:

正如其他人指出的,ISLR 包只包含数据集,您绝对可以通过 R 类型提供程序访问这些数据集。安装软件包后,以下内容对我有用:

#load "packages/RProvider.fsx"
open RProvider
open RProvider.ISLR

R.Wage.Value // One of the data sets from ISLR

您可以使用完整路径探索特定包提供的内容:

RProvider.ISLR.R.Wage.Value

如果您可以在 R 中访问某些内容,但在 F# 中无法访问,那么我们绝对可以解决此问题,但我认为 ISLR 没有问题。值得指出的是,您可能对使用 R provider with Deedle 感兴趣,它可以让您在 R 和 F# 数据帧之间进行互操作。 (安装 FsLab package 包含您需要的所有内容。)

如果您没有安装该软件包,您实际上也可以从 R 提供程序中执行此操作 :-)

open RProvider.utils
R.install_packages("ISLR")

【讨论】:

    【解决方案2】:

    我对 F# 的体验现在持续了 12 小时 23 分 14 秒。哇!作为一个长期的 C# 程序员,这很痛苦。我的工作代码是:

    open System
    open System.Diagnostics
    open RDotNet
    open RProvider
    open RProvider.``base``
    open RProvider.graphics
    open RProvider.stats
    open RProvider.e1071
    
    let x = array2D [ [  0.4992207;  0.83459057 ];
                      [  0.5095988;  0.86535664 ];
                      [ -0.3130123; -0.54000741 ];
                      [  0.7136758;  0.09454017 ];
                      [ -1.0506291; -0.49390571 ];
                      [ -0.7504743;  0.19165412 ];
                      [ -0.3502830; -0.16827662 ];
                      [  0.6202636; -0.03877393 ];
                      [ -0.2169360;  0.03409674 ];
                      [ -0.2485535;  0.68234694 ];
                      [  1.3264276;  1.40061717 ];
                      [  0.6886685;  1.38550956 ];
                      [  2.7057305;  1.52631182 ];
                      [  2.3354574; -0.49779748 ];
                      [ -1.3406379;  2.20544301 ];
                      [  1.2445945; -0.18418390 ];
                      [  0.7721881;  1.53916368 ];
                      [ -0.3640324;  2.32334502 ];
                      [  1.6404738;  1.17708567 ];
                      [ -1.0440209;  1.95016425 ] ]
    
    let y = [| -1; -1; -1; -1; -1; -1; -1; -1; -1; -1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1 |]
    
    let colors = Array.create y.Length 0
    for k=0 to (Array.length y)-1 do colors.[k] <- y.[k] + 3;
    let pch = 19
    
    let status = R.plot(namedParams [ "x", box x; "col", box colors; "pch", box pch; "xlab", box "x[,1]"; "ylab", box "x[,2]"])
    
    let args =
        namedParams [
            "formula", box "y~.";
            "x", box x;
            "y", box y;
            "type", box "C-classification";
            "kernel", box "linear";
            "cost", box 10;
            "scale", box false]
    
    let svmfit = R.svm(args)
    R.print(svmfit) |> ignore
    

    我相信你们会嘲笑我的所作所为;但是,见鬼,我的名誉受到了致命的伤害。

    我还在为一个问题苦苦挣扎。绘制“svm”函数结果的 R 代码如下所示:

    library(e1071)
    df = data.frame(x, y = as.factor(y))
    svmfit = svm(y~., data=df, kernel="linear", cost=10, scale=FALSE)
    print(svmfit)
    plot(svmfit, df)
    

    我的问题是如何转换:plot(svmfit, df)。我试过了:

    let labels = R.as_factor(y)
    let df = 
        namedParams [
            "x", box x;
            "data", box labels ]
        |> R.data_frame
    
    let arg =
        namedParams [
            "formula", box svmfit;
            "data", box df
        ]
    
    R.plot(arg)
    

    但这不起作用。我不知道如何声明“svmfit”。我尝试使用“公式”是不正确的,我不知道在这个领域使用什么。

    顺便说一下,感谢使用“Deedle”的建议。下次我会试试的。

    查尔斯

    【讨论】:

      猜你喜欢
      • 2017-01-13
      • 1970-01-01
      • 2015-08-30
      • 1970-01-01
      • 2011-05-30
      • 2014-12-18
      • 2010-12-15
      • 2014-10-02
      • 1970-01-01
      相关资源
      最近更新 更多