我有一个像这样的数据框
X <- matrix(rexp(30, rate=.1), ncol=5)
Y <- matrix(rexp(6, rate=.1), ncol=1)
mydata <- data.frame(cbind(Y,X))
现在我想用Xm
的每一列更改X的第三列Xm <- matrix(rexp(60, rate=.1), ncol=10)
并进行线性回归并保存X3的sd。如果我想手动完成,我会
X[ , 3] <- Xm[ , 1]
mydata <- data.frame(cbind(Y,X))
fit1 = lm(Y~.,data=mydata)
然后
X[ , 3] <- Xm[ , 2]
mydata <- data.frame(cbind(Y,X))
fit2 = lm(Y~.,data=mydata)
然后
X[ , 3] <- Xm[ , 3]
mydata <- data.frame(cbind(Y,X))
fit3 = lm(Y~.,data=mydata)
.
.
.
etc.
然而,如果我手动完成它需要很长时间而且效率不高。有没有人可以帮助我让它更自动化?
答案 0 :(得分:1)
你可以循环
喜欢
res=lapply(1:ncol(Xm),function(i){
mydata[[3]] <- Xm[ , i] # change 3-rd column of mydata om i-th colomn of Xm
lm(Y~.,data=mydata)
})
其中res
- 您的lm模型列表
如果您只想保存X3标准 你可以这样做吗
res2=lapply(1:ncol(Xm),function(i){
mydata[[3]] <- Xm[ , i]
summary(lm(Y~.,data=mydata))$coefficients["X3","Std. Error"]
})
但在您的示例中,他们都是NaN
答案 1 :(得分:1)
也许还有sapply?
X <- matrix(rexp(30, rate=.1), ncol=5)
Y <- matrix(rexp(6, rate=.1), ncol=1)
mydata <- data.frame(cbind(Y,X))
Xm <- matrix(rexp(60, rate=.1), ncol=10)
sapply(1:ncol(Xm), function(mycol) {
X[ , 3] <- Xm[ , mycol]
mydata <- data.frame(cbind(Y,X))
fit = lm(Y~.,data=mydata)
return(sqrt(diag(vcov(fit))))
}, USE.NAMES = F)
更新1: 根据修改提取标准错误 https://stats.stackexchange.com/questions/17571/how-to-store-the-standard-errors-with-the-lm-function-in-r
答案 2 :(得分:1)
我喜欢plyr包,你想要系数:
myfun = function(x) {
mydata[[3]] <- x
coef(lm(Y ~ ., data = mydata))
}
ldply(as.data.frame(Xm), myfun)