2015-01-01 4 views
1

Я хочу попытаться установить «линию наилучшего соответствия» в R на множество точек. Но я хочу, чтобы каждая точка имела определенный вес, основанный на точности этой точки.Установленная линия, точки данных с различными весами

Мои данные:

x y precision 
4 4 2 
16 18 5 
17 39 4 
29 30 20 
38 38 11 

Так что я хочу, чтобы линия, чтобы соответствовать точек с высокой точностью больше, чем она будет соответствовать точка с меньшей точностью.

Я предполагаю, что это что-то вдоль линий:

abline(lm(y~x+precision)) 

Это не похоже на работу, хотя Большое спасибо

ответ

5

Затем вам нужно использовать weights аргумент в функции lm для этого:

df <- read.table(header=T, text='x y precision 
4 4 2 
16 18 5 
17 39 4 
29 30 20 
38 38 11') 

a <- lm(y ~ x , data=df , weights=precision) 

> a 

Call: 
lm(formula = y ~ x, data = df, weights = precision) 

Coefficients: 
(Intercept)   x 
    10.7895  0.7096 

Как вы можете видеть, это отличается от результата, который вы получили бы, если бы не использовали weights аргумент:

> a <- lm(y ~ x , data=df) 
> a 

Call: 
lm(formula = y ~ x, data = df) 

Coefficients: 
(Intercept)   x 
    7.5893  0.8755 

Таким образом, каждая точка задается удельный вес в зависимости от точности значения.

И именно так вы точно знаете, как работает weights, он реплицирует каждую строку столько раз, сколько вектор определяет (в данном случае точность) вектор weights. т.е.

df2 <- read.table(header=T, text='x y precision 
4 4 2 
4 4 2 
16 18 5 
16 18 5 
16 18 5 
16 18 5 
16 18 5 
17 39 4 
17 39 4 
17 39 4 
17 39 4 
29 30 20 
29 30 20 
29 30 20 
29 30 20 
29 30 20 
29 30 20 
29 30 20 
29 30 20 
29 30 20 
29 30 20 
29 30 20 
29 30 20 
29 30 20 
29 30 20 
29 30 20 
29 30 20 
29 30 20 
29 30 20 
29 30 20 
29 30 20 
38 38 11 
38 38 11 
38 38 11 
38 38 11 
38 38 11 
38 38 11 
38 38 11 
38 38 11 
38 38 11 
38 38 11 
38 38 11') 

b <- lm(y ~ x , data=df2) 

> b 

Call: 
lm(formula = y ~ x, data = df2) 

Coefficients: 
(Intercept)   x 
    10.7895  0.7096 

Как вы можете видеть результат точно такой же, как и применение точности как weights аргумента.

Чтобы вы знали, как работает аргумент weights!

0

Как вы также просите о визуализации этих данных.

abline() необходимо позвонить по телефону: plot(). Это должно быть диаграммой рассеяния x и y, так как иначе строка линии не содержит никакой полезной информации.

Чтобы понять, что ваша линия регрессии основана на взвешенной регрессии, вы можете поместить другую линию для модели с равным весовым коэффициентом и/или размерами точек, зависящими от точности.

Ниже простой пример:

df <- read.table(header=T, text='x y precision 
4 4 2 
16 18 5 
17 39 4 
29 30 20 
38 38 11') 

u <- lm(y ~ x , data=df) 
w <- lm(y ~ x , data=df, weights=precision) 

plot(df$x, df$y, cex=df$precision/max(df$x)*10) 
abline(u, lty=2) 
abline(w) 

Однако, обратите внимание, что использование кругов неодобрением некоторыми, потому что у людей есть проблемы, сравнивая их размеры. Я уверен, что об этом обсуждают stackexchange. Примером этого является «иллюзия Ebbinghaus» (https://en.wikipedia.org/wiki/Ebbinghaus_illusion)

Смежные вопросы