#r #list #ggplot2 #emmeans
#r #Список #ggplot2 #emmeans
Вопрос:
Я пытаюсь создать фигуру, используя выходные данные emmeans, рисуя линии для 5 уровней фактора. Я бы хотел, чтобы диапазон каждой ленты соответствовал диапазону данных по оси x, в котором встречается этот уровень, а не по всей оси x. т.Е. Некоторые факторы имели данные только в определенных диапазонах оси x, и я не хочу экстраполировать за пределы этих диапазонов.
Текущий код, который экстраполируется по всему диапазону, является:
newdata=emmeans(model, ~x|factor, at=list(factor=levels(data$factor), x=seq(min(data$x), max(data$x), len=100)), type='response') %>% as.data.frame
figure=ggplot(data, aes(y=y, x=x, color=factor, fill=factor))
geom_ribbon(data=newdata, aes(x=x, y=response,ymin=lower.CL, ymax=upper.CL), alpha=0.3, colour = NA)
geom_line(data=newdata, aes(x=x, y=response))
figure
Ответ №1:
С тех пор я нашел громоздкий обходной путь:
#Build dataframes with max and min for each factor
factorvariable.1 <- c("factorvariable.1")
data.factorvariable.1=filter(data, factor %in% factorvariable.1)
factorvariable.1.range=range(data.factorvariable.1$x)%>% as.data.frame
factorvariable.1.range$factor=factorvariable.1
factorvariable.1.range$min.max=c('min','max')
factorvariable.2 <- c("factorvariable.2")
data.factorvariable.2=filter(data, factor %in% factorvariable.2)
factorvariable.2.range=range(data.factorvariable.2$x)%>% as.data.frame
factorvariable.2.range$factor=factorvariable.2
factorvariable.2.range$min.max=c('min','max')
Range=rbind(factorvariable.1.range,factorvariable.2.range)
Range <- spread(Range, min.max, .)
#filter emmeans data by max and min values
newdata=emmeans(model, ~x|factor, at=list(factor=levels(data$factor), x=seq(min(data$x), max(data$x), len=100)), type='response') %>% as.data.frame
newdata=merge(newdata, Range, by="factor")
newdata= newdata%>%filter(x>min)
newdata= newdata%>%filter(x<max)
newdata