2017-06-19 6 views
1

Ich habe versucht, ein Glm (Poisson mit Log-Link, um genau zu sein) auf einen Datensatz in SparkR passen. Es ist ziemlich groß, und so wird es wahrscheinlich nicht funktionieren, es zu sammeln und Rs eigene glm() zu verwenden. Dies beinhaltet einen Exposure-Term, der als Offset aufgenommen werden muss (Regressor mit bekanntem Koeffizienten - 1 in meinem Fall). Unglücklicherweise funktioniert weder das Hinzufügen eines Offset-Terms in der Formel noch das Übergeben des Spaltennamens (oder der Spalte selbst oder eines numerischen Vektors, der durch Sammeln des Coumms nach dessen Auswahl gebildet wird) - im ersten Fall wird die Formel nicht geparst und in In den anderen Fällen wird der Offset-Term ignoriert - ohne Fehlermeldung. Hier ist ein Beispiel dafür, was ich habe versucht (Ausgänge in den Kommentaren) zu tun:Offset() Begriff in Glm() sparkR 2.1.0 ignoriert?

library(datasets) 
#set up Spark session 
#Sys.setenv(SPARK_HOME = "/usr/share/spark_2.1.0") 
library(SparkR, lib.loc = c(file.path(Sys.getenv("SPARK_HOME"), "R", "lib"))) 
options(scipen = 15, digits = 5) 
sparkR.session(spark.executor.instances = "20", spark.executor.memory = "6g") 
# # Setting default log level to "WARN". 
# # To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel). 
# # 17/06/19 06:33:39 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable 
# # 17/06/19 06:33:40 WARN Utils: Service 'SparkUI' could not bind on port 4040. Attempting port 4041. 
# # 17/06/19 06:34:22 WARN ObjectStore: Failed to get database global_temp, returning NoSuchObjectException 
message(sparkR.conf()$spark.app.id) 
# # application_*************_**** 

#Test glm() in sparkR 
data("iris") 
iris_df = createDataFrame(iris) 
# # Warning messages: 
# # 1: In FUN(X[[i]], ...) : 
# # Use Sepal_Length instead of Sepal.Length as column name 
# # 2: In FUN(X[[i]], ...) : 
# # Use Sepal_Width instead of Sepal.Width as column name 
# # 3: In FUN(X[[i]], ...) : 
# # Use Petal_Length instead of Petal.Length as column name 
# # 4: In FUN(X[[i]], ...) : 
# # Use Petal_Width instead of Petal.Width as column name 
model = glm(Sepal_Length ~ offset(Sepal_Width) + Petal_Length, data = iris_df) 
# # 17/06/19 08:46:47 ERROR RBackendHandler: fit on org.apache.spark.ml.r.GeneralizedLinearRegressionWrapper failed 
# # java.lang.reflect.InvocationTargetException 
# # ...... 
# # Caused by: java.lang.IllegalArgumentException: Could not parse formula: Sepal_Length ~ offset(Sepal_Width) + Petal_Length 
# # at org.apache.spark.ml.feature.RFormulaParser$.parse(RFormulaParser.scala:200) 
# # ...... 
model = glm(Sepal_Length ~ Petal_Length + offset(Sepal_Width), data = iris_df) 
# # (Same error as above) 
# The one below runs. 
model = glm(Sepal_Length ~ Petal_Length, offset = Sepal_Width, data = iris_df, family = gaussian()) 
# # 17/06/19 08:51:21 WARN WeightedLeastSquares: regParam is zero, which might cause numerical instability and overfitting. 
# # 17/06/19 08:51:24 WARN BLAS: Failed to load implementation from: com.github.fommil.netlib.NativeSystemBLAS 
# # 17/06/19 08:51:24 WARN BLAS: Failed to load implementation from: com.github.fommil.netlib.NativeRefBLAS 
# # 17/06/19 08:51:24 WARN LAPACK: Failed to load implementation from: com.github.fommil.netlib.NativeSystemLAPACK 
# # 17/06/19 08:51:24 WARN LAPACK: Failed to load implementation from: com.github.fommil.netlib.NativeRefLAPACK 
summary(model) 
# # Deviance Residuals: 
# # (Note: These are approximate quantiles with relative error <= 0.01) 
# # Min  1Q Median  3Q  Max 
# # -1.24675 -0.30140 -0.01999 0.26700 1.00269 
# # 
# # Coefficients: 
# # Estimate Std. Error t value Pr(>|t|) 
# # (Intercept) 4.3066 0.078389 54.939 0  
# # Petal_Length 0.40892 0.018891 21.646 0  
# # 
# # (Dispersion parameter for gaussian family taken to be 0.1657097) 
# # 
# # Null deviance: 102.168 on 149 degrees of freedom 
# # Residual deviance: 24.525 on 148 degrees of freedom 
# # AIC: 160 
# # 
# # Number of Fisher Scoring iterations: 1 
# (RESULTS ARE SAME AS GLM WITHOUT OFFSET) 

# Results in R: 
model = glm(Sepal.Length ~ Petal.Length, offset = Sepal.Width, data = iris, family = gaussian()) 
summary(model) 
# # Call: 
# # glm(formula = Sepal.Length ~ Petal.Length, family = gaussian(), 
# #  data = iris, offset = Sepal.Width) 
# # 
# # Deviance Residuals: 
# # Min  1Q Median  3Q  Max 
# # -0.93997 -0.27232 -0.02085 0.28576 0.88944 
# # 
# # Coefficients: 
# # Estimate Std. Error t value Pr(>|t|)  
# # (Intercept) 0.85173 0.07098 12.00 <2e-16 *** 
# # Petal.Length 0.51471 0.01711 30.09 <2e-16 *** 
# # --- 
# # Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 
# # 
# # (Dispersion parameter for gaussian family taken to be 0.1358764) 
# # 
# # Null deviance: 143.12 on 149 degrees of freedom 
# # Residual deviance: 20.11 on 148 degrees of freedom 
# # AIC: 130.27 
# # 
# # Number of Fisher Scoring iterations: 2 

#Results in R without offset. Matches SparkR output with and w/o offset. 
model = glm(Sepal.Length ~ Petal.Length, data = iris, family = gaussian()) 
summary(model) 
# # Call: 
# # glm(formula = Sepal.Length ~ Petal.Length, family = gaussian(), 
# #  data = iris) 
# # 
# # Deviance Residuals: 
# # Min  1Q Median  3Q  Max 
# # -1.24675 -0.29657 -0.01515 0.27676 1.00269 
# # 
# # Coefficients: 
# # Estimate Std. Error t value Pr(>|t|)  
# # (Intercept) 4.30660 0.07839 54.94 <2e-16 *** 
# # Petal.Length 0.40892 0.01889 21.65 <2e-16 *** 
# # --- 
# # Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 
# # 
# # (Dispersion parameter for gaussian family taken to be 0.1657097) 
# # 
# # Null deviance: 102.168 on 149 degrees of freedom 
# # Residual deviance: 24.525 on 148 degrees of freedom 
# # AIC: 160.04 
# # 
# # Number of Fisher Scoring iterations: 2 

Hinweis: Die Spark-Version ist 2.1.0 (wie im Code). Von dem, was ich überprüft habe, soll die Implementierung da sein. Außerdem erscheinen die Warnmeldungen nach gl nicht immer, aber das scheint sich nicht auf die Vorgänge auszuwirken.

Mache ich etwas falsch, oder ist der Offset-Begriff nicht in der Glm-Implementierung von Funken verwendet? Wenn es die zweite ist, gibt es eine Problemumgehung, um die gleichen Ergebnisse wie mit einem Offsetterm zu erhalten?

Antwort

1

A Poisson GLM mit Antwort Y und Offset log (K) ist das gleiche wie ein GLM mit Antwort Y/K und Gewichte K.

Beispiel der Versicherungsdatensatzes aus MASS verwenden:

> glm(Claims ~ District + Group + Age, data=Insurance, family=poisson, offset=log(Holders)) 

Call: glm(formula = Claims ~ District + Group + Age, family = poisson, 
    data = Insurance, offset = log(Holders)) 

Coefficients: 
(Intercept) District2 District3 District4  Group.L  Group.Q  Group.C  Age.L  Age.Q  Age.C 
    -1.810508  0.025868  0.038524  0.234205  0.429708  0.004632 -0.029294 -0.394432 -0.000355 -0.016737 

Degrees of Freedom: 63 Total (i.e. Null); 54 Residual 
Null Deviance:  236.3 
Residual Deviance: 51.42 AIC: 388.7 



> glm(Claims/Holders ~ District + Group + Age, data=Insurance, family=quasipoisson, weights=Holders) 

Call: glm(formula = Claims/Holders ~ District + Group + Age, family = quasipoisson, 
    data = Insurance, weights = Holders) 

Coefficients: 
(Intercept) District2 District3 District4  Group.L  Group.Q  Group.C  Age.L  Age.Q  Age.C 
    -1.810508  0.025868  0.038524  0.234205  0.429708  0.004632 -0.029294 -0.394432 -0.000355 -0.016737 

Degrees of Freedom: 63 Total (i.e. Null); 54 Residual 
Null Deviance:  236.3 
Residual Deviance: 51.42 AIC: NA 

(Die quasipoisson Familie soll R über die nichtintegralen Werte schließen, die für die Antwort erkannt wurden.)

Diese Technik sollte auch mit der GLM-Implementierung von Spark verwendet werden können.

Siehe auch a similar question on stats.SE.

+0

Dies sollte funktionieren, aber nicht, wenn Sie 'glm'. Ich habe bereits Upvoted, aber würde es Ihnen etwas ausmachen, die SparkR-Lösung 'spark.glm' und' weightCol' anstelle von 'weight' hinzuzufügen. – zero323

+0

@ zero323 Ich habe die GLM-Implementierung von Spark nicht verwendet. Fühlen Sie sich frei, die notwendigen Informationen hinzuzufügen. –

+0

Scheint nicht mit SparkR zu arbeiten: Fehler in handleErrors (returnStatus, conn): java.lang.IllegalArgumentException: glm_6fa65f4a1164 Parameter Familie gegeben ungültigen Wert Quasipoisson. – user2715583