Самым простым способом, вероятно, является вычисление вектора значений TRUE/FALSE
, которые указывают, находится ли точка данных внутри доверительного интервала или нет. Я собираюсь немного переставить ваш пример, чтобы все вычисления были завершены до выполнения команд построения графиков - это обеспечивает чистое разделение в логике программы, которая может быть использована, если вы захотите упаковать часть этого в функцию .
Первая часть почти такая же, за исключением того, что я заменил дополнительный вызов lm()
внутри predict()
на переменную severity.lm
- нет необходимости использовать дополнительные вычислительные ресурсы для пересчета линейной модели, когда мы уже хранить это:
## Dataset from
# apsnet.org/education/advancedplantpath/topics/
# RModules/doc1/04_Linear_regression.html
## Disease severity as a function of temperature
# Response variable, disease severity
diseasesev<-c(1.9,3.1,3.3,4.8,5.3,6.1,6.4,7.6,9.8,12.4)
# Predictor variable, (Centigrade)
temperature<-c(2,1,5,5,20,20,23,10,30,25)
## For convenience, the data may be formatted into a dataframe
severity <- as.data.frame(cbind(diseasesev,temperature))
## Fit a linear model for the data and summarize the output from function lm()
severity.lm <- lm(diseasesev~temperature,data=severity)
## Get datapoints predicted by best fit line and confidence bands
## at every 0.01 interval
xRange=data.frame(temperature=seq(min(temperature),max(temperature),0.01))
pred4plot <- predict(
severity.lm,
xRange,
level=0.95,
interval="confidence"
)
Теперь мы рассчитаем доверительные интервалы для исходных точек данных и запустим тест, чтобы определить, находятся ли точки внутри интервала:
modelConfInt <- predict(
severity.lm,
level = 0.95,
interval = "confidence"
)
insideInterval <- modelConfInt[,'lwr'] < severity[['diseasesev']] &
severity[['diseasesev']] < modelConfInt[,'upr']
Затем мы создадим график - сначала высокоуровневую функцию построения plot()
, как вы использовали ее в своем примере, но мы будем строить только точки внутри интервала. Затем мы продолжим работу с функцией низкого уровня points()
, которая отобразит все точки за пределами интервала другим цветом. Наконец, matplot()
будет использоваться для заполнения доверительных интервалов, которые вы использовали. Однако вместо вызова par(new=TRUE)
я предпочитаю передавать аргумент add=TRUE
функциям высокого уровня, чтобы они действовали как функции низкого уровня.
Использование par(new=TRUE)
- это все равно что играть грязную уловку с функцией построения графика, что может привести к непредвиденным последствиям. Аргумент add
предоставляется многими функциями, чтобы заставить их добавлять информацию в график, а не перерисовывать ее - я бы рекомендовал использовать этот аргумент всякий раз, когда это возможно, и использовать манипуляции с par()
в качестве крайней меры.
# Take a look at the data- those points inside the interval
plot(
diseasesev~temperature,
data=severity[ insideInterval,],
xlab="Temperature",
ylab="% Disease Severity",
pch=16,
pty="s",
xlim=c(0,30),
ylim=c(0,30)
)
title(main="Graph of % Disease Severity vs Temperature")
# Add points outside the interval, color differently
points(
diseasesev~temperature,
pch = 16,
col = 'red',
data = severity[ !insideInterval,]
)
# Add regression line and confidence intervals
matplot(
xRange,
pred4plot,
lty=c(1,2,2), #vector of line types and widths
type="l", #type of plot for each column of y
add = TRUE
)