我有2000株小麦,在40天的时间里生长。我想对每个对象执行coeff函数,以求出三个时间点产生的二次方程的系数。(a、b和c)
(1) coef(lm(y~poly(x,2,raw=TRUE))函数的工作方式与我所希望的完全一致。
(2)然而,由于数据的显示方式,需要手动设置x和y。
(3)因此,我融化了我的数据,并订购了它。
(4)我想做一个循环,把前三列的“日”设为x,然后把前三列的“高度”设为y。
那么我想要执行coeff函数。
最后,我希望它显示我需要的系数输出,最好是在一个新的数据表中。
然后,每三行重复,代表每个小麦ID,所有小麦植株。
1)这个函数工作,给我系数: a,b,c
x<-c(1,2,3)
y<-c(1,10,4)
coef(lm(y~poly(x,2,raw=TRUE)))2)这就是我最初的数据
A = matrix(c(5, 4, 2, 10, 10, 4, 5, 15, 6),nrow=3, ncol=3)
colnames(A)<-c("10", "25", "40")
rownames(A)<-c("Wheat 1", "Wheat 2", "Wheat 3")
A3)这是我的熔解格式
A.melted<-as.data.frame(melt(A, id.vars="ID"))
A.melted<-A.melted[with(A.melted,order(Var1)),]
colnames(A.melted) <- c("WheatID", "Day", "Height")
A.melted$Day<-as.numeric(as.character(A.melted$Day))
A.melted4)这就是我想用我的循环做的.
x<-A.melted[,2]y<-A.melted[,3]coef(lm(y~poly(x,2,raw=TRUE)))我只是不熟悉循环的语法,我喜欢任何提示和建议。仔细阅读谷歌告诉我,一个人不应该做循环,除非它是绝对必要的,因为我可能会遇到更多的问题-因此,我是开放的非循环技术以及。
发布于 2019-07-05 22:25:28
如果您想在一个循环中这样做,请尝试以下操作。关键的部分是使用seq和一个by =参数来让索引执行所需的步骤。
library(tibble)
df <- tibble(
WheatID = rep(NA_character_, nrow(A)),
Intercept = rep(NA_real_, nrow(A)),
poly1 = rep(NA_real_, nrow(A)),
poly2 = rep(NA_real_, nrow(A))
)
cnt <- 1
for (i in seq(1, nrow(A.melted), by = 3)) {
x <- A.melted$Day[i + 0:2]
y <- A.melted$Height[i + 0:2]
df$WheatID[cnt] <- as.character(A.melted$WheatID[i])
df[cnt, 2:4] <- coef(lm(y~poly(x,2,raw=TRUE)))
cnt <- cnt + 1
}
df注意:我不是data.table的人。因此,我向您提供一个tibble。
发布于 2019-07-05 22:25:14
我们可以在data.table的帮助下完成这一任务,请参阅?data.table
library(data.table)
A.models = A.melted[, model := list(.(lm(Height ~ poly(Day, 2),
data = list(.(.SD[WheatID == .BY[[1]]]))))),
by = WheatID]
A.models[, coefs := list(.(coefficients(model[[1]]))),
by = WheatID]您可以像这样访问每个模型:
A.models[WheatID == "Wheat 1", model[[1]]]甚至
A.models[WheatID == "Wheat 1", summary(model[[1]])]之所以会发生这种情况,是因为data.table引入了J 表达式,而不仅仅是函数。
发布于 2019-07-05 22:39:22
这是您可以用data.table包做的事情。
data.list <- split(A.melted, f = (1:nrow(A.melted) - 1) %/% 3)
coefs <- lapply(data.list, function(x) {
coefs <- coef(lm(Day ~ poly(Height, raw=TRUE), data = x))
data.table(
intercept = coefs[1],
poly.height = coefs[2]
)
})
coefs <- rbindlist(coefs)https://stackoverflow.com/questions/56909459
复制相似问题