【发布时间】:2018-08-23 10:59:29
【问题描述】:
基于this topic,我创建了一个函数,该函数通过特定的线性系数返回一个数据集,其中包含与结果 (y) 相关的变量。
simulate_data_regression <- function(sample=10, coefs=0, error=0){
n_var <- length(coefs)
X <- matrix(0, ncol=n_var, nrow=sample)
beta <- as.matrix(coefs)
for (i in 1:n_var){
X[,i] <- scale(rnorm(sample, 0, 1))
}
y <- X %*% beta
if(error != 0){
y <- y + rnorm(sample, 0, error)
}
data = data.frame(X=X)
names(data) <- paste0("V", 1:n_var)
data$y <- as.vector(y)
return(data)
}
data <- simulate_data_regression(sample=50, coefs=c(0.1, 0.8), error=0)
summary(data)
sd(data$V1)
sd(data$y)
效果很好。但是,我需要有一个标准化的y(平均值为 0 和 SD 1)。但是当我尝试缩放它时,系数会发生变化:
data <- simulate_data_regression(sample=50, coefs=c(0.1, 0.8), error=0)
data$y <- as.vector(scale(data$y))
coef(lm(y ~ ., data=data))
有可能做这样的事情吗?非常感谢!
编辑
换句话说,我想要指定为标准化系数的系数(以结果的 SD 表示)。
后验缩放y 将系数更改为1/sd(y)。但是,我想不出任何办法在生成 y 之前更改 beta,以便在缩放 y 后 beta 返回到它们的指定值。
编辑 2:尝试失败
我已尝试运行该函数两次,首先提取sd(y) 并用它缩放系数,希望一旦我缩放y,这些缩放系数将更改为指定的系数。但它不起作用,这是预期的,因为sd(y) 在我更改 coefs 时会发生变化:'(
这是失败的尝试:
simulate_data_regression <- function(sample=10, coefs=0, error=0, standardized=TRUE){
stuff <- .simulate_data_regression(sample=sample, coefs=coefs, error=error)
if(standardized == TRUE){
y_sd <- sd(data$y)
data <- .simulate_data_regression(sample=sample, coefs=y_sd*coefs, error=error, X=stuff$X)$data
data$y <- as.vector(scale(data$y))
} else{
data <- stuff$data
}
return(data)
}
.simulate_data_regression <- function(sample=10, coefs=0, error=0, X=NULL, y=NULL){
n_var <- length(coefs)
if(is.null(X)){
X <- matrix(0, ncol=n_var, nrow=sample)
for (i in 1:n_var){
X[,i] <- scale(rnorm(sample, 0, 1))
}
}
beta <- as.matrix(coefs)
y <- X %*% beta
if(error != 0){
y <- y + rnorm(sample, 0, error)
}
data = data.frame(X=X)
names(data) <- paste0("V", 1:n_var)
data$y <- as.vector(y)
return(list(X=X, y=y, data=data))
}
【问题讨论】:
-
如果您想获得相同的系数,您需要致电
scale(y, scale = FALSE)。 Beta 与位置无关,因此您可以随意居中。但它们对缩放不是不变的,如果你将x1缩放一个因子,那么beta1将乘以1/factor1。 -
有点东西,但是y的缩放实际上是我最需要的(因此指定的coefs实际上是标准化的coefs)......有没有办法生成这种数据?
标签: r dataframe regression simulation linear-regression