Можливо, ви хочете слідкувати за Введенням Дугерті в економетрії , можливо, враховуючи наразі, що є змінною, і визначаючи середнє квадратичне відхилення від до . Зауважте, що MSD вимірюється у квадраті одиниць (наприклад, якщо знаходиться у тоді MSD знаходиться у ), тоді як середнє кореневе відхилення знаходиться у вихідній шкалі. Це даєx MSD ( x ) = 1ххxxcmcm2RMSD(x)=√MSD( х ) = 1н∑нi = 1( хi- х¯)2ххсмсм2RMSD( x ) = MSD( х )-------√
Кор( β^O L S0, β^O L S1) = - х¯MSD( х ) + х¯2-----------√
Це повинно допомогти вам побачити, як на кореляцію впливає як середнє значення (зокрема, кореляція між вашим оцінкою нахилу та перехопленням видаляється, якщо змінна по центру), а також її поширенням . (Це розкладання також може зробити асимптотики більш очевидними!)ххх
Я ще раз зазначу важливість цього результату: якщо не має середнього нуля, ми можемо перетворити його, віднімаючи так, щоб він був по центру. Якщо ми помістимо лінію регресії на нахили та оцінки перехоплення є некорельованими - недооцінка в одному не має тенденції створювати заниження або завищення в іншому. Але ця лінія регресії - це просто переклад лінії на регресії! Стандартна помилка перехоплення на - це просто міра невизначеності коли ваша перекладена зміннаˉ х у й - ˉ х у й у й - ˉ х у й - ˉ х = 0 у й = ˉ х у й у й у й = 0хх¯ух - х¯ухух - х¯у^х - х¯= 0; коли цей рядок переведений у вихідне положення, це повертається до стандартної помилки у . Більш загально, стандартна помилка при будь-якому значенні є лише стандартною помилкою перехоплення регресії на відповідно переведеному ; стандартна помилка при , звичайно, є стандартною помилкою перехоплення в оригінальній неперекладеній регресії.у^х = х¯у^хуху^x = 0
Оскільки ми можемо перекласти , у певному сенсі немає нічого особливого щодо а отже, нічого особливого щодо . Трохи задумавшись, те, що я збираюся сказати, працює для при будь-якому значенні , що корисно, якщо ви шукаєте розуміння, наприклад, інтервалі довіри для середніх відповідей з вашої лінії регресії. Однак ми бачили, що у на є щось особливе , бо саме тут виникають помилки у розрахунковій висоті лінії регресії - що, звичайно, оцінюється ух = 0 β 0 у й у й = ˉ х ˉ у β 0 = ˉ у - β 1 ˉ х ˉ у β - х ˉ х < 0 у = ˉ у й = ˉ ххx = 0β^0у^ху^х = х¯у¯- і помилки в оціненому нахилі лінії регресії не мають нічого спільного. Очікуваний перехоплення - і помилки в його оцінці повинні випливати або з оцінки або з оцінки (оскільки ми вважали як не -стохастичний); тепер ми знаємо, що ці два джерела помилки є некорельованими, але алгебраїчно зрозуміло, чому має бути негативна кореляція між передбачуваним нахилом та перехопленням (завищений нахил, як правило, недооцінює перехоплення, доки ), але позитивна кореляція між оцінними перехоплюють і оцінюють середню відповідь приβ^0= у¯−β^1x¯y¯β^1xx¯<0y^=y¯x=x¯. Але можна побачити такі стосунки і без алгебри.
Уявіть оцінену лінію регресії як лінійку. Ця лінійка повинна пройти через . Ми щойно побачили, що в розташуванні цієї лінії є дві, по суті, невизначеності, які я кінестетично візуалізую як невизначеність "смикання" та невизначеність "паралельного ковзання". Перш ніж скрутити лінійку, потримайте її на як шарнір, а потім надайте їй сердечний дзвінок, пов’язаний із вашою невизначеністю у схилі. Лінійка буде мати гарне коливання, більш бурхливо, тому, якщо ви дуже невпевнені в нахилі (дійсно, попередній позитивний нахил цілком може бути негативним, якщо ваша невизначеність велика), але зауважте, що висота лінії регресії при( ˉ x , ˉ y ) x = ˉ x(x¯,y¯)(x¯,y¯)x=x¯не змінюється такий вид невизначеності, і ефект дрогання помітніше, чим далі від середнього вигляду, який ви шукаєте.
Щоб "ковзати" лінійку, міцно стискайте її і зміщуючи її вгору-вниз, дбаючи про те, щоб вона була паралельною початковому положенню - не змінюйте нахил! Наскільки енергійно зміщувати її вгору і вниз залежить від того, наскільки ви невпевнені у висоті лінії регресії, коли вона проходить через середню точку; подумайте, якою була б стандартна помилка перехоплення, якби було переведено так, щоб -ось проходила через середню точку. Крім того, оскільки розрахункова висота лінії регресії тут просто , це також є стандартною помилкою . Зауважимо, що така «невимушена» невизначеність впливає на всі точки регресійної лінії рівним чином, на відміну від «дрангування».y ˉ y ˉ yxyy¯y¯
Ці дві невизначеності застосовуються незалежно (добре, некорельовано, але якщо припустити нормально розподілені умови помилки, то вони повинні бути технічно незалежними), тому на висоту усіх точок на вашій лінії регресії впливає невизначеність "смикання", яка дорівнює нулю при середнє значення і стає гірше від нього, і "ковзаюча" невизначеність, яка однакова скрізь. (Чи можете ви бачити взаємозв'язок з інтервалами довіри регресії, які я обіцяв раніше, особливо, наскільки їх ширина є найменшою на ?) ˉ хy^x¯
Сюди входить невизначеність у при , що по суті означає те, що ми маємо на увазі під стандартною помилкою в . Тепер припустимо, що знаходиться праворуч від ; то скручування графіка до більш високого оціночного схилу має тенденцію зменшити наш передбачуваний перехоплення, оскільки швидкий ескіз виявить. Це негативна кореляція, передбачувана коли додатний. І навпаки, якщо зліва від ви побачите, що більш високий оцінений нахил, як правило, збільшує наш передбачуваний перехоплення, що відповідає позитивному ї=0 β - ˉ х х=0- ˉ хy^x=0β^0x¯x=0 ˉхˉхх=0ˉхˉху-β1ˉхˉуβ0β1ˉх→plusmn∞зUβ0β1∓1−x¯MSD(x)+x¯2√x¯x¯x=0співвідношення ваше рівняння прогнозує, коли від'ємний. Зауважимо, що якщо знаходиться на великій відстані від нуля, екстраполяція регресійної лінії невизначеного градієнта назустріч осі стає все більш нестабільною (амплітуда "дрянки" погіршується від середнього). Помилка "twanging" у терміні значно переважає помилку "ковзання" терміні , тому помилка майже повністю визначається будь-якою помилкою в . Як ви можете легко перевірити алгебраїчно, якщо ми візьмемо без зміни MSD або стандартного відхилення помилокx¯x¯y−β^1x¯y¯β^0β^1x¯→±∞su , кореляція між та має тенденцію до .β^0β^1∓1
Щоб проілюструвати це (Ви можете скористатися правою кнопкою миші на зображенні та зберегти його або переглянути його в повному розмірі на новій вкладці, якщо така опція доступна для вас) Я вирішив розглянути повторні вибірки , де - iid, над фіксованим набором значень з , тому . У цій налаштуваннях існує досить сильна негативна кореляція між передбачуваним нахилом та перехопленням і слабша позитивна кореляція між , оціненою середньою реакцією приu i ∼ N ( 0 , 10 2 ) x ˉ x = 10 E ( ˉ y ) = 25 ˉ y x = ˉ x ˉ y ˉ y ˉ y ˉ y ˉ yyi=5+2xi+uiui∼N(0,102)xx¯=10E(y¯)=25y¯x=x¯, і підрахунок перехоплення. В анімації показано кілька модельованих зразків, із зразком (золотою) регресійною лінією, проведеною через справжню (чорну) лінію регресії. Другий рядок показує, як виглядав би збірник оціночних регресійних ліній, якби помилка була лише в оціненому а схили відповідали справжньому схилу ("помилка ковзання"); тоді, якщо помилка була лише на схилах і відповідала її популяційному значенню (помилка "twanging"); і нарешті, як насправді виглядала колекція оціночних ліній, коли обидва джерела помилок поєднувалися. Вони були кольоровими за розміром фактично оціненого перехопленняy¯y¯(не перехоплення, показані на перших двох графіках, де одне з джерел помилок було усунено) від синього для низьких перехоплювачів до червоного для високих перехоплення. Зауважимо, що лише з кольорів ми бачимо, що зразки з низьким значенням мали тенденцію створювати менші оцінені перехоплення, як і зразки з високими оцінними нахилами. У наступному рядку показано модельоване (гістограма) та теоретичне (нормальна крива) вибіркове розподіл оцінок, а в останньому рядку показано діаграми розсіювання між ними. Поспостерігайте, як немає кореляції між та передбачуваним нахилом, негативна кореляція між передбачуваним перехопленням та нахилом та позитивна кореляція між перехопленням та .y¯y¯y¯
Що MSD робить у знаменнику ? Розширення діапазону значень ви вимірюєте, добре відоме, що дозволяє точніше оцінювати нахил, і інтуїція зрозуміла з ескізу, але це не дозволяє краще оцінити . Я пропоную вам візуалізувати підведення MSD до майже нуля (тобто точки відбору проб лише дуже близько середнього значення ), щоб ваша невпевненість у схилі стала величезною: подумайте про великі гірки, але без зміни вашої невизначеності ковзання. Якщо ваш -ось - це будь-яка відстань від (іншими словами, якщо xˉyxyˉxˉx≠0xMSD(x)→±∞ˉx≠0±1ˉxMSD(x)→0−x¯MSD(x)+x¯2√xy¯xyx¯х¯≠ 0) ви побачите, що невизначеність у вашому перехопленні стає надзвичайно домінуючою помилкою похитування, пов'язаної зі схилом. На противагу цьому, якщо ви збільшите розкид ваших вимірювань , не змінюючи середнього значення, ви значно підвищите точність вашої оцінки схилу і вам потрібно буде взяти до своєї лінії лише найменші батоги. Зараз висота вашого перехоплення переважає ваша невизначеність ковзання, яка не має нічого спільного з вашим прогнозованим нахилом. Це співпадає з алгебраїчним фактом, що кореляція між передбачуваним нахилом та перехопленням має тенденцію до нуля як а, коли , до (знак протилежний знак ) якхMSD( x ) → ± ∞x¯≠0±1x¯MSD(x)→0.
Кореляція оцінок нахилу та перехрестя була функцією як і MSD (або RMSD) , так як збільшується їх відносний внесок? Власне, все, що має значення, - це відношення до RMSD . Геометрична інтуїція полягає в тому, що RMSD дає нам своєрідну "природну одиницю" для ; якщо ми змінимо масштаб використовуючи то це горизонтальна розтяжка, яка залишає передбачуваний перехоплення та незмінним, дає нам новий і множить оцінене нахил за RMSD х ˉ х хххшя=хя/RMSD(х) ° у СКО(ш)=1хСКО(ш) ˉ ш ˉ хx¯xx¯xxxwi=xi/RMSD(x)y¯RMSD(w)=1x. Формула кореляції між новими оцінювачами нахилу та перехоплення складається лише з , що є одним, і , що є відношенням . Оскільки оцінка перехоплення була незмінною, а оцінка нахилу просто помножена на позитивну константу, то кореляція між ними не змінилася: отже, кореляція між початковим нахилом та перехопленням також повинна залежати лише від . Алгебраїчно ми можемо бачити це, розділивши верхню і нижню частину на для отриманняRMSD(w)w¯ˉ xx¯RMSD(x) - ˉ xx¯RMSD(x) СКО(х)Кор( β 0, β 1)=-( ˉ х /СКО(х))−x¯MSD(x)+x¯2√RMSD(x)Corr(β^0,β^1)=−(x¯/RMSD(x))1+(x¯/RMSD(x))2√ .
Щоб знайти кореляцію між та , розгляньте . За білінарності це . Перший член - тоді як другий член, який ми встановили раніше, дорівнював нулю. З цього ми виводимо ˉ у Cov( ββ^0y¯Cov Cov ( ˉ у , ˉ у ) - ˉ х COV ( β 1 , ˉ у ) Var ( ˉ y ) = σ 2 uCov(β^0,y¯)=Cov(y¯−β^1x¯,y¯)CovCov(y¯,y¯)−x¯Cov(β^1,y¯)Var(y¯)=σ2un
Corr(β^0,y¯)=11+(x¯/RMSD(x))2−−−−−−−−−−−−−−−−√
Тож ця кореляція також залежить лише від співвідношення . Зауважте, що квадрати та дорівнюють одному: ми очікуємо цього, оскільки всі варіації вибірки (для фіксованого ) у пояснюється або варіацією або варіацією , і ці джерела варіації є непов'язаними між собою. Ось графік співвідношень відношення . Кор( β 0, & beta ; 1)Corr( β 0, ˉ у )х β 0 β 1 ˉ у ˉ хx¯RMSD(x)Corr(β^0,β^1)Corr(β^0,y¯)xβ^0β^1y¯x¯RMSD(x)
На графіку чітко видно, що коли високий відносно RMSD , помилки в оцінці перехоплення значною мірою пов'язані з помилками в оцінці нахилу, і дві тісно взаємозв’язані, тоді як коли низький щодо RMSD , це - це похибка в оцінці що переважає, і зв'язок між перехопленням і нахилом слабший. Зауважте, що кореляція перехоплення зі схилом є непарною функцією відношення , тому його знак залежить від знаку і дорівнює нулю, якщо , тоді як кореляція перехоплення зˉ x ˉ y ˉ xx¯x¯y¯ˉ х ˉ х =0 ˉ у у ˉ х ˉ х уКор( β 0, ˉ у )=1x¯RMSD(x)x¯x¯=0y¯завжди позитивний і є рівномірною функцією співвідношення, тобто не має значення, яка сторона -осі, що . Кореляції рівні за величиною, якщо - одна RMSD від осі, коли і де знак протилежний знаку . У наведеному вище прикладі моделювання та тому середнє значення становило приблизно RMSD зyx¯x¯yКор(β0,β1)=±1Corr(β^0,y¯)=12√≈0.707ˉхˉх=10СКО(х)≈5,161,93гˉуCorr(β^0,β^1)=±12√≈±0.707x¯x¯=10RMSD(x)≈5.161.93y-ось; при цьому співвідношенні кореляція між перехопленням і нахилом є сильнішою, але кореляція між перехопленням і все ще не є незначною.y¯
Як осторонь, мені подобається думати про формулу стандартної помилки перехоплення,
s.e.(β^OLS0)=s2u(1n+x¯2nMSD(x))−−−−−−−−−−−−−−−−−√
як , і точково для формули стандартної помилки при (використовується для довірчих інтервалів для середньої відповіді, і з яких перехоплення - це лише особливий випадок, як я пояснював раніше через аргумент перекладу),у й=х0sliding error+twanging error−−−−−−−−−−−−−−−−−−−−−−−√y^x=x0
s.e.(y^)=s2u(1n+(x0−x¯)2nMSD(x))−−−−−−−−−−−−−−−−−√
R код сюжетів
require(graphics)
require(grDevices)
require(animation
#This saves a GIF so you may want to change your working directory
#setwd("~/YOURDIRECTORY")
#animation package requires ImageMagick or GraphicsMagick on computer
#See: http://www.inside-r.org/packages/cran/animation/docs/im.convert
#You might only want to run up to the "STATIC PLOTS" section
#The static plot does not save a file, so need to change directory.
#Change as desired
simulations <- 100 #how many samples to draw and regress on
xvalues <- c(2,4,6,8,10,12,14,16,18) #used in all regressions
su <- 10 #standard deviation of error term
beta0 <- 5 #true intercept
beta1 <- 2 #true slope
plotAlpha <- 1/5 #transparency setting for charts
interceptPalette <- colorRampPalette(c(rgb(0,0,1,plotAlpha),
rgb(1,0,0,plotAlpha)), alpha = TRUE)(100) #intercept color range
animationFrames <- 20 #how many samples to include in animation
#Consequences of previous choices
n <- length(xvalues) #sample size
meanX <- mean(xvalues) #same for all regressions
msdX <- sum((xvalues - meanX)^2)/n #Mean Square Deviation
minX <- min(xvalues)
maxX <- max(xvalues)
animationFrames <- min(simulations, animationFrames)
#Theoretical properties of estimators
expectedMeanY <- beta0 + beta1 * meanX
sdMeanY <- su / sqrt(n) #standard deviation of mean of Y (i.e. Y hat at mean x)
sdSlope <- sqrt(su^2 / (n * msdX))
sdIntercept <- sqrt(su^2 * (1/n + meanX^2 / (n * msdX)))
data.df <- data.frame(regression = rep(1:simulations, each=n),
x = rep(xvalues, times = simulations))
data.df$y <- beta0 + beta1*data.df$x + rnorm(n*simulations, mean = 0, sd = su)
regressionOutput <- function(i){ #i is the index of the regression simulation
i.df <- data.df[data.df$regression == i,]
i.lm <- lm(y ~ x, i.df)
return(c(i, mean(i.df$y), coef(summary(i.lm))["x", "Estimate"],
coef(summary(i.lm))["(Intercept)", "Estimate"]))
}
estimates.df <- as.data.frame(t(sapply(1:simulations, regressionOutput)))
colnames(estimates.df) <- c("Regression", "MeanY", "Slope", "Intercept")
perc.rank <- function(x) ceiling(100*rank(x)/length(x))
rank.text <- function(x) ifelse(x < 50, paste("bottom", paste0(x, "%")),
paste("top", paste0(101 - x, "%")))
estimates.df$percMeanY <- perc.rank(estimates.df$MeanY)
estimates.df$percSlope <- perc.rank(estimates.df$Slope)
estimates.df$percIntercept <- perc.rank(estimates.df$Intercept)
estimates.df$percTextMeanY <- paste("Mean Y",
rank.text(estimates.df$percMeanY))
estimates.df$percTextSlope <- paste("Slope",
rank.text(estimates.df$percSlope))
estimates.df$percTextIntercept <- paste("Intercept",
rank.text(estimates.df$percIntercept))
#data frame of extreme points to size plot axes correctly
extremes.df <- data.frame(x = c(min(minX,0), max(maxX,0)),
y = c(min(beta0, min(data.df$y)), max(beta0, max(data.df$y))))
#STATIC PLOTS ONLY
par(mfrow=c(3,3))
#first draw empty plot to reasonable plot size
with(extremes.df, plot(x,y, type="n", main = "Estimated Mean Y"))
invisible(mapply(function(a,b,c) { abline(a, b, col=c) },
estimates.df$Intercept, beta1,
interceptPalette[estimates.df$percIntercept]))
with(extremes.df, plot(x,y, type="n", main = "Estimated Slope"))
invisible(mapply(function(a,b,c) { abline(a, b, col=c) },
expectedMeanY - estimates.df$Slope * meanX, estimates.df$Slope,
interceptPalette[estimates.df$percIntercept]))
with(extremes.df, plot(x,y, type="n", main = "Estimated Intercept"))
invisible(mapply(function(a,b,c) { abline(a, b, col=c) },
estimates.df$Intercept, estimates.df$Slope,
interceptPalette[estimates.df$percIntercept]))
with(estimates.df, hist(MeanY, freq=FALSE, main = "Histogram of Mean Y",
ylim=c(0, 1.3*dnorm(0, mean=0, sd=sdMeanY))))
curve(dnorm(x, mean=expectedMeanY, sd=sdMeanY), lwd=2, add=TRUE)
with(estimates.df, hist(Slope, freq=FALSE,
ylim=c(0, 1.3*dnorm(0, mean=0, sd=sdSlope))))
curve(dnorm(x, mean=beta1, sd=sdSlope), lwd=2, add=TRUE)
with(estimates.df, hist(Intercept, freq=FALSE,
ylim=c(0, 1.3*dnorm(0, mean=0, sd=sdIntercept))))
curve(dnorm(x, mean=beta0, sd=sdIntercept), lwd=2, add=TRUE)
with(estimates.df, plot(MeanY, Slope, pch = 16, col = rgb(0,0,0,plotAlpha),
main = "Scatter of Slope vs Mean Y"))
with(estimates.df, plot(Slope, Intercept, pch = 16, col = rgb(0,0,0,plotAlpha),
main = "Scatter of Intercept vs Slope"))
with(estimates.df, plot(Intercept, MeanY, pch = 16, col = rgb(0,0,0,plotAlpha),
main = "Scatter of Mean Y vs Intercept"))
#ANIMATED PLOTS
makeplot <- function(){for (i in 1:animationFrames) {
par(mfrow=c(4,3))
iMeanY <- estimates.df$MeanY[i]
iSlope <- estimates.df$Slope[i]
iIntercept <- estimates.df$Intercept[i]
with(extremes.df, plot(x,y, type="n", main = paste("Simulated dataset", i)))
with(data.df[data.df$regression==i,], points(x,y))
abline(beta0, beta1, lwd = 2)
abline(iIntercept, iSlope, lwd = 2, col="gold")
plot.new()
title(main = "Parameter Estimates")
text(x=0.5, y=c(0.9, 0.5, 0.1), labels = c(
paste("Mean Y =", round(iMeanY, digits = 2), "True =", expectedMeanY),
paste("Slope =", round(iSlope, digits = 2), "True =", beta1),
paste("Intercept =", round(iIntercept, digits = 2), "True =", beta0)))
plot.new()
title(main = "Percentile Ranks")
with(estimates.df, text(x=0.5, y=c(0.9, 0.5, 0.1),
labels = c(percTextMeanY[i], percTextSlope[i],
percTextIntercept[i])))
#first draw empty plot to reasonable plot size
with(extremes.df, plot(x,y, type="n", main = "Estimated Mean Y"))
invisible(mapply(function(a,b,c) { abline(a, b, col=c) },
estimates.df$Intercept, beta1,
interceptPalette[estimates.df$percIntercept]))
abline(iIntercept, beta1, lwd = 2, col="gold")
with(extremes.df, plot(x,y, type="n", main = "Estimated Slope"))
invisible(mapply(function(a,b,c) { abline(a, b, col=c) },
expectedMeanY - estimates.df$Slope * meanX, estimates.df$Slope,
interceptPalette[estimates.df$percIntercept]))
abline(expectedMeanY - iSlope * meanX, iSlope,
lwd = 2, col="gold")
with(extremes.df, plot(x,y, type="n", main = "Estimated Intercept"))
invisible(mapply(function(a,b,c) { abline(a, b, col=c) },
estimates.df$Intercept, estimates.df$Slope,
interceptPalette[estimates.df$percIntercept]))
abline(iIntercept, iSlope, lwd = 2, col="gold")
with(estimates.df, hist(MeanY, freq=FALSE, main = "Histogram of Mean Y",
ylim=c(0, 1.3*dnorm(0, mean=0, sd=sdMeanY))))
curve(dnorm(x, mean=expectedMeanY, sd=sdMeanY), lwd=2, add=TRUE)
lines(x=c(iMeanY, iMeanY),
y=c(0, dnorm(iMeanY, mean=expectedMeanY, sd=sdMeanY)),
lwd = 2, col = "gold")
with(estimates.df, hist(Slope, freq=FALSE,
ylim=c(0, 1.3*dnorm(0, mean=0, sd=sdSlope))))
curve(dnorm(x, mean=beta1, sd=sdSlope), lwd=2, add=TRUE)
lines(x=c(iSlope, iSlope), y=c(0, dnorm(iSlope, mean=beta1, sd=sdSlope)),
lwd = 2, col = "gold")
with(estimates.df, hist(Intercept, freq=FALSE,
ylim=c(0, 1.3*dnorm(0, mean=0, sd=sdIntercept))))
curve(dnorm(x, mean=beta0, sd=sdIntercept), lwd=2, add=TRUE)
lines(x=c(iIntercept, iIntercept),
y=c(0, dnorm(iIntercept, mean=beta0, sd=sdIntercept)),
lwd = 2, col = "gold")
with(estimates.df, plot(MeanY, Slope, pch = 16, col = rgb(0,0,0,plotAlpha),
main = "Scatter of Slope vs Mean Y"))
points(x = iMeanY, y = iSlope, pch = 16, col = "gold")
with(estimates.df, plot(Slope, Intercept, pch = 16, col = rgb(0,0,0,plotAlpha),
main = "Scatter of Intercept vs Slope"))
points(x = iSlope, y = iIntercept, pch = 16, col = "gold")
with(estimates.df, plot(Intercept, MeanY, pch = 16, col = rgb(0,0,0,plotAlpha),
main = "Scatter of Mean Y vs Intercept"))
points(x = iIntercept, y = iMeanY, pch = 16, col = "gold")
}}
saveGIF(makeplot(), interval = 4, ani.width = 500, ani.height = 600)
Для графіку співвідношення співвідношення до RMSD:x¯
require(ggplot2)
numberOfPoints <- 200
data.df <- data.frame(
ratio = rep(seq(from=-10, to=10, length=numberOfPoints), times=2),
between = rep(c("Slope", "MeanY"), each=numberOfPoints))
data.df$correlation <- with(data.df, ifelse(between=="Slope",
-ratio/sqrt(1+ratio^2),
1/sqrt(1+ratio^2)))
ggplot(data.df, aes(x=ratio, y=correlation, group=factor(between),
colour=factor(between))) +
theme_bw() +
geom_line(size=1.5) +
scale_colour_brewer(name="Correlation between", palette="Set1",
labels=list(expression(hat(beta[0])*" and "*bar(y)),
expression(hat(beta[0])*" and "*hat(beta[1])))) +
theme(legend.key = element_blank()) +
ggtitle(expression("Correlation of intercept estimates with slope and "*bar(y))) +
xlab(expression("Ratio of "*bar(X)/"RMSD(X)")) +
ylab(expression(paste("Correlation")))