小编Yan*_* Li的帖子

R中的多项式回归 - 对曲线有额外的约束

我知道如何在R中进行基本多项式回归.但是,我只能使用nlslm拟合一条最小化误差的线.

这在大多数情况下都有效,但有时当数据中存在测量间隙时,模型变得非常违反直觉.有没有办法添加额外的约束?

可重复的例子:

我想将模型拟合到以下组成的数据(类似于我的真实数据):

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之间有很大的差距,所以有一个巨大的峰值,没有理由在模型中.(对于我的实际数据,我知道那里没有巨大的峰值)

所以这个案子的问题是:

  • 如何设置本地最大值(166,9.8)?

如果那是不可能的,那么另一种方法是:

  • 如何限制线预测的y值变得大于y = 9.8.

或许还有更好的模型可供使用?(除了分段执行).我的目的是比较图形之间的模型特征.

regression r

11
推荐指数
1
解决办法
1555
查看次数

K-Medoids 真的比 K-Means 更擅长处理异常值吗?(举例说明相反)

K-MedoidsK-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。 …

partitioning r cluster-analysis k-means

5
推荐指数
0
解决办法
824
查看次数

如何根据其他列的排列在数据框中创建新列?

假设我有一个如下所示的数据框:

    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)

我想创建一个新列,根据顶部变量的排列和每个变量分配af类别.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)

r dataframe

4
推荐指数
1
解决办法
127
查看次数

返回一个包含多个列名索引的列表

假设我有以下数据框:

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

当输入列名称向量而不是单个列名称时,我使用的上述两个示例似乎不起作用。

我知道我可以用循环来做到这一点,但是有没有一种方法可以实现更好的性能?

r dataframe

1
推荐指数
1
解决办法
3726
查看次数