2017-06-29 11 views
0

データにロジスティック回帰モデルを適合させた後、決定境界をプロットしたい。私はggplotとstat_smooth()関数を使って決定境界線を定義します。しかし、返されたプロットは間違っています。再現性の例は、以下を参照してください:ggplotのstat_smooth()関数でglm決定境界を描画すると間違った行が返される

#----------------------------------------------------------------------------------------------------- 
# CONSTRUCT THE DATA 
#----------------------------------------------------------------------------------------------------- 

X.1_Y.1 <- rnorm(1000, mean = 1.5, sd= 0.3) 

X.2_Y.1 <- rnorm(1000, mean = 1.5, sd= 5) 

X.1_Y.0 <- rnorm(99000, mean = 0, sd = 1) 

X.2_Y.0 <- rnorm(99000, mean = 0, sd = 1) 

data <- data.table(X.1 = c(X.1_Y.1 , X.1_Y.0), 
        X.2 = c(X.2_Y.1 , X.2_Y.0), 
        Y = c(rep(1, 1000) , rep(0, 99000)) 
        ) 


#----------------------------------------------------------------------------------------------------- 
# FIT A LOGISTIC MODEL ON THE DATA 
#----------------------------------------------------------------------------------------------------- 


model <- glm(Y ~ X.1 + X.2, data, family = "binomial") 

summary(model) 

#Call: 
# glm(formula = Y ~ ., family = "binomial", data = data) 

#Deviance Residuals: 
# Min  1Q Median  3Q  Max 
#-1.6603 -0.1194 -0.0679 -0.0384 4.6263 

#Coefficients: 
# Estimate Std. Error z value Pr(>|z|)  
#(Intercept) -6.04055 0.06636 -91.02 <2e-16 *** 
# X.1   1.60828 0.03854 41.73 <2e-16 *** 
# X.2   0.43272 0.01673 25.87 <2e-16 *** 
# --- 
# Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 

#(Dispersion parameter for binomial family taken to be 1) 

#Null deviance: 11200.3 on 99999 degrees of freedom 
#Residual deviance: 8218.5 on 99997 degrees of freedom 
#AIC: 8224.5 


#------------------------------------------------------------------------------------------------------- 
# DEFINE AND DRAW THE DECISION BOUNDARY 
#------------------------------------------------------------------------------------------------------- 

# 0 = -6.04 + 1.61 * X.1 + 0.44 * X2 => X2 = 6.04/0.44 - 1.61/0.44 * X.1 

setDT(data) 


ggplot(data, aes(X.1, X.2, color = as.factor(Y))) + 
    geom_point(alpha = 0.2) + 
    stat_smooth(formula = x.2 ~ 6.04/0.44 - (1.61/0.44) * X.1, color = "blue", size = 2) + 
    coord_equal() + 
    theme_economist() 

を。これは、次のプロットを返す:

enter image description here

を簡単に引かれた線が間違っていることがわかります。 X.1 = 0の場合、X.2は6.04/0.44である必要があります。これは明らかにこのプロットでは当てはまりません。

私のコードが間違っていて、それを修正する方法を教えてください。

あなたのアドバイスは高く評価されます。

答えて

2

グラフに自分でフィットする線をプロットする場合は、stat_smoothを使用しないでください。stat_functionを使用してください。例えば、

ggplot(data, aes(X.1, X.2, color = as.factor(Y))) + 
    geom_point(alpha = 0.2) + 
    stat_function(fun=function(x) {6.04/0.44 - (1.61/0.44) * x}, color = "blue", size = 2) + 
    coord_equal() 
関連する問題