如何通过RSRuby将ts对象传递到R中

3

我在使用RSRuby和R的HoltWinters函数时一直没有成功。您需要如何 1)通过RSRuby创建时间序列对象并2)成功地将其传递给HoltWinters以获得输出?

示例:

@r = RSRuby.instance
=> #<RSRuby:0x106bfe6c0 @proc_table={}, @class_table={}, @default_mode=-1, @cache={"get"=>#<RObj:0x106bfe580>, "helpfun"=>#<RObj:0x106bfd3d8>, "help"=>#<RObj:0x106bfd3d8>, "NaN"=>NaN, "FALSE"=>false, "TRUE"=>true, "F"=>false, "NA"=>-2147483648, "eval"=>#<RObj:0x106bfdf18>, "T"=>true, "parse"=>#<RObj:0x106bfe0d0>}, @caching=true>
@r.assign('mytime',@r.ts(:data => [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34], :frequency => 12, :start => [1993,3], :end => [1995,3]))
=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25]
@r.HoltWinters(@r.mytime)
    RException: Error in decompose(ts(x[1L:wind], start = start(x), frequency = f), seasonal) : 
    time series has no or less than 2 periods

rsruby (0.5.1.1)

R版本2.12.2(2011年2月25日)

平台:x86_64-apple-darwin9.8.0/x86_64(64位)

:编辑:只有一个类似的例子在R中...如果我可以通过RSRuby获得HoltWinters的任何输出(而不是错误),我会非常高兴。

> z <- ts(1:34, frequency = 12, start = c(1993,3), end = c(1995,3))
> z
     Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
1993           1   2   3   4   5   6   7   8   9  10
1994  11  12  13  14  15  16  17  18  19  20  21  22
1995  23  24  25                                    
> HoltWinters(z)
Holt-Winters exponential smoothing with trend and additive seasonal component.

Call:
 HoltWinters(x = z) 

Smoothing parameters:
 alpha:  1 
 beta :  0 
 gamma:  0 

Coefficients:
             [,1]
a    2.500000e+01
b    1.000000e+00
s1  -8.141636e-16
s2  -8.141636e-16
s3   9.621933e-16
s4   2.738550e-15
s5  -8.141636e-16
s6  -8.141636e-16
s7   7.401487e-17
s8  -8.141636e-16
s9   9.621933e-16
s10 -8.141636e-16
s11 -8.141636e-16
s12  9.621933e-16

我从未使用过R,但如果检查等效的R代码是否有效很方便,那么您可能希望这样做。如果等效的R代码有效,则您可能希望在问题中发布该代码。 - Andrew Grimm
在R中添加了一个与RSRuby示例相匹配的示例。希望在使用RSRuby时,HoltWinters除了错误之外还能输出任何其他内容(我在RSRuby中使用的其他几种方法,如t_test都很好用,但不能保证全部)。谢谢。 - Charles
1个回答

3
如果我正确理解了你的问题,你真正需要的是如何使用特定接口的指导。事先声明一下,我没有使用RSRuby,但我确实使用了另一种用于R和Ruby集成的工具。
经过进一步的研究,我发现你真正想要一个时间序列选项......我认为......是的,可以通过使用as.ts(data_frame)函数从数据框轻松地生成它。
http://stat.ethz.ch/R-manual/R-patched/library/stats/html/ts.html 我使用的东西很简单。如果这是一个重大问题,也许这对你有用。
require 'rserve/simpler'
r_object = Rserve::Simpler.new 

接下来我要做的是使用哈希表,其中键对应于数据框列,值为数组,并运行Rserve::Simpler函数Hash.to_dataframe,以便将它们准备好进行转换。

data = Hash.new()#insert data here
datafr = data.to_dataframe
r_object.converse(df: datafr) do 
  %Q{df$time <- strptime(as.character(df$time), "%Y-%m-%d %X")
     df$name <- factor(df$name)
  }
end

这个方法直接在代码块中使用R语言,并能很好地处理一切。我没有尝试过将你特定的问题用这种方法解决,但我知道这个方法可以帮助我从数组中导入时间数据(Ruby的Datetime类),使我能够绘制图表。祝好运!


谢谢您抽出时间来回答。我明天就能测试并在那时再回复。看起来我需要将这个例子改写成RSRuby语法,但它可能有效。 - Charles
@Charles 你有尝试过这个吗?还是最终采用了其他方法?我一直没有听到消息,好奇心快要害死我了! - Ryanmt
嗨@Ryanmt,使用RserverSimpler直接调用R文件并将结果返回到Ruby是否可行? - massinissa
你可以从R控制台执行一个R脚本:source("my_script.R")基本上,你可以从Rserve运行任何任意命令。不过,除非你的R脚本在执行结束时明确返回所有内容,否则你可能需要重写或将R输出定向到文件中,以便捕获所有内容。 - Ryanmt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接