2014-11-02 39 views
7

yılında logit ve probit çizmek nasıl bu neredeyse kesinlikle bir newbish soru/veri kümesi içinggplot2

Ben logit ve başarılı olamadı ggplot2 içinde probit eğrilerini hem çizmek için çalışıyorlar altındadır. Ben safça kullanıyoruz

Ft Temp TD 

    1 66 0 
    6 72 0 
    11 70 1 
    16 75 0 
    21 75 1 
    2 70 1 
    7 73 0 
    12 78 0 
    17 70 0 
    22 76 0 
    3 69 0 
    8 70 0 
    13 67 0 
    18 81 0 
    23 58 1 
    4 68 0 
    9 57 1 
    14 53 1 
    19 76 0 
    5 67 0 
    10 63 1 
    15 67 0 
    20 79 0 

kod aynı grafikte bu iki eğri çizmek amacıyla kodumu ne şekilde artırabileceğini

library(ggplot2) 
    TD<-mydata$TD 
    Temp<-mydata$Temp 
    g<- qplot(Temp,TD)+geom_point()+stat_smooth(method="glm",family="binomial",formula=y~x,col="red") 
    g1<-g+labs(x="Temperature",y="Thermal Distress") 
    g1 
    g2<-g1+stat_smooth(method="glm",family="binomial",link="probit",formula=y~x,add=T) 
    g2 

söyler misiniz nedir?

size

cevap

13

Alternatif bir yaklaşım, kendi tahmin edilen değerlerinizi oluşturmak ve bunları ggplot ile çizmek olacaktır - daha sonra son arsa üzerinde daha fazla kontrole sahip olabilirsiniz. hesaplamalar için stat_smooth belgesine güvenmek; Bu, birden çok değişkeni kullanıyorsanız ve çizim yaparken araçlarında veya modlarında sabit tutmak için özellikle yararlıdır).

:

library(ggplot2) 

# Generate data 
mydata <- data.frame(Ft = c(1, 6, 11, 16, 21, 2, 7, 12, 17, 22, 3, 8, 
          13, 18, 23, 4, 9, 14, 19, 5, 10, 15, 20), 
        Temp = c(66, 72, 70, 75, 75, 70, 73, 78, 70, 76, 69, 70, 
           67, 81, 58, 68, 57, 53, 76, 67, 63, 67, 79), 
        TD = c(0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 
          0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0)) 

# Run logistic regression model 
model <- glm(TD ~ Temp, data=mydata, family=binomial(link="logit")) 

# Create a temporary data frame of hypothetical values 
temp.data <- data.frame(Temp = seq(53, 81, 0.5)) 

# Predict the fitted values given the model and hypothetical data 
predicted.data <- as.data.frame(predict(model, newdata = temp.data, 
             type="link", se=TRUE)) 

# Combine the hypothetical data and predicted values 
new.data <- cbind(temp.data, predicted.data) 

# Calculate confidence intervals 
std <- qnorm(0.95/2 + 0.5) 
new.data$ymin <- model$family$linkinv(new.data$fit - std * new.data$se) 
new.data$ymax <- model$family$linkinv(new.data$fit + std * new.data$se) 
new.data$fit <- model$family$linkinv(new.data$fit) # Rescale to 0-1 

# Plot everything 
p <- ggplot(mydata, aes(x=Temp, y=TD)) 
p + geom_point() + 
    geom_ribbon(data=new.data, aes(y=fit, ymin=ymin, ymax=ymax), alpha=0.5) + 
    geom_line(data=new.data, aes(y=fit)) + 
    labs(x="Temperature", y="Thermal Distress") 

Better single line

Bonus, sadece eğlence için: Kendi tahmin işlevi kullanırsanız modeli Ft farklı düzeylerde nasıl uyduğunu, gösterilmemesi gibi ortak değişkenler ile Çıldırabiliriz

# Alternative, if you want to go crazy 
# Run logistic regression model with two covariates 
model <- glm(TD ~ Temp + Ft, data=mydata, family=binomial(link="logit")) 

# Create a temporary data frame of hypothetical values 
temp.data <- data.frame(Temp = rep(seq(53, 81, 0.5), 2), 
         Ft = c(rep(3, 57), rep(18, 57))) 

# Predict the fitted values given the model and hypothetical data 
predicted.data <- as.data.frame(predict(model, newdata = temp.data, 
             type="link", se=TRUE)) 

# Combine the hypothetical data and predicted values 
new.data <- cbind(temp.data, predicted.data) 

# Calculate confidence intervals 
std <- qnorm(0.95/2 + 0.5) 
new.data$ymin <- model$family$linkinv(new.data$fit - std * new.data$se) 
new.data$ymax <- model$family$linkinv(new.data$fit + std * new.data$se) 
new.data$fit <- model$family$linkinv(new.data$fit) # Rescale to 0-1 

# Plot everything 
p <- ggplot(mydata, aes(x=Temp, y=TD)) 
p + geom_point() + 
    geom_ribbon(data=new.data, aes(y=fit, ymin=ymin, ymax=ymax, 
             fill=as.factor(Ft)), alpha=0.5) + 
    geom_line(data=new.data, aes(y=fit, colour=as.factor(Ft))) + 
    labs(x="Temperature", y="Thermal Distress") 

Better multiple lines

+4

Bu çok şık, ancak 'glm' kullanmak yerine kendi (Normal-tabanlı) güven aralıkları kurarak, (0,1) aralığını aşan güven aralıkları alıyorsunuz, bu da OP'nin ne istediği * değil. .. –

+0

İyi nokta. Hadgon'un ggplot'taki yaklaşımını takip ederek, bağlantı fonksiyonunu kullanarak tahmin edip cevaplama ölçeğine dönüştürdüm. Şimdi her şey yolunda. – Andrew

+0

Ayrıca, tüm veri çerçeve oluşturma, dplyr ile önemli ölçüde akıcı olabilir, ancak bu yanıt için temel R ile tutuldu. – Andrew

3

Eğer stat_smooth örtüşme kullandığımız bu iki işlevi ederiz. Bu yüzden bu ikisini aynı grafikte göremeyeceğinizi düşünüyorsunuz. Aşağıdakileri çalıştırmak, ikinci satır için mavi bir renge sahip olacak şekilde bunu netleştirecektir. İkinci stat_smooth üzerinde, örneğin bir Poisson glm farklı bir aileyi çalıştırırsanız

library(ggplot2) 
TD<-mydata$TD 
Temp<-mydata$Temp 
g <- qplot(Temp,TD)+geom_point()+stat_smooth(method="glm",family="binomial",formula=y~x,col="red") 
g1<-g+labs(x="Temperature",y="Thermal Distress") 
g1 
g2<-g1+stat_smooth(method="glm",family="binomial",link="probit",formula=y~x,add=T,col='blue') 
g2 

:

library(ggplot2) 
TD<-mydata$TD 
Temp<-mydata$Temp 
g <- qplot(Temp,TD)+geom_point()+stat_smooth(method="glm",family="binomial",formula=y~x,col="red") 
g1<-g+labs(x="Temperature",y="Thermal Distress") 
g1 
g2<-g1+stat_smooth(method="glm",family="poisson",link="log",formula=y~x,add=T,col='blue') 
g2 

O halde gerçekten iki satır çizilir görebilirsiniz:

enter image description here

+0

üslup I 'ggplot (mydata, AES (Sıcaklık T tercih ediyorum D)) + geom_point() + ... 'daha net bir hale getirmek için 'fill =' red'',' fill = 'blue'', ilgili renkteki çizgilere ... log-Poisson ile bir logit-binomialı karşılaştırmak için gerçekten çok mantıklı ... Bence gerçekten "link =" logit "' '' '' '' '' '' '' '' '' '' link '' '' ''… –

+0

@BenBolker Teşekkürler. Benim amacım, kodunun işe yaradığını ve çizdiği iki çizginin örtüştüğünü göstermekti. Bunu yapmanın en kolay yolu, ikinci glm modelini netleştirmek için farklı bir şeye değiştirmek oldu. İki modeli herhangi bir şekilde karşılaştırmaya çalışmıyorum. Log-Poisson ile bir logit-binomialı karşılaştırmaya çalışmıyorum. Ayrıca, evet, stilist olarak grafiğimi daha iyi hale getirmek için 10000 yol var, ancak amacımın netleşmesi için hızlı bir yol istedim. Teşekkürler. – LyzandeR