2017-06-13 35 views
1

所以我有这2个变量:如何在Spark Scala中执行ANOVA?

x: 1 0 1 1 0 1 1 0 ... 

y: 4 3 12 9 2 7 23 ... 

以前我可以在R使用此代码进行方差分析:

stats <- anova(lm(as.matrix(y) ~ as.factor(x))) 

,它会给这个结果:

> anova(lm(as.matrix(y) ~ as.factor(x))) 
Analysis of Variance Table 

Response: as.matrix(y) 
       Df Sum Sq Mean Sq F value Pr(>F) 
as.factor(x) 1 2020 2019.99 5.1431 0.02426 * 
Residuals  231 90727 392.76     
--- 
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 

现在我想用Scala代码将这段代码翻译成Spark。这个怎么做?

我已经尝试this API,但我很困惑,因为在该API中只有1个变量作为输入,但anovaR使用2个输入。

我也发现this API,但它似乎是另一个的前身。我很困惑在哪里把xy作为输入。通常我们在API中有依赖于&的独立变量,我们可以在其中放入输入,但我似乎无法在这里找到它。

我的Spark版本是2.1.1。

回答

1

R您需要提供y〜x的映射,其中y是连续的,x是分类变量。这是在你所引用的Spark代码相同的:

val catTuple = spark.sql("select color, price from cars").toDF(colnames: _*).as[CatTuple] 

这里color是绝对的和price是连续可变的。

在你的第二个例子(奇怪的数据结构!)中,你需要提供一个Iterable[RDD[Double]],这意味着你的数据中的每个类别都应该放在一个单独的RDD中。

+0

谢谢你!真的解释!我很好奇,你知道为什么在'R'中我们需要先做线性回归? (如在代码'lm(as.matrix(y)〜as.factor(x))') –

+1

如果你这样做,你正在查看拟合回归模型的ANOVA表。一些更多细节在这里:http://stat.ethz.ch/R-manual/R-patched/library/stats/html/anova.lm.html和这里:https://stats.stackexchange.com/questions/115304 /解释输出从 - ANOVA-时-使用-LM-作为输入 – jamborta