如何在aws emr集群中计算scala spark中的简单单样本t统计量?

e0uiprwp  于 2021-05-17  发布在  Spark
关注(0)|答案(1)|浏览(334)

我是一名数据科学家,对scala还比较陌生。我试图理解scala文档并从任何现有的包中运行t测试。我正在寻找一个虚拟数据集上的示例scala代码,它可以帮助您理解如何理解文档。
我正在aws emr集群环境中使用emr笔记本(基本上是jupyter笔记本)。我试图参考此文档,但显然我无法理解:https://commons.apache.org/proper/commons-math/javadocs/api-3.6/org/apache/commons/math3/stat/inference/ttest.html#ttest()
下面是我尝试过的,对两个具有t-test函数的不同包使用多个load语句。我有好几行的电话 math3.state.inference 包,因为我不完全确定两者之间的差异,并希望确保这一部分不是问题所在。

import org.apache.commons.math3.stat.inference
import org.apache.commons.math3.stat.inference._ // note sure if this means, import all classes/methods/functions
import org.apache.commons.math3.stat.inference.TTest._
import org.apache.commons.math3.stat.inference.TTest

import org.apache.spark.mllib.stat.test

没有错误。

import org.apache.asdf

按预期返回错误。
的文档 math3.state.inference 说有一个 TTest() 构造函数,然后显示一组方法。这是如何告诉我如何使用这些函数/方法/类的?我看到下面的“方法”符合我的要求:

t(double m, double mu, double v, double n)
Computes t test statistic for 1-sample t-test.

但我不知道怎么用。以下是我尝试过的几件事:

inference.t
inference.StudentTTest
test.student
test.TTest
TTest.t
etc.

但我得到如下错误:

An error was encountered:
<console>:42: error: object t is not a member of package org.apache.spark.mllib.stat.test
       test.t

An error was encountered:
<console>:42: error: object TTest is not a member of package org.apache.spark.mllib.stat.test
       test.TTest

...etc.

那么,我该如何解决这些问题/用spark内核在scala中计算一个简单的单样本t统计量呢?关于如何理解文件的任何说明/指导也将有助于长期发展。

b4qexyjb

b4qexyjb1#

计算一个样本t检验的公式很容易实现为udf(用户定义函数)
UDF是我们编写自定义函数以应用于Dataframe的不同行的方式。我假设您可以使用标准groupby和agg函数生成聚合值。

import org.apache.spark.sql.functions.col
import org.apache.spark.sql.functions.udf
import org.apache.spark.sql.expressions.UserDefinedFunction

val data = Seq((310, 40, 300.0, 18.5), (310, 41, 320.0, 14.5)).toDF("mu", "sample_size", "sample_mean", "sample_sd")

+---+-----------+-----------+---------+
| mu|sample_size|sample_mean|sample_sd|
+---+-----------+-----------+---------+
|310|         40|      300.0|     18.5|
|310|         41|      320.0|     14.5|
+---+-----------+-----------+---------+

val testStatisticUdf: UserDefinedFunction = udf {
  (sample_mean: Double, mu:Double, sample_sd:Double, sample_size: Int) => 
    (sample_mean - mu) / (sample_sd / math.sqrt(sample_size.toDouble))
}

val result = data.withColumn("testStatistic", testStatisticUdf(col("sample_mean"), col("mu"), col("sample_sd"), col("sample_size")))

+---+-----------+-----------+---------+-------------------+
| mu|sample_size|sample_mean|sample_sd|      testStatistic|
+---+-----------+-----------+---------+-------------------+
|310|         40|      300.0|     18.5|-3.4186785515333833|
|310|         41|      320.0|     14.5| 4.4159477499536886|
+---+-----------+-----------+---------+-------------------+

相关问题