gpt4 book ai didi

r - R中的居中变量会阻止预测吗?

转载 作者:行者123 更新时间:2023-12-04 09:26:25 24 4
gpt4 key购买 nike

我最近遇到了一个令人毛骨悚然的事件,在经历了很多痛苦之后,我发现对变量使用 scale() 函数使我无法使用 predict功能。我非常惊讶,像居中变量这样简单的事情会从根本上改变它的类型。我不擅长解释这一点,所以通过运行下面的代码可能更容易理解我的意思。

df = data.frame(
a=runif(100,45,90),
b=runif(100,0,60),
y=runif(100,-30,60)
)

df$a.center=scale(df$a,scale=FALSE)
df$b.center=scale(df$b,scale=FALSE)

m<-lm(y ~ a.center + b.center, data=df)

predict_df = data.frame(
a.center=c(-10,10),
b.center=c(-5,5)
)
predict_df$predicted = predict(m,predict_df)

我得到错误:

Error: variables ‘a.center’, ‘b.center’ were specified with different types from the fit

与此代码相比,它不使用居中变量并且按预期工作:

m2<-lm(y ~ a + b, data=df)
predict_df2 = data.frame(
a=c(-10,10),
b=c(-5,5)
)
predict_df2$predicted = predict(m2,predict_df2)

我还注意到,在执行 str(df) 时,居中的变量下面有一个叫做“attr”的东西:

'data.frame':   100 obs. of  5 variables:
$ a : num 71.4 57.1 83.9 49 65 ...
$ b : num 54.56 16.76 52.43 34.11 2.43 ...
$ y : num -14.1 -20.8 31.3 -23 51.1 ...
$ a.center: num [1:100, 1] 2.51 -11.77 14.96 -19.89 -3.87 ...
..- attr(*, "scaled:center")= num 68.9
$ b.center: num [1:100, 1] 23.31 -14.49 21.18 2.86 -28.82 ...
..- attr(*, "scaled:center")= num 31.3

所以我的问题是:这里到底发生了什么?我应该避免使用 scale 函数吗?有没有简单的解决方法,我在 str(df) 中看到的“attr”是什么?

最佳答案

查看数据框每一列的类,你会发现问题:

> sapply(df, class)
a b y a.center b.center
"numeric" "numeric" "numeric" "matrix" "matrix"

看起来 scale 返回一个矩阵,显然数据框很乐意接受单列矩阵到它的列之一,但是 lm 不考虑一个单列矩阵相当于一个向量。所以这是 3 个边缘案例之间的一种奇怪和不幸的交互。要修复它,请避免使用 scale:

df$a.center <- df$a - mean(df$a)
df$b.center <- df$b - mean(df$b)

或者明确地将结果转换回向量:

df$a.center <- as.vector(scale(df$a,scale=FALSE))
df$b.center <- as.vector(scale(df$b,scale=FALSE))

或者,您可以使用二维矩阵索引符号将 scale 的结果矩阵分配回数据框的列,这是正确的做法:

df[,c("a.center", "b.center")] <- scale(df[,c("a", "b")], scale=FALSE)

之后你应该看到这个:

> sapply(df, class)
a b y a.center b.center
"numeric" "numeric" "numeric" "numeric" "numeric"

并且您对 predict 的调用将会成功。

关于r - R中的居中变量会阻止预测吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36925273/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com