我知道如何在R中进行基本多项式回归.但是,我只能使用nls或lm拟合一条最小化误差的线.
这在大多数情况下都有效,但有时当数据中存在测量间隙时,模型变得非常违反直觉.有没有办法添加额外的约束?
可重复的例子:
我想将模型拟合到以下组成的数据(类似于我的真实数据):
x <- c(0, 6, 21, 41, 49, 63, 166)
y <- c(3.3, 4.2, 4.4, 3.6, 4.1, 6.7, 9.8)
df <- data.frame(x, y)
Run Code Online (Sandbox Code Playgroud)
首先,让我们绘制它.
library(ggplot2)
points <- ggplot(df, aes(x,y)) + geom_point(size=4, col='red')
points
Run Code Online (Sandbox Code Playgroud)
看起来如果我们将这些点与一条线连接起来,它会改变方向3次,所以让我们尝试对它进行四次拟合.
lm <- lm(formula = y ~ x + I(x^2) + I(x^3) + I(x^4))
quartic <- function(x) lm$coefficients[5]*x^4 + lm$coefficients[4]*x^3 + lm$coefficients[3]*x^2 + lm$coefficients[2]*x + lm$coefficients[1]
points + stat_function(fun=quartic)
Run Code Online (Sandbox Code Playgroud)
看起来这个模型非常适合这个点...除了,因为我们的数据在63到166之间有很大的差距,所以有一个巨大的峰值,没有理由在模型中.(对于我的实际数据,我知道那里没有巨大的峰值)
所以这个案子的问题是:
如果那是不可能的,那么另一种方法是:
或许还有更好的模型可供使用?(除了分段执行).我的目的是比较图形之间的模型特征.
K-Medoids和K-Means是两种流行的分区聚类方法。我的研究表明,当存在异常值时,K-Medoids 更擅长对数据进行聚类(来源)。这是因为它选择数据点作为聚类中心(并使用曼哈顿距离),而 K-Means 选择任何使平方和最小的中心,因此更容易受到异常值的影响。
这是有道理的,但是当我使用这些方法对虚构数据进行简单测试时,并不表明使用 Medoids 更适合处理异常值,事实上有时更糟。我的问题是:在下面的测试中我哪里出错了?也许我对这些方法有一些根本性的误解。
演示:(参见此处的图片)首先,一些虚构的数据(名为“comp”),它形成了 3 个明显的簇
x <- c(2, 3, 2.4, 1.9, 1.6, 2.3, 1.8, 5, 6, 5, 5.8, 6.1, 5.5, 7.2, 7.5, 8, 7.2, 7.8, 7.3, 6.4)
y <- c(3, 2, 3.1, 2.6, 2.7, 2.9, 2.5, 7, 7, 6.5, 6.4, 6.9, 6.5, 7.5, 7.25, 7, 7.8, 7.5, 8.1, 7)
data.frame(x,y) -> comp
library(ggplot2)
ggplot(comp, aes(x, y)) + geom_point(alpha=.5, size=3, pch = 16)
Run Code Online (Sandbox Code Playgroud)
它与包“vegclust”聚集在一起,它可以执行 K-Means 和 K-Medoids。 …
假设我有一个如下所示的数据框:
var1 var2 var3 var4
a TRUE FALSE TRUE FALSE
b TRUE TRUE TRUE FALSE
c FALSE TRUE FALSE TRUE
d TRUE FALSE FALSE FALSE
e TRUE FALSE TRUE FALSE
f FALSE TRUE FALSE TRUE
Run Code Online (Sandbox Code Playgroud)
我想创建一个新列,根据顶部变量的排列和每个变量分配a给f类别.TRUEFALSE
在这个简化的例子中,结果如下:
var1 var2 var3 var4 category
a TRUE FALSE TRUE FALSE A
b TRUE TRUE TRUE FALSE B
c FALSE TRUE FALSE TRUE C
d TRUE FALSE FALSE FALSE D
e TRUE FALSE TRUE FALSE A
f FALSE …Run Code Online (Sandbox Code Playgroud) 假设我有以下数据框:
df <- data.frame(A = c(1, 2, 3), B = c("a", "b", "c"), C = c(4, 5, 6))
A B C
1 1 a 4
2 2 b 5
3 3 c 6
Run Code Online (Sandbox Code Playgroud)
如果我想知道列的位置,例如 B 列,那么我可以使用:
which(names(df)=="B")
Run Code Online (Sandbox Code Playgroud)
或者
grep("B", names(df))
Run Code Online (Sandbox Code Playgroud)
在这两种情况下,我都得到2,但是如果我想同时知道 A 列和 C 列的位置怎么办?也就是说,我想输入一个列名向量,并获得它们位置的向量。所以,如果我输入"A", "C",结果应该是1 3。
当输入列名称向量而不是单个列名称时,我使用的上述两个示例似乎不起作用。
我知道我可以用循环来做到这一点,但是有没有一种方法可以实现更好的性能?