拟合线、不同权重的数据点
Fitted line, data points with different weights
我想尝试将 R 中的 'line of best fit' 拟合到一组点。但我希望每个点都根据该点的精度承载特定的权重。
我的数据是:
x y precision
4 4 2
16 18 5
17 39 4
29 30 20
38 38 11
所以我希望直线更适合精度较高的点,而不是适合精度较低的点。
我猜是这样的:
abline(lm(y~x+precision))
虽然这似乎不起作用
非常感谢
然后你需要在 lm
函数中使用 weights
参数来做到这一点:
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
参数的工作原理!
正如你所问的关于可视化这些。
abline()
需要事先调用 plot()
。这应该是 x 和 y 的散点图,否则只是线图不包含任何有用的信息。
为了可视化您的回归线是基于加权回归的,您可以为具有相同权重的模型放入另一条线and/or使点大小取决于精度。
下面是一个简单的例子:
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 illusion' (https://en.wikipedia.org/wiki/Ebbinghaus_illusion)
我想尝试将 R 中的 'line of best fit' 拟合到一组点。但我希望每个点都根据该点的精度承载特定的权重。
我的数据是:
x y precision
4 4 2
16 18 5
17 39 4
29 30 20
38 38 11
所以我希望直线更适合精度较高的点,而不是适合精度较低的点。
我猜是这样的:
abline(lm(y~x+precision))
虽然这似乎不起作用 非常感谢
然后你需要在 lm
函数中使用 weights
参数来做到这一点:
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
参数的工作原理!
正如你所问的关于可视化这些。
abline()
需要事先调用 plot()
。这应该是 x 和 y 的散点图,否则只是线图不包含任何有用的信息。
为了可视化您的回归线是基于加权回归的,您可以为具有相同权重的模型放入另一条线and/or使点大小取决于精度。
下面是一个简单的例子:
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 illusion' (https://en.wikipedia.org/wiki/Ebbinghaus_illusion)