future361
通常做多元线形回归的时候,都是一个response,lm(y~x1+x2+x3...,data=***)。但是对于有很多response以及很多x的时候,这样的表达就非常麻烦。
在“pls”的package中,我看到一个data是oliveoil,其中的数据框形式是这样的:
chemical.1 chemical.2 chemical.3 chemical.4 chemical.5 sensory.1 sensory.2
G1 0.73 12.7 1.9 0.139 0.003 21.4 73.4
G2 0.19 12.3 1.678 0.116 -0.004 23.4 66.3
G3 0.26 10.3 1.629 0.116 -0.005 32.7 53.5
G4 0.67 13.7 1.701 0.168 -0.002 30.2 58.3
G5 0.52 11.2 1.539 0.119 -0.001 51.8 32.5
I1 0.26 18.7 2.117 0.142 0.001 40.7 42.9
I2 0.24 15.3 1.891 0.116 0 53.8 30.4
I3 0.3 18.5 1.908 0.125 0.001 26.4 66.5
I4 0.35 15.6 1.824 0.104 0 65.7 12.1
I5 0.19 19.4 2.222 0.158 -0.003 45 31.9
S1 0.15 10.5 1.522 0.116 -0.004 70.9 12.2
S2 0.16 8.14 1.527 0.1063 -0.002 73.5 9.7
S3 0.27 12.5 1.555 0.093 -0.002 68.1 12
S4 0.16 11 1.573 0.094 -0.003 67.6 13.9
S5 0.24 10.8 1.331 0.085 -0.003 71.4 10.6
S6 0.3 11.4 1.415 0.093 -0.004 71.4 10
sensory.3 sensory.4 sensory.5 sensory.6
G1 10.1 79.7 75.2 50.3
G2 9.8 77.8 68.7 51.7
G3 8.7 82.3 83.2 45.4
G4 12.2 81.1 77.1 47.8
G5 8 72.4 65.3 46.5
I1 20.1 67.7 63.5 52.2
I2 11.5 77.8 77.3 45.2
I3 14.2 78.7 74.6 51.8
I4 10.3 81.6 79.6 48.3
I5 28.4 75.7 72.9 52.8
S1 10.8 87.7 88.1 44.5
S2 8.3 89.9 89.7 42.3
S3 10.8 78.4 75.1 46.4
S4 11.9 84.6 83.8 48.5
S5 10.8 88.1 88.5 46.7
S6 11.4 89.5 88.5 47.2
进行pls回归(语句与lm类似)的时候,直接 plsr(sensory~chemical,data=oliveoil), 也就是给所有的response定义为“sensory”,给所有的x定义成“chemical”。形式简单方便(不用写一堆y1+y2+y3...和x1+x2+x3...这么繁琐了)。
这种数据框的方式对我的计算非常有利,但是我在help里找了很久也不知道这种数据框是怎么生成的,请大师们多多指教,不胜感激!!!
digestive
你是不是这个意思:
将多变量合并为一个多层次的变量?
如果是这样,直接写个程序,将colnames写下来不就可以了?
sink(file = savefile, append = T)
x = read.table(file = datafile, header = T, row.names = 1)
for (j in 1:ncol(x)){
for (i in 1:nrow(x)){
cat (rownames [ i ], "\t", colnames[j], "\t", x[i,j], "\n"
}
}
sink()
yihui
你这个问题一个字符就解决了:.
(但愿这个 .
不会小得看不见)
R里面的 formula 中的 .
可以表示所有变量,比如 lm(y ~ ., data = *)
表示拿 *
中的 y 对剩下的所有变量作回归。
future361
谢大师的方法不错,用.表示所有变量真的很方便
另一个问题是,不光我的数据中变量很多,y也不止一个,是由好多个response组成的。我希望在我的data中,能用一个名字表示所有的response,类似于“oliveoil”中的“sensory” 。希望大师继续赐教!
也谢谢digestive,这个方法可能好使,我正在研究,不是很明白这些语句的意思啊
yihui
只要你有时间,你总可以把程序调教得足够顺手。
cname=paste('V',1:10,sep='')
y=select.list(cname,multi=T)
x=select.list(cname,multi=T)
as.formula(paste(paste(y,collapse='+'),'~',paste(x,collapse='+'),collapse=''))
以上代码仅限Windows下运行。
abel
# 生成8个等长度数值变量
for(v in as.vector(outer(c("x", "y"), 1:4, function(x,y) paste(x,y, sep="")))) assign(v, rnorm(100))
# 使用函数I(){base}
dat <- data.frame(x = I(cbind(x1, x2, x3)), y = I(cbind(y1, y2, y3)))
就能得到你要的情况
我不太知道这个词如何翻译“as is”----> 整体算符函数?可以简单理解为运算的时候把对象当作不可分割整体来对待。
future361
感谢abel的帮助。I()应该是我需要的函数。不过data.frame(I(A),I(B))这种用法好像要求I(A)和I(B)要一样的dimension。
我的数据中应变量y的观测数和自变量x的观测数是不同的,这种情况还能用I()吗?
abel
obs的数量不一致,怎么做plsr呢?好奇的问?
如果是var数量不一样,I()是完全没有问题的
dat <- data.frame(x = I(cbind(x1, x2, x3)), y = I(cbind(y1, y2)))
一样可以搞定
future361
昨天说错了,是obs一样,而var数量不一样。
我是先给所有的response生成了一个数据框y,在给所有的variable生成了一个数据框x,然后定义
dat<-data.frame(I(x),I(y)), 这样的确可以成立一个数据框,但是运算plsr(y~x,3,data=dat)的时候就不行了,说是“错误于model.frame(formula, rownames, variables, varnames, extras, extranames, :
变元'y'的种类(list)不对”
我现在的解决办法是,先分别定义response:y1,y2,y3...然后再y<-I(cbind(y1,y2,y3...))。由于x的var太多,不能这样一一定义。
dat<-data.frame(x,y)
ans<-plsr(y~.,3,data=dat) #还是不能用plsr(y~x,3,data=dat),看来I()必须要cbind一下才能用于plsr 或者lm
不管怎么样,终于能计算了。我这是综合了abel和谢大师两位高手的学习成果,非常感谢两位指教啊